BZOJ1926 Sdoi2010 粟粟的書架

2022-02-28 14:58:49 字數 3029 閱讀 2129

幸福幼兒園 b29 班的粟粟是乙個聰明機靈、乖巧可愛的小朋友,她的愛好是畫畫和讀書,尤其喜歡 thomas h. co

rmen 的文章。粟粟家中有乙個 r行c 列的巨型書架,書架的每乙個位置都擺有一本書,上數第i 行、左數第j 列

擺放的書有pi,j頁厚。粟粟每天除了讀書之外,還有一件必不可少的工作就是摘蘋果,她每天必須摘取乙個指定的

蘋果。粟粟家果樹上的蘋果有的高、有的低,但無論如何憑粟粟自己的個頭都難以摘到。不過她發現, 如果在腳

下放上幾本書,就可以夠著蘋果;她同時注意到,對於第 i 天指定的那個蘋果,只要她腳下放置書的總頁數之和

不低於hi,就一定能夠摘到。由於書架內的書過多,父母擔心粟粟一天內就把所有書看完而耽誤了上幼兒園,於是

每天只允許粟粟在乙個特定區域內拿書。這個區域是乙個矩形,第 i 天給定區域的左上角是上數第 x1i行的左數

第 y1i本書,右下角是上數第 x2i行的左數第y2i本書。換句話說,粟粟在這一天,只能在這﹙x2i-x1i+1﹚×﹙

y2i-y1i+1﹚本書中挑選若干本墊在腳下,摘取蘋果。粟粟每次取書時都能及時放回原位,並且她的書架不會再

撤下書目或換上新書,摘蘋果的任務會一直持續 m天。給出每本書籍的頁數和每天的區域限制及採摘要求,請你告

訴粟粟,她每天至少拿取多少本書,就可以摘到當天指定的蘋果。

第一行是三個正整數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。

有m行,第i 行回答粟粟在第 i 天時為摘到蘋果至少需要 拿取多少本書。如果即使取走所有書都無法摘到蘋果,

則在該行輸出「poor qlw」 (不含引號)。

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 108615

2poor qlw91

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

我討厭二合一...

唯一共同點就是要二分吧..

考慮r=1的就是個序列,那麼利用二分轉化為判定性問題,問題就變成了區間前k大的和是否大於h。這個可以二分+主席樹求前k小sum(維護個字首和就可以得到前k大了),這樣是\(o(nlog^2n)\)的,但是其實可以直接在主席樹上二分,做到\(o(nlogn)\)的。log^2的細節問題就是返回的時候注意只需要返回k個葉子結點的值而不需要全部返回(因為只要前k小個數)。

至於矩陣的,考慮對於每種高度的書維護二維字首和,那麼二分滿足答案的最小高度,然後維護大於k的書的個數即可。注意乙個細節答案要減去多出來的那些因為乙個高度有很多本,其實有一些是多於的,需要減去,至於個數可以直接(σ所選書-h)/(min_h),這樣就ok了(因為多出來的要扔掉的一定是高度最小的)

這樣複雜度是\(o(nlog^2n)\)或\(o(nlogn)\)的(對應兩種情況)

(除錯沒刪結果一直wa調了1h)

#include #define ll long long

using namespace std;

const int n = 500010, m = 5500100;

namespace io

while(c >= '0' && c <= '9')

x *= f;

}inline void in_l(ll &x)

while(c >= '0' && c <= '9')

x *= f;

}}using namespace io;

/*二分前x大本行不行。主席樹維護個sum和cnt判定。

然後維護乙個字首和判無解。

複雜度o(mlog^2(c))

*/int a[n], root[n], tot;

int r, c, m;

namespace subtask1 t[m];

#define lc(x) (t[x].lc)

#define rc(x) (t[x].rc)

int len = 0;

ll s[n];

void upd(int last, int &rt, int l, int r, int pos, ll v)

ll query(int l, int r, int l, int r, int k)

void solve()

for(int i = 1; i <= m; ++i)

printf("%d\n", ans);}}

}#undef lc

#undef rc

}namespace subtask2

ll calc_num(int k, int l1, int r1, int l2, int r2)

void solve()

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

for(int i = 1; i <= r; ++i)

}for(int i = 1; i <= m; ++i)

printf("%d\n", calc_num(ans, l1, r1, l2, r2) - (calc(ans, l1, r1, l2, r2) - h) / ans);

}}}}

int main()

bzoj1926 Sdoi2010 粟粟的書架

題目鏈結 傳送門題解 大佬好強 看了看資料範圍,不是很明白為什麼明明兩道題卻硬要擠在一道題裡 0.5倍經驗orz 前一半的資料 r,c 200 字首和 二分 num i j k 表示 1,1 到 i,j 中比大於等於k的數有幾個 sum i j k 表示 1,1 到 i,j 中比大於等於k的數的總和...

BZOJ1926 Sdoi2010 粟粟的書架

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

bzoj1926 Sdoi2010 粟粟的書架

第一行是三個正整數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...