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

2022-06-19 18:39:12 字數 1391 閱讀 2273

矩陣第k小

一道練習整體二分的比較好的題

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

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

唯一不一樣的地方就是需要二維樹狀陣列,這個很好理解吧qwq

複雜度\(o(qlog^3n)\)

code

#include #include #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;

int lowbit(int x)

void add(int x,int y,int s)

int query(int x,int y)

int query_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);

}int main()

; }

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

solve(0,inf,1,cnt);

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

printf("%d\n",ans[i]);

return 0;

}

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

洛谷 P1505 國家集訓隊 旅遊

洛谷傳送門 ray 樂忠於旅遊,這次他來到了 t 城。t 城是乙個水上城市,一共有 nn 個景點,有些景點之間會用一座橋連線。為了方便遊客到達每個景點但又為了節約成本,t 城的任意兩個景點之間有且只有一條路徑。換句話說,t 城中只有 n 1n 1 座橋。ray 發現,有些橋上可以看到美麗的景色,讓人...

國家集訓隊 矩陣乘法

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