題目鏈結
1 #include2 #include3 #include4 #include5 #include6 #include7 #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 ...