bzoj 4241 歷史研究

2022-09-19 08:18:13 字數 1249 閱讀 6196

傳送門

傳說中的回滾莫隊。

按左端點所在塊為第一關鍵字,右端點位置為第2關鍵字排序。

分別把左端點在同乙個塊中的詢問一起處理,從這個塊的下乙個塊的第乙個元素開始加,因為右端點單調遞增,只有加元素的操作。

然後對於左邊的部分,對每個詢問暴力加左邊的然後考慮答案就好了。

//

achen

#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*/

view code

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 就是過不了嗎!不爽,蒯個題解,再見...