傳送門
傳說中的回滾莫隊。
按左端點所在塊為第一關鍵字,右端點位置為第2關鍵字排序。
分別把左端點在同乙個塊中的詢問一起處理,從這個塊的下乙個塊的第乙個元素開始加,因為右端點單調遞增,只有加元素的操作。
然後對於左邊的部分,對每個詢問暴力加左邊的然後考慮答案就好了。
//view codeachen
#include#include
#include
#include
#include
#include
#include
#include
#include
const
int n=1e5+7
;typedef
long
long
ll;using
namespace
std;
intn,m,col[n],ls[n],bl[n],kk,sz;
ll ans[n];
template
void read(t &x)
struct
node
}qs[n];
intcnt[n],lz[n];
ll ansnow=-1
;void add(int x,int
id)
inttpc[n],vis[n],tot;
ll tpadd(
int l,int r,int
id)
return
tpans;
}void
solve()
} int
main()
sort(ls+1,ls+n+1
); sz=unique(ls+1,ls+n+1)-(ls+1
);
for(int i=1;i<=n;i++)
col[i]=lower_bound(ls+1,ls+sz+1,col[i])-ls;
for(int i=1;i<=m;i++)
sort(qs+1,qs+m+1
); solve();
for(int i=1;i<=m;i++) printf("
%lld\n
",ans[i]);
return0;
}/*5 59 8 7 8 9
1 23 4
4 41 4
2 4*/
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 就是過不了嗎!不爽,蒯個題解,再見...