整體二分 國家集訓隊 矩陣乘法

2021-10-25 04:23:41 字數 2596 閱讀 9640

題目描述

給你乙個 n \times nn×n 的矩陣,不用算矩陣乘法,但是每次詢問乙個子矩形的第 kk 小數。

輸入格式

第一行有兩個整數,分別表示矩陣大小 nn 和詢問組數 qq。

第 22 到第 (n + 1)(n+1) 行,每行 nn 個整數,表示這個矩陣。第 (i + 1)(i+1) 行的第 jj 個數表示矩陣第 ii 行第 jj 列的數 a_a

i,j​

。接下來 qq 行,每行五個整數 x_1, y_1, x_2, y_2, kx1​

,y1​ ,x2​

,y2​ ,k,表示一組詢問,要求找到以 (x_1, y_1)(x1​

,y1​ ) 為左上角,(x_2, y_2)(x2​

,y2​ ) 為右下角的子矩形中的第 kk 小數。

輸出格式

對於每組詢問,輸出一行乙個整數表示答案。

輸入輸出樣例

輸入 #1複製

2 22 1

3 41 2 1 2 1

1 1 2 2 3

輸出 #1複製13

說明/提示

資料規模與約定

對於 20%20% 的資料,保證 n \leq 100n≤100,q \leq 10^3q≤103。

對於 40%40% 的資料,保證 n \leq 300n≤300,q \leq 10^4q≤104。

對於 60%60% 的資料,保證 n \leq 400n≤400,q \leq 3 \times 10^4q≤3×104。

對於 100%100% 的資料,保證 1 \leq n \leq 5001≤n≤500,1 \leq q \leq 6 \times 10^41≤q≤6×10

4,0 \leq a_ \leq 10^90≤a

i,j​

≤109

。這道題把序列查詢區間第kk大搬到了矩陣上,但是仍然滿足二分性質,所以我們還是可以整體二分

而我們沿用序列上的做法,把點和詢問都離線下來,揉在一起整體二分

唯一不一樣的地方就是需要二維樹狀陣列

#include

const

int n =

500;

const

int m =

6e4;

const

int n2 =

250000

;const

int inf =

1e9;

using

namespace std;

struct node

q[m + n2 +5]

,q1[m + n2 +5]

,q2[m + n2 +5]

;int n,m,a[n +5]

[n +5]

,ans[m +5]

,c[n +5]

[n +5]

,cnt;

intlowbit

(int x)

void

add(

int x,

int y,

int s)

intquery

(int x,

int y)

intquery_sum

(int x1,

int y1,

int x2,

int y2)

void

solve

(int l,

int r,

int l,

int r)

int mid = l + r >>

1,cnt1 =

0,cnt2 =0;

for(

int i = l;i <= r;i++)if

(q[i]

.id ==0)

else

q2[++cnt2]

= q[i];}

else

}for

(int i =

1;i <= cnt1;i++)if

(q1[i]

.id ==0)

add(q1[i]

.x1,q1[i]

.y1,-1

);for(

int i = l;i <= l + cnt1 -

1;i++

) q[i]

= q1[i - l +1]

;for

(int i = l + cnt1;i <= r;i++

) q[i]

= q2[i - l - cnt1 +1]

;solve

(l,mid,l,l + cnt1 -1)

;solve

(mid +

1,r,l + cnt1,r);}

intmain()

;}for(

int i =

1;i <= m;i++

)solve(0

,inf,

1,cnt)

;for

(int i =

1;i <= m;i++

)printf

("%d\n"

,ans[i]);

return0;

}

國家集訓隊 矩陣乘法

洛谷 p1527 這是一道整體二分的經典題目。這道題顯然可以給每個詢問二分答案,統計該詢問矩陣中小於等於mid的元素個數。如果大於等於k,說明猜大了,否則說明猜小了。如果用這種方法的話,對於每個詢問都至少要用o 詢問矩陣大小 log值域 的時間複雜度解決,多組詢問的話時間不能接受。發現多個詢問的二分...

Luogu P1527 國家集訓隊 矩陣乘法

給定乙個 n n n times n n n 的矩陣,對於 q qq 組 x1,y1,x 2,y2 k x1,y1,x2,y2,k x1,y1,x2,y 2,k,你需要求出該子矩陣內的第 k kk 大的值。資料範圍1 n 500,1 q 60000 1 leqslant n leqslant 500...

洛谷 P1527 國家集訓隊 矩陣乘法

矩陣第k小 一道練習整體二分的比較好的題 這道題把序列查詢區間第 k 小搬到了矩陣上,但是仍然滿足二分性質,所以我們還是可以整體二分 而我們沿用序列上的做法,把點和詢問都離線下來,揉在一起整體二分 唯一不一樣的地方就是需要二維樹狀陣列,這個很好理解吧qwq 複雜度 o qlog 3n code in...