1926 粟粟的書架 字首和 二分 主席樹

2022-02-27 11:43:34 字數 1742 閱讀 9136

我們發現這道題其實是兩問

第一問是對於 \(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...