題解:
這種東西想想也感覺線段樹之類的很難維護,所以就用相對更暴力、功能更強的分塊。
因為眾數不具有區間可加性,所以用樹狀陣列或者線段樹維護就十分困難。我們可以採用分塊演算法。
把序列a分成t塊,每塊長度l=n/t
對於每個詢問[l,r],設l處於第p塊,r處於第q塊。把區間[l,r]分成三部分
1.開頭不足一整段的[l,l)
2.第p+1~q-1塊構成的區間[l,r]
3.結尾不足一整段的(r,r]
a序列在區間[l,r]的眾數隻可能來自:
1.區間[l,r]的眾數
2.出現在[l,l)和(r,r]之間的數。
**:
#include#include#include#includeusing namespace std;
const int n=4e4+10;
int n,m,t,len,sz,ans,l,r,cnt,num;
int a[n],b[n],f[n],st[40],ed[40],c[40][40][n],f[40][40],d[40][40];
//c[i][j][k]表示以段邊界為端點的區間[i,j]中排名為k的數的出現次數
//d[i][j]表示i段到j段的眾數排名
//f[i][j]表示i段到j段的眾數出現次數
void init()
for(int i=t;i;i--)if(y>=st[i])
if(l+1<=r-1)l=l+1,r=r-1;else l=r=0;
cnt=f[l][r],num=d[l][r];
if(l==r)
else
return b[num];
}int main()
return 0;
}
bzoj 2724 蒲公英(分塊)
傳送門biu 分塊,預處理f i,j 為第i塊到第j塊的眾數。每次查詢區間眾數時,可能作為答案的種類只有完整的塊中的眾數和不完整的塊中的數最多2 n 1 種。二分求一下區間中出現的次數就可以了。include using namespace std int n,m,lastans,p int blo...
BZOJ2724 蒲公英 題解(分塊 區間眾數)
題目鏈結 題目大意 給定一段長度為 n 的序列和 m 次詢問,每次詢問區間 l,r 內的最小的眾數。n leq 40000,a i leq 10 9 因為 a i leq 10 9 顯然不能開那麼大的陣列。所以要離散化。對於離散化後的陣列,我們維護兩個值 sum i j 和 p i j sum i ...
BZOJ 2724 分塊統計
區間眾數 先離散化,學到了lagoon的lower bound unique的離散化,比我寫的簡單多了 預處理分成sqrt n 塊,記錄d i j 和p i j 分別表示從i塊起始位置到j塊終止位置的眾數出現次數和這個數是誰 開乙個陣列,記錄每個數的位置,使得同類的相鄰,同類數的座標公升序排列。對於...