原題:
題解:題目的意思是在子矩陣中選出最小的數量,使這些數的和大於等於h。注意到有一半的資料明顯不同,先考慮50分,暴力的做法是將這些數排序,從大往小選,但這樣顯然不行。注意到pi.j並不大,考慮dp的思想,val[i][j][k]表示(1,1)-(i,j)的矩陣所有大於等於k的數的和,num[i][j][k]為(1,1)-(i,j)的矩陣大於等於k的個數。然後二分就行了。考慮另外50分,注意到只有1行,但是寬度很大,考慮用主席樹維護區間的資訊,即需要在主席樹上找到答案。每個節點需要儲存區間的和,個數,查詢時先算出右子樹若大於h就往右走,反之往左走。
#include#define mid (l+r)/2
using namespace std;
const int n=1100;
const int maxn=500005;
const int log=20;
int n,m,q,maxn;
int page[220][220],val[220][220][n],num[220][220][n];
inline int rd()
inline int get_sum(int x1,int y1,int x2,int y2,int k)
inline int get_num(int x1,int y1,int x2,int y2,int k)
inline void work1()
while(q--)
int ans=l-1;
printf("%d\n",get_num(x1,y1,x2,y2,ans)-(get_sum(x1,y1,x2,y2,ans)-h)/ans);
} }
int t[maxn],sz[maxn*log],sum[maxn*log],tot,l[maxn*log],r[maxn*log],a[maxn];
inline int build(int l,int r)
return rt;
}inline int update(int pre,int l,int r,int x)
inline int query(int u,int v,int l,int r,int x)
inline void work2()
return ;
}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 粟粟的書架
幸福幼兒園b29班的粟粟是乙個聰明機靈 乖巧可愛的小朋友,她的愛好是畫畫和讀書,尤其喜歡thomas h.cormen的文章。粟粟家中有乙個r行c列的巨型書架,書架的每乙個位置都擺有一本書,上數第i行 左數第j列擺放的書有pi,j頁厚。粟粟每天除了讀書之外,還有一件必不可少的工作就是摘蘋果,她每天必...