一眼覺得是莫隊,發現刪除不是很好搞,於是上回滾莫隊直接搞過
回滾莫隊用於處理難以刪除但是易於新增(其實易於刪除難以新增也可以,但是沒見過這樣題-_-)的莫隊,排序照常,如果左右端點在同一塊直接暴力,這部分最多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 向別的區間轉移狀態時。有時是刪除。有時是插入。同時需要維護。這類問題需要插入和刪除,以及維護比較快的情況下。才可以實現。回滾莫隊 插入和刪除是互反的操作。對於有些問題。插入和刪除好辦。維護困難。回滾莫隊可以解決 插入維護時困難,或者,刪除維護時困難的問...