bzoj4241 歷史研究

2022-05-02 05:27:09 字數 2268 閱讀 8496

ioi國歷史研究的第一人——joi教授,最近獲得了乙份被認為是古代ioi國的住民寫下的日記。joi教授為了通過這份日記來研究古代ioi國的生活,開始著手調查日記中記載的事件。

日記中記錄了連續n天發生的時間,大約每天發生一件。

事件有種類之分。第i天(1<=i<=n)發生的事件的種類用乙個整數xi表示,xi越大,事件的規模就越大。

joi教授決定用如下的方法分析這些日記:

1. 選擇日記中連續的一些天作為分析的時間段

2. 事件種類t的重要度為t*(這段時間內重要度為t的事件數)

3. 計算出所有事件種類的重要度,輸出其中的最大值

現在你被要求製作乙個幫助教授分析的程式,每次給出分析的區間,你需要輸出重要度的最大值。

第一行兩個空格分隔的整數n和q,表示日記一共記錄了n天,詢問有q次。

接下來一行n個空格分隔的整數x1...xn,xi表示第i天發生的事件的種類

接下來q行,第i行(1<=i<=q)有兩個空格分隔整數ai和bi,表示第i次詢問的區間為[ai,bi]。

輸出q行,第i行(1<=i<=q)乙個整數,表示第i次詢問的最大重要度

5 59 8 7 8 9

1 23 4

4 41 4

2 4988

1616

1<=n<=10^5

1<=q<=10^5

1<=xi<=10^9 (1<=i<=n)

正解:分塊。

一開始看錯題,覺得這題好水。。然後花20分鐘寫了個錯的。。不過看清題以後好像還是很水啊。。

我們記錄兩個東西,$w[i][j]$表示前$i$個塊內$j$出現的次數,這個可以在$o(n\sqrt)$的時間內用字首和解決。

$f[i][j]$表示第$i$個塊到第$j$個塊的重要度最大值,因為指標往後移動時,最大值只會越來越大,所以這個也可以根據單調性在$o(n\sqrt)$的時間內解決。

然後我們就可以愉快地查詢了。如果$l$和$r$在同乙個塊,那麼我們直接暴力搞搞。

如果$l$和$r$不在同乙個塊,那麼我們就要先把$l$的後乙個塊和$r$的前乙個塊的最大值取出來。然後指標從$r$所在的塊的右端點往左移,更新最大值;指標再從$l$所在的塊的左端點往右移,更新最大值。

於是我們就完美地解決了這道題。

1

//it is made by wfj_2048~

2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include

14#define inf (1<<30)

15#define n (100010)

16#define il inline

17#define rg register

18#define ll long long

19#define file(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)

2021

using

namespace

std;

2223

//w[i][j]表示前i個塊j事件個數,字首和o(nsqrt(n))

24//

f[i][j]表示第i個塊到j個塊重要度最值,單調掃掃o(nsqrt(n))

2526

int w[320

][n],a[n],bl[n],ll[n],rr[n],n,q,tot,totb,block;

27 ll f[320][320

],c[n],hsh[n],ans;

2829 il int

gi()

3637 il void

work()

43 sort(hsh+1,hsh+tot+1),tot=unique(hsh+1,hsh+tot+1)-hsh-1;44

for (rg int i=1;i<=n;++i) a[i]=lower_bound(hsh+1,hsh+tot+1,a[i])-hsh;

45for (rg int i=1;i<=totb;++i)53}

54 rg int l,r; memset(c,0,sizeof

(c));

55while (q--) else

69 printf("

%lld\n

",ans);70}

71return;72

}7374int

main()

bzoj4241 歷史研究

這題也是坑了好久 之前whx帶我刷joi的時候本來應該要做的。可是太懶沒有寫。區間詢問加權眾數。分塊,預處理出塊和塊之間的答案,記錄到第i個塊數字x出現了多少次。然後查詢的時候和普通眾數基本一樣,就是乘了個權值而已。要離散化。時間複雜度o nlogn mn 昨晚寫的常數太爛了。用了struct,陣列...

BZOJ4241 歷史研究

一眼覺得是莫隊,發現刪除不是很好搞,於是上回滾莫隊直接搞過 回滾莫隊用於處理難以刪除但是易於新增 其實易於刪除難以新增也可以,但是沒見過這樣題 的莫隊,排序照常,如果左右端點在同一塊直接暴力,這部分最多n sqrt n,否則把左端點在一塊的一起處理,清空莫隊,然後直接令莫隊左端點在塊尾,這部分n s...

bzoj4241 歷史研究

題目鏈結 看到題目就聯想到了 bzoj2809 apio2012 dispatching。想了想權值分塊 莫隊,發現不好維護塊內最值,又看了看80s的時間,於是怒水一發線段樹 莫隊,結果先wa後tle,不斷tle,無論怎麼改常數都不行,難道nlogn sqrt n 就是過不了嗎!不爽,蒯個題解,再見...