矩陣第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值域 的時間複雜度解決,多組詢問的話時間不能接受。發現多個詢問的二分...