我們發現這道題其實是兩問
第一問是對於 \(r, c\leq 200,m\leq 200,000\)
是在矩形上的詢問
第二問是對於 \(r=1,c\leq 500,000,m\leq 20,000\)
是在序列上的詢問
所以我們寫兩個程式即可
首先我們來解決序列上的問題:
很明顯我們在主席樹上二分查詢即可.\(o(mlogn)\)可做
然後我們來解決在矩形上的問題:
很明顯我們寫個二維差分主席樹就好了啦
我們發現這個子任務的特點是r,c的範圍很小所以我們考慮預處理
我們可以預處理出\(f[i][j][k]\)表示在二維字首和\((i,j)\)中
大於等於\(k\)的數的和,這樣我們就可以二分啦!
同時為了統計答案我們還要處理出\(g[i][j][k]\)表示》=k的數的個數
然後這道題就華麗麗地解決啦
我們還有乙個問題!
對於序列:2 2 2 2我們取多少才能達到高度\(2\),很明顯取1個
但是程式會輸出4
這個東西再二分一下還應該刪除多少個不久好了嗎。。。
竟然1a了
#include #include #include using namespace std;
typedef long long ll;
inline void read(int &x)
inline int cat_max(const int &a,const int &b)
inline int cat_min(const int &a,const int &b)if(ans == -1) puts("poor qlw");
elsey -= x;
printf("%d\n",y);
}} return 0; }}
namespace work2*null;
inline void init()
node *rt[maxn];
inline node* insert(node *rt,int l,int r,int val)int mid = (l+r) >> 1;
if(val <= mid) p->ch[0] = insert(rt->ch[0],l,mid,val);
else p->ch[1] = insert(rt->ch[1],mid+1,r,val);
p->sum = p->ch[0]->sum + p->ch[1]->sum;
p->num = p->ch[0]->num + p->ch[1]->num;
return p;
}int pos = -1,cnt = -1;
inline pa query(node *x,node *y,int l,int r,int h)
int mid = (l+r) >> 1,sum = y->ch[1]->sum - x->ch[1]->sum;
if(sum < h)else return query(x->ch[1],y->ch[1],mid+1,r,h);
} int main()
while(q--)
int l = 0,r = cnt,y = 0;
while(l <= r)
printf("%d\n",x.second - y);
} return 0; }}
int main()
不得不說當時我開陣列的時候渾身難受
一兩個陣列就100多mb下去了...
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,...
SDOI2010 粟粟的書架 整體二分
description 第一行是三個正整數r,c,m。接下來是乙個r行c列的矩陣,從上到下 從左向右依次給出了每本書的頁數pi,j。接下來m行,第i行給出正整數x1i,y1i,x2i,y2i,hi,表示第i天的指定區域是 x1i,y1i 與 x2i,y2i 間 的矩形,總頁數之和要求不低於hi。保證...
粟粟的書架(主席樹 二維字首和)
一下子做了兩個題?題意 乙個問題求區間前k大的和,另乙個問題求矩形內前k大的和。思路 前乙個問題直接上主席樹 二分搞定 後乙個問題由於資料範圍比較小,用cnt i j k cnt i j k cnt i j k 記錄字首矩形中大於等於k kk的數有多少個,用pre i j k pre i j k p...