幸福幼兒園 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...