主席樹 + 二分 字首和
time limit: 30 sec memory limit: 552 mb
submit: 919 solved: 366
[submit][status][discuss]
第一行是三個正整數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 108
6 15
2 poor qlw
9 1
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
第一輪day2
第一部分一行的寫一棵主席樹維護sum和cnt即可。
第二部分維護1000層二維字首和,每層之間再累加起來。
二分答案x,表示只使用厚度》=x的書,查一下字首和是否能滿足。
同樣維護乙個cnt,二分完了之後查出共有多少本即可。
話說luogu抄bzoj的題為什麼不吧時限和空限也抄過去
code:
#include
#include
#include
#define d(x) cout<<#x<<" = "<#define e coutnamespace
std;
typedef
long
long ll;
int r,c,m;
namespace part1
else }}
int query(int a,int b,int l,int r,int x)
int mid=(l+r)>>1, s=sum[rch[b]]-sum[rch[a]];
if(s>=x)
else
}void input()
} void solve()
else}}
}namespace part2
void init()
for(int x=1000;x>=1;x--)
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)}}
int sum(int lim)
int cnt(int lim)
void solve()
int l=1,r=1000,mid;
while(l1)/2;
// d(l); d(r); d(mid); e;
if(sum(mid)>=h) l=mid;
else r=mid-1;
}// d(l); e;
printf("%d\n",cnt(l+1) + (h-sum(l+1) +l-1)/l);}}
}int main()
else
}
SDOI2010 粟粟的書架
明顯的二合一問題。貪心的想,要個數最少,那麼久從頁數多的開始選。於是對於前50 的資料,可以直接預處理 1x,1y 矩陣內大於等於k的元素個數 元素之和的字首和,然後二分k值來驗證 對於後50 的資料,已經退化為一維情形,若再使用前面的方法會mle 5e51e34 那麼考慮使用主席樹來維護 每個節點...
SDOI2010 粟粟的書架
幸福幼兒園b29班的粟粟是乙個聰明機靈 乖巧可愛的小朋友,她的愛好是畫畫和讀書,尤其喜歡thomas h.cormen的文章。粟粟家中有乙個r行c列的巨型書架,書架的每乙個位置都擺有一本書,上數第i行 左數第j列擺放的書有pi,j頁厚。粟粟每天除了讀書之外,還有一件必不可少的工作就是摘蘋果,她每天必...
SDOI2010 粟粟的書架 整體二分
description 第一行是三個正整數r,c,m。接下來是乙個r行c列的矩陣,從上到下 從左向右依次給出了每本書的頁數pi,j。接下來m行,第i行給出正整數x1i,y1i,x2i,y2i,hi,表示第i天的指定區域是 x1i,y1i 與 x2i,y2i 間 的矩形,總頁數之和要求不低於hi。保證...