SDOI2010 粟粟的書架

2022-05-16 01:29:48 字數 3557 閱讀 1887

幸福幼兒園b29班的粟粟是乙個聰明機靈、乖巧可愛的小朋友,她的愛好是畫畫和讀書,尤其喜歡thomas h. cormen的文章。粟粟家中有乙個r行c列的巨型書架,書架的每乙個位置都擺有一本書,上數第i行、左數第j列擺放的書有pi,j頁厚。

粟粟每天除了讀書之外,還有一件必不可少的工作就是摘蘋果,她每天必須摘取乙個指定的蘋果。粟粟家果樹上的蘋果有的高、有的低,但無論如何憑粟粟自己的個頭都難以摘到。不過她發現,如果在腳下放上幾本書,就可以夠著蘋果;她同時注意到,對於第i天指定的那個蘋果,只要她腳下放置書的總頁數之和不低於hi,就一定能夠摘到。

由於書架內的書過多,父母擔心粟粟一天內就把所有書看完而耽誤了上幼兒園,於是每天只允許粟粟在乙個特定區域內拿書。這個區域是乙個矩形,第i天給定區域的左上角是上數第x1i行的左數第y1i本書,右下角是上數第x2i行的左數第y2i本書。換句話說,粟粟在這一天,只能在這﹙x2i-x1i+1﹚×﹙y2i-y1i+1﹚本書中挑選若干本墊在腳下,摘取蘋果。

粟粟每次取書時都能及時放回原位,並且她的書架不會再撤下書目或換上新書,摘蘋果的任務會一直持續m天。給出每本書籍的頁數和每天的區域限制及採摘要求,請你告訴粟粟,她每天至少拿取多少本書,就可以摘到當天指定的蘋果。

輸入檔案susu.in第一行是三個正整數r, c, m。

接下來是乙個r行c列的矩陣,從上到下、從左向右依次給出了每本書的頁數pi,j。

接下來m行,第i行給出正整數x1i, y1i, x2i, y2i, hi,表示第i天的指定區域是﹙x1i, y1i﹚與﹙x2i, y2i﹚間的矩形,總頁數之和要求不低於hi。

保證1≤x1i≤x2i≤r,1≤y1i≤y2i≤c。

輸出檔案susu.out有m行,第i行回答粟粟在第i天時為摘到蘋果至少需要拿取多少本書。如果即使取走所有書都無法摘到蘋果,則在該行輸出「poor qlw」(不含引號)。

【資料規模和約定】

對於10%的資料,滿足r, c≤10;

對於20%的資料,滿足r, c≤40;

對於50%的資料,滿足r, c≤200,m≤200,000;

另有50%的資料,滿足r=1,c≤500,000,m≤20,000;

對於100%的資料,滿足1≤pi,j≤1,000,1≤hi≤2,000,000,000。

根據資料規模,可判定分半處理

對於50%的資料,滿足r, c≤200,m≤200,000;

暴力,二位字首和統計一下大於高度k的num,sum

然後二分查詢

int

n,m,c,r;

int a[205][205],sum[205][205][1004],num[205][205][1004

];int

a1,a2,b1,b2,h;

inline

int get_value(int

x)inline

int get_num(int

x)inline

void

work1()

inc(k,

0,maxx)

inc(i,

1,r)inc(j,1

,c)

//二維字首統計容斥

int ans=-1

; inc(i,

1,m)

while(l<=r)

//二分查詢

printf("

%d\n

",get_num(ans)-(get_value(ans)-h)/ans);

//想一下,如果多餘的人數不在ans,那麼ans就偏大或偏小

}}

剩下50% r=1,c<=200005;主席樹維護一下靜態區間最值

const

int maxn=500005

;int

cnt;

intt[maxn];

int l[maxn<<5],r[maxn<<5],summ[maxn<<5],numm[maxn<<5

];inline

int build(int l,int

r)//

主席樹常規操作

inline int modify(int pre,int l,int r,int

x)inline

void query(int pre,int now,int l,int r,int

h)

int ans=0

;

while(lelse

}//模擬正常遞迴query

//化為二分查詢

printf("

%d\n

",ans+(h+l-1)/l);

//同上

}inline

void

work2()

inc(i,

1,m)

}

完整**

#include#define re return

#define inc(i,l,r) for(int i=l;i<=r;++i)

using

namespace

std;

template

inline void rd(t&x)

intn,m,c,r;

int a[205][205],sum[205][205][1004],num[205][205][1004

];int

a1,a2,b1,b2,h;

inline

int get_value(int

x)inline

int get_num(int

x)inline

void

work1()

inc(k,

0,maxx)

inc(i,

1,r)inc(j,1

,c)

int ans=-1

; inc(i,

1,m)

while(l<=r)

printf(

"%d\n

",get_num(ans)-(get_value(ans)-h)/ans);

}}const

int maxn=500005

;int

cnt;

intt[maxn];

int l[maxn<<5],r[maxn<<5],summ[maxn<<5],numm[maxn<<5

];inline

int build(int l,int

r)inline

int modify(int pre,int l,int r,int

x)inline

void query(int pre,int now,int l,int r,int

h)

int ans=0

;

while(lelse

}printf(

"%d\n

",ans+(h+l-1)/l);

}inline

void

work2()

inc(i,

1,m)

}int

main()

Sdoi2010 粟粟的書架

主席樹 二分 字首和 time limit 30 sec memory limit 552 mb submit 919 solved 366 submit status discuss 第一行是三個正整數r,c,m。接下來是乙個r行c列的矩陣,從上到下 從左向右依次給出了每本書的頁數pi,j。接下來...

SDOI2010 粟粟的書架

明顯的二合一問題。貪心的想,要個數最少,那麼久從頁數多的開始選。於是對於前50 的資料,可以直接預處理 1x,1y 矩陣內大於等於k的元素個數 元素之和的字首和,然後二分k值來驗證 對於後50 的資料,已經退化為一維情形,若再使用前面的方法會mle 5e51e34 那麼考慮使用主席樹來維護 每個節點...

SDOI2010 粟粟的書架 整體二分

description 第一行是三個正整數r,c,m。接下來是乙個r行c列的矩陣,從上到下 從左向右依次給出了每本書的頁數pi,j。接下來m行,第i行給出正整數x1i,y1i,x2i,y2i,hi,表示第i天的指定區域是 x1i,y1i 與 x2i,y2i 間 的矩形,總頁數之和要求不低於hi。保證...