Violet 蒲公英 分塊

2021-09-02 07:33:20 字數 1366 閱讀 5546

題解:講道理,關於區間眾數問題應該第乙個就想到分塊,可毒瘤出題人說是線段樹......qaq

考慮查詢的區間 $[l,r]$

第一種情況,我們可以考字首和以及遞推來進行預處理,查詢的時候直接呼叫即可。

第二種情況,我們開乙個桶,將 2 個端點所在不完整塊進行統計,再用乙個 $vector$ 加上中間完整整塊對這些顏色的貢獻即可。

code:

#include#include#include#include#include#include#includeusing namespace std;

void setio(string a)

const int maxn=40000+5;

int n,m,block;

int col[maxn],a[maxn],belong[maxn],bucket[maxn];

int prefix[300][maxn];

int best[300][300];

vectorposition[maxn],solve;

int st(int i)

int ed(int i)

int main()

sort(a+1,a+1+n);

for(int i=1;i<=n;++i)

for(int i=1;i<=belong[n];++i)

for(int j=1;j<=n;++j) prefix[i][j]+=prefix[i-1][j];

for(int length=1;length<=belong[n];++length)

for(int i=1;i+length-1<=belong[n];++i)

if(belong[l] != belong[r])

}int tmp=0,cur=0;

int blockl=belong[l]+1, blockr=belong[r]-1;

if(blockl<=blockr){

cur=best[blockl][blockr], tmp=prefix[blockr][cur]-prefix[blockl-1][cur];

for(int i=0;i=tmp){

if(delta>tmp) tmp=delta,cur=solve[i];

else if(solve[i]=tmp){

if(delta>tmp) tmp=delta, cur=solve[i];

else if(solve[i]

Violet 蒲公英(分塊)

即使是分塊也無法簡單的合併兩個塊的資料,所以我們考慮分塊的本質 暴力,直接維護塊合併後的資訊 用 f i j 表示第i塊到第j塊這一段的眾數,那麼接下來就可以只考慮怎麼加入兩頭的數 考慮暴力求眾數的做法 記錄當前的眾數以及所有數的出現次數,如果新加入的數的出現次數大於眾數,那麼它取代原眾數成為新的眾...

P4168 Violet 蒲公英 分塊

題目鏈結 分塊。p i j 表示第 i 個塊到第 j 個塊內的眾數,預處理出來就好了,列舉 i 和 j 是 o sqrt n 的,列舉 j 塊內的數也是 o sqrt n 的,總複雜度 o n sqrt n sum i h 表示前 i 個塊數字 h 出現的個數,預處理是 o n 的。對於每乙個查詢,...

BZOJ2724 Violet 6 蒲公英 分塊

n 個數,m 次詢問。n leq 40000,m leq 50000 看完題目 呀這不是莫隊裸題嗎?然後經過一波思 forever 考 piano 終於會做了。首先請你自行證明乙個結論 在詢問區間內任取一段子區間,詢問區間內的最小眾數一定是子區間的最小眾數或者出現在詢問區間除掉子區間的其他地方。於是...