BZOJ4241 歷史研究

2021-07-11 12:33:55 字數 1339 閱讀 3557

一眼覺得是莫隊,發現刪除不是很好搞,於是上回滾莫隊直接搞過

回滾莫隊用於處理難以刪除但是易於新增(其實易於刪除難以新增也可以,但是沒見過這樣題-_-)的莫隊,排序照常,如果左右端點在同一塊直接暴力,這部分最多n sqrt n,否則把左端點在一塊的一起處理,清空莫隊,然後直接令莫隊左端點在塊尾,這部分n sqrtn,右端點照常走,這部分n sqrtn ,左端點每次走的時候記錄更改了哪些量,走到地方記錄完答案把修改回滾回去,這部分也是n sqrtn,所以複雜度還是根號的,但是把刪除乾掉了

#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define maxn 100010

#define maxm 100010

#define inf 1000000000

#define mod 1000000007

#define ll long long

#define eps 1e-8

char xb[1<<15],*xs=xb,*xt=xb;

#define getc() (xs==xt&&(xt=(xs=xb)+fread(xb,1,1<<15,stdin),xs==xt)?0:*xs++)

inline int read()

while(xch>='0'&&xch<='9')

return x*f;

}struct que

while(tpa)

}int main()

sort(tls+1,tls+tln+1);

tls[0]=-inf;

for(i=1;i<=tln;i++)

} for(i=1;i<=n;i++)

siz=sqrt(n);

for(i=1;i<=m;i++)

sort(q+1,q+m+1);

for(i=1;i<=m;i++)

}ans[q[i].num]=ans;

t++;

ans=0;

continue ;

} while(rans)

} while(l>q[i].l)

} ans[q[i].num]=ans;

roolback();

l=siz*q[i].k+1;

} for(i=1;i<=m;i++)

return 0;}/*

5 52 2 2 1 2

4 41 1

3 41 1

1 5*/

bzoj4241 歷史研究

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

bzoj4241 歷史研究

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

BZOJ 4241 歷史研究

藉此學習回滾莫隊。經典的莫隊 對於區間 l r 向別的區間轉移狀態時。有時是刪除。有時是插入。同時需要維護。這類問題需要插入和刪除,以及維護比較快的情況下。才可以實現。回滾莫隊 插入和刪除是互反的操作。對於有些問題。插入和刪除好辦。維護困難。回滾莫隊可以解決 插入維護時困難,或者,刪除維護時困難的問...