整體二分 二維BIT 洛谷 P1527

2021-09-26 08:31:24 字數 1491 閱讀 7902

給出乙個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一遍每乙個物品...