題目連線
很顯然可以想到分塊,用f[i][j]表示塊i到塊j的ans,然後發現答案一定是f[i][j]
或者其他在邊角出現的數字
我們在記下g[i][j]從開頭到塊i中的數字j出現的次數
這樣就每一次就統計邊角數字出現的次數,然後更新答案就好了
(好像莫對也可以做。。。。)
注意每一次查詢時不要memset,會t飛
# include# include# include
# include
# include
using
namespace
std;
typedef
long
long
ll;const
int mn = 100005
;int
n,m,siz;
intbl[mn],b[mn],c[mn],a[mn];
ll f[
405][405];//
塊i到j的答案
int g[405][mn];//
從1到塊i中每個數出現的次數
inttmp[mn],st[mn],top;
void pre(intx)}
ll ask(
int x,int
y)
for(int i=top;i>=1;i--)
tmp[st[i]]=0
;
return
ans;
}else
for(int i=(bl[y]-1)*siz+1;i<=y;i++)
for(int i=top;i>=1;i--)
tmp[st[i]]=0
;
return
ans;
}}int
main()
return0;
}
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 就是過不了嗎!不爽,蒯個題解,再見...