分塊 (查詢區間最小眾數

2022-09-07 19:57:09 字數 1264 閱讀 5879

題目鏈結

1 #include2 #include3 #include4 #include5 #include6 #include

7 #include8 #include9 #include10 #include11 #include12 #include13 #include14 #include

15 #include16

using

namespace

std;

17const

int maxn = 1e5 + 10;18

intn, t, l, r, id, ans;

19int pos[maxn], val[maxn], m[3500][3500

], a[maxn], sum[maxn];

20 mapls;

21 vectorv[maxn];

2223 inline int

read()

2427

while(ch >= '

0' && ch <= '

9')

28return k *f;29}

3031 inline int findy(int a, int l, int

r)32

3536 inline void deal(int

x)3747}

4849

int query(int l,int

r)5062}

6364

else

6571

72for(int i = (pos[r] - 1) * t + 1; i <= r; ++i)

7377}78

return

mx;79}80

81int

main()

8293 a[i] =ls[a[i]];

94v[a[i]].push_back(i); // 將相同值的序號存進vector,此時尋找某值在某區間內的次數就很好找95}

9697

for(int i = 1; i <= n; ++i) pos[i] = (i - 1) / t + 1;98

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

99100

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

101106

return0;

107 }

分塊入門到此就結束了 (撒花撒花

莫隊的版本等我會了再回來補。

分塊 區間眾數(金牌導航 分塊 1)

給出乙個數列,和若干詢問,每個詢問讓你求乙個區間內的眾數 6 3 1 2 3 2 1 2 1 5 3 6 1 51 2 11 n 4 1 04,1 m 5 104 1 a i 10 91 leqslant n leqslant 4 times 10 4,1 leqslant m leqslant 5...

數列分塊入門9 區間眾數

原題 題解 基本題意求 l,r 的最小眾數,對於集合 a,b 顯然 mode a and b 屬於 mode a and b。這樣就可以分塊,預處理f i j 表示i j的眾數。每次查詢時暴力查詢頭尾兩塊的數和中間塊的眾數就可以,關於查詢x在 l,r 出現了幾次,用動態陣列存放x的下標,二分查詢就好...

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 ...