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 就是過不了嗎!不爽,蒯個題解,再見...