給出乙個500*500的矩陣, 6e4次詢問, 每次詢問乙個子矩陣第k小的數.
將所有的值(修改)和查詢放入陣列, 進行整體二分.
對於當前區間使用二維bit維護任意區域內<=mid的數的個數.
因為整體二分的遞迴只與陣列(q)的下標範圍和答案範圍有關, 所以本題除了把bit換成二維, 其餘是不用更改的.
考慮最後的狀態, 整體二分會將每個修改(賦初值)劃分到下面的小區間, 實際上所有的修改就會變為從小到大有序排列, 每個查詢都只會考慮本區間的貢獻(當然, 左邊的貢獻早已從k中減掉).
**:
int lowbit
(int x)
const int m
=412345
;// 2e5+5
const int inf =
0x3f3f3f3f
;const int maxn =
3005
;int n,q;
int c
[maxn]
[maxn]
;inline void
add(int x, int y, int v)
inline int pre
(int x, int y)
inline int submat
(int x1, int y1, int x2, int y2)
struct node
;node q[m]
, q1[m]
, q2[m]
;int ans[m]
;void
divide
(int ql, int qr, int l, int r)
int mid =
(l + r)
>>1;
int q1sz =
0, q2sz =0;
for(int i = ql; i <= qr;
++i)
else
}for
(int i =
1; i <= q1sz;
++i)
for(int i =
1; i <= q2sz;
++i)
q[q1sz + ql + i -1]
= q2[i]
;divide
(ql, ql + q1sz -
1, l, mid)
;divide
(ql + q1sz, qr, mid +
1, r);}
int main()
;}for(int i =
1; i <=q;
++i);}
divide(1
, cnt,-1
, inf)
;for
(int i =
1; i <=q;
++i)
write
(ans[i]
), enter;
return0;
}
洛谷P1527 矩陣乘法 二維樹狀陣列 整體二分
題目 整體二分,先把所有詢問都存下來 然後二分乙個值,小於它的加到二維樹狀陣列的字首和裡,判斷一遍所有詢問,就分出了這些詢問的答案是否大於這個值 然後分組遞迴下去求解即可 注意加二維樹狀陣列的那個nw是全域性變數,在不同的層中不停調整 二分的範圍最好是mn 1到mx 1,不然有些詢問的ans會沒有賦...
二維陣列二分查詢
牛客網上面練的第一道程式設計題,終於有次百分之百通過了。思路 乙個for迴圈,每一行用個二分查詢,因為題目中陣列是有效的,所以很容易的就朝二分走了 publicclasssolutionelse returnresult publicbooleansearch intright,intleft,in...
二分查詢 洛谷P1094
題目鏈結在這 題目很簡單,演算法也很簡單,我相信沒有人不會做這個題的,但是我為什麼要寫這篇題解呢,因為我被乙個東西坑了將近乙個小時 我太蒻了!看了好多題解都是用兩個指標乙個開頭乙個結尾然後移動,但是我確實一開始就不是這樣想的啊!我蒻!先說思路 sort是肯定要sort的,然後直接for一遍每乙個物品...