一下子做了兩個題?
題意:乙個問題求區間前k大的和,另乙個問題求矩形內前k大的和。
思路:前乙個問題直接上主席樹+二分搞定
後乙個問題由於資料範圍比較小,用cnt
[i][
j][k
]cnt[i][j][k]
cnt[i]
[j][
k]記錄字首矩形中大於等於k
kk的數有多少個,用pre
[i][
j][k
]pre[i][j][k]
pre[i]
[j][
k]記錄字首矩形中大於等於k
kk的數的和。利用這兩個東西套兩個二分即可
**清晰易懂,就不講了
#include "bits/stdc++.h"
#define hhh printf("hhh\n")
#define see(x) (cerr<<(#x)<<'='<<(x)inline int read()
const int maxn = 5e5+10;
const int mod = 1e9+7;
const double eps = 1e-9;
int n, m, t, tot;
int h[maxn], t[maxn<<5];
int sz[maxn<<5], l[maxn<<5], r[maxn<<5];
ll sum[maxn<<5];
void update(int x, int l, int r, int pre, int &now)
ll qksum(int k, int x, int y, int l, int r)
ll pre[205][205][1005];
int cnt[205][205][1005];
inline int qaq(int k, int x1, int y1, int x2, int y2)
inline ll qsum(int k, int x1, int y1, int x2, int y2)
int cnt=qaq(mid,x1,y1,x2,y2);
ll sum=pre[x2][y2][mid]-pre[x2][y1-1][mid]-pre[x1-1][y2][mid]+pre[x1-1][y1-1][mid];
return sum+=1ll*(k-cnt)*(mid-1);
}int main()
if(mid==y2-y1+1) printf("poor qlw\n");
else printf("%d\n", mid);}}
else
}for(int i=1; i<=n; ++i) }}
for(int i=0; iif(mid==tot+1) printf("poor qlw\n");
else printf("%d\n", mid);}}
}
1926 粟粟的書架 字首和 二分 主席樹
我們發現這道題其實是兩問 第一問是對於 r,c leq 200,m leq 200,000 是在矩形上的詢問 第二問是對於 r 1,c leq 500,000,m leq 20,000 是在序列上的詢問 所以我們寫兩個程式即可 首先我們來解決序列上的問題 很明顯我們在主席樹上二分查詢即可.o mlo...
BZOJ1926 粟粟的書架(主席樹,字首和)
第一行是三個正整數r,c,m。接下來是乙個r行c列的矩陣,從上到下 從左向右依次給出了每本書的頁數pi,j。接下來m行,第i行給出正整數x1i,y1i,x2i,y2i,hi,表示第i天的指定區域是 x1i,y1i 與 x2i,y2i 間 的矩形,總頁數之和要求不低於hi。保證1 x1i x2i r,...
二分,主席樹 洛谷 2468 粟粟的書架
給出乙個矩陣,問乙個子矩陣中至少要多少個數才能使和 h geq h h,多組資料,分成1 r c 200和r 1,1 c 500000 1 leq r,c leq 200和r 1,1 leq c leq 500000 1 r,c 200和 r 1,1 c 5000 00這顯然是一道以二分為核心的題目...