P2468 SDOI2010 粟粟的書架

2021-08-24 18:19:22 字數 2813 閱讀 3839

幸福幼兒園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」(不含引號)。

輸入樣例#1:複製

5 5 7

14 15 9 26 53

58 9 7 9 32

38 46 26 43 38

32 7 9 50 28

8 41 9 7 17

1 2 5 3 139

3 1 5 5 399

3 3 4 5 91

4 1 4 1 33

1 3 5 4 185

3 3 4 3 23

3 1 3 3 108

輸出樣例#1:複製

6152

poor qlw91

3

輸入樣例#2:複製

1 10 7

14 15 9 26 53 58 9 7 9 32

1 2 1 9 170

1 2 1 9 171

1 5 1 7 115

1 1 1 10 228

1 4 1 4 45704571

1 1 1 1 1

1 7 1 8 16

輸出樣例#2:複製

673

10poor qlw

12

【資料規模和約定】

對於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。

#includeusing namespace std;

int temp[210][210], temp1[500000 + 10];

int val[210][210][1010], num[210][210][1010], n, m, t;

int cnt, root[5500010], r[5500010], l[5500010], sum[5500010], size[5500010];

void work1()

for ( int k = 0; k <= 1000; k ++ )}}

}int x1,x2,y1,y2,h;

while(t --)

int l = 1, r = 1000, ans;

while(l <= r)

else

r = mid - 1;

}int te = num[x2][y2][ans] - num[x2][y1 - 1][ans] - num[x1 - 1][y2][ans] + num[x1 - 1][y1 - 1][ans];

te -= (val[x2][y2][ans] - val[x2][y1 - 1][ans] - val[x1 - 1][y2][ans] + val[x1 - 1][y1 - 1][ans] - h) / ans;

printf("%d\n", te);

}}void update(int k, int last, int &now, int l, int r)

else

}int query(int last, int now, int l, int r, int h)

else

}ans += h / l;

if(h % l != 0)

ans ++;

return ans;

}void work2()

int x1,y1,x2,y2,h;

while(t --)

}int main()

P2468 SDOI2010 粟粟的書架

傳送門 二合一題.前面 50 分 考慮取書顯然優先取厚的,所以答案滿足單調性 發現 p 不大,所以考慮二分最小厚度 mid 把大於等於 mid 的書取走 維護 cnt i j k 表示位置 i,j 為右下角一直到 1,1 的矩形內厚度大於等於 k 的書的數量 維護 sum i j k 表示位置 i,...

P2468 SDOI2010 粟粟的書架 題解

你有乙個長r,寬c的矩陣,矩陣上每個格仔有權值,有m次詢問,每次給出乙個矩形左上角 x1,y1 和右下角 x2 y2 以及乙個值h,求 在該矩形覆蓋的權值和是否大於h,最小需要幾個權值就可以大於h。資料規模和約定 對於10 的資料,滿足r,c 10 對於20 的資料,滿足r,c 40 對於50 的資...

Sdoi2010 粟粟的書架

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