莫隊演算法,只考慮對乙個序列加入數字的話,重要度的維護是o(1)的,排完序後的詢問,若左端點是在同一塊中的話,右端點遞增。因為右端點是遞增的因此可以o(1)維護,而左端點的話,對於每個詢問我們可以暴力插入,詢問後還原,對於一次詢問來說是o(sqrtn)的
,因此總複雜度o(nsqrtn)
1 #include2 #include3 #include4#define n 200010
5using
namespace
std;
6int
n,m,i,a[n],b[n],c[n],tot,j,k,o;
7long
long
ans,tmp,ans[n],sum[n];
8int
cur,lim;
9 mapid;
10struct
gq[n];
13bool
cmp(g a,g b)
1419
intmain()
2030
for (i=1;i<=n;i++)
31 c[i]=id[b[i]];
32for (i=1;i<=m;i++)
3337
38 sort(q+1,q+1+m,cmp);
39for (i=1;i<=m;i++)40
55 tmp=ans;
56for (o=q[j].l;o<=min(q[j].r,lim);o++)
5761 ans[q[j].id]=tmp;
62for (o=q[j].l;o<=min(q[j].r,lim);o++)
63 sum[c[o]]--;64}
65 i=k;66}
6768
for (i=1;i<=m;i++)
69 printf("
%lld\n
",ans[i]);
70 }
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 就是過不了嗎!不爽,蒯個題解,再見...