分塊 蒲公英

2022-05-24 14:03:10 字數 1323 閱讀 8325

# include # include # include # include # define maxn 40005

using namespace std;

int rd()

return x;

}// partition section

int a[maxn], blk[maxn], sizb;

int tmplwb[maxn]; // 離散化的輔助陣列

int sum[250][maxn]; // 處理每塊中的顏色字首和

int mod[250][250]; // mod[i][j] 從 i 塊到 j 塊的最小下標的眾數

int cntcol[maxn]; // 用於詢問記錄的桶

void init(int n)

// 字首和處理

int cntb = (n - 1) / sizb + 1; // 塊的個數

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

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

} // 眾數處理

for(int i = 1; i <= cntb; i++)}}

mod[i][j] = maxm;

} }} // 預處理離散化 + 字首和 + 眾數

int query(int l, int r)

for(int i = l; i <= r; i++)

} for(int i = l; i <= r; i++)

return ans;

} // 相鄰塊

for(int i = l; i <= sizb*blk[l]; i++)

for(int i = sizb*(blk[r]-1)+1; i <= r; i++)

ans = mod[blk[l]+1][blk[r]-1];

for(int i = l; i <= sizb*blk[l]; i++)

} for(int i = sizb*(blk[r]-1)+1; i <= r; i++)

} for(int i = l; i <= sizb*blk[l]; i++)

for(int i = sizb*(blk[r]-1)+1; i <= r; i++)

return ans;

}// main function

int main()

init(n);

long long ans = 0; int l = 0, r = 0;

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

return 0;

}

蒲公英 分塊

在鄉下的小路旁種著許多蒲公英,而我們的問題正是與這些蒲公英有關。為了簡化起見,我們把所有的蒲公英看成乙個長度為 n 的序列a1,a2,an,其中ai為乙個正整數,表示第 i 棵蒲公英的種類編號。而每次詢問乙個區間 l,r 你需要回答區間裡出現次數最多的是哪種蒲公英,如果有若干種蒲公英出現次數相同,則...

Violet 蒲公英 分塊

題解 講道理,關於區間眾數問題應該第乙個就想到分塊,可毒瘤出題人說是線段樹.qaq 考慮查詢的區間 l,r 第一種情況,我們可以考字首和以及遞推來進行預處理,查詢的時候直接呼叫即可。第二種情況,我們開乙個桶,將 2 個端點所在不完整塊進行統計,再用乙個 vector 加上中間完整整塊對這些顏色的貢獻...

Violet 蒲公英(分塊)

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