bzoj4241 歷史研究

2022-08-15 04:27:13 字數 1030 閱讀 8839

莫隊演算法,只考慮對乙個序列加入數字的話,重要度的維護是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 就是過不了嗎!不爽,蒯個題解,再見...