BZOJ4241歷史研究題解

2022-05-20 12:08:56 字數 974 閱讀 1694

題目連線

很顯然可以想到分塊,用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 就是過不了嗎!不爽,蒯個題解,再見...