1926: [Sdoi2010]粟粟的书架
Time Limit: 30 Sec Memory Limit: 552 MB
Description
幸福幼儿园 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天。给出每本书籍的页数和每天的区域限制及采摘要求,请你告
诉粟粟,她每天至少拿取多少本书,就可以摘到当天指定的苹果。
Input
第一行是三个正整数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。
Output
有M行,第i 行回答粟粟在第 i 天时为摘到苹果至少需要 拿取多少本书。如果即使取走所有书都无法摘到苹果,
则在该行输出“Poor QLW” (不含引号)。
Sample Input
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
Sample Output
6
15
2
Poor QLW
9
1
3
HINT
对于 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
Source
第一轮Day2

/*
SD的复合题2333.
前50%没想出来,对于某些小的东西就应该多考虑orz.
K<=1000 显然要乱搞啊...
b[i][j][k]表示(1,1)到(i,j)大于等于K的数的个数.
sum[i][j][k]表示表示(1,1)到(i,j)大于等于K的数的和.
然后二分答案.
注意ans处不一定要全选,样例还是挺良心的。。。
复杂度O(R*C*1000)+O(M*Log1000).
后50%的数据想出来了,很好想
用主席树维护区间前K大之和
然后二分答案检验.
复杂度O(M*Log2N).
*/
#include<algorithm>
#include<cstdio>
#define MAXN 500001
using namespace std;
int n,m,q,tot1,root[MAXN],b[201][201][1010],sum[201][201][1010],ans,Sum[MAXN],s[201][201],c[201][201];
int H,tot,total,l,r;
struct data{int lc,rc,size,sum;}tree[MAXN*20];
int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();return x*f;
}
void add(int &now,int last,int l,int r,int p)
{now=++tot1;tree[now].lc=tree[last].lc;tree[now].rc=tree[last].rc;tree[now].size=tree[last].size+1;tree[now].sum=tree[last].sum+p;if(l==r) return ;int mid=(l+r)>>1;if(p<=mid) add(tree[now].lc,tree[last].lc,l,mid,p);else add(tree[now].rc,tree[last].rc,mid+1,r,p);return ;
}
int query(int L,int R,int l,int r,int k)
{if(l==r) return (tree[R].sum-tree[L].sum)/(tree[R].size-tree[L].size)*k;int sum1=tree[tree[R].lc].size-tree[tree[L].lc].size;int mid=(l+r)>>1;if(sum1>=k) return query(tree[L].lc,tree[R].lc,l,mid,k);else return query(tree[L].rc,tree[R].rc,mid+1,r,k-sum1)+tree[tree[R].lc].sum-tree[tree[L].lc].sum;
}
void slovequery(int x,int y)
{ans=0;l=1,r=y-x+1;int mid,k,L,X;L=y-x+1;X=Sum[y]-Sum[x-1];while(l<=r){mid=(l+r)>>1;k=L-mid+1;if(X-query(root[x-1],root[y],1,1000,k)>=H) ans=mid-1,r=mid-1;else l=mid+1;}if(!ans) ans=y-x+1;printf("%d\n",ans);
}
void slove1()
{int x,x1,y1,x2,y2;for(int i=1;i<=m;i++){x=read();Sum[i]=Sum[i-1]+x;add(root[i],root[i-1],1,1000,x);}while(q--){x1=read(),y1=read(),x2=read(),y2=read();H=read();if(Sum[y2]-Sum[y1-1]<H) printf("Poor QLW\n");else if(Sum[y2]-Sum[y1-1]==H) printf("%d\n",y2-y1+1);else slovequery(y1,y2);}
}
int slovequery2(int x1,int y1,int x2,int y2)
{l=1,r=1000;int mid;ans=0;while(l<=r){mid=(l+r)>>1;tot=sum[x2][y2][mid]-sum[x1-1][y2][mid]-sum[x2][y1-1][mid]+sum[x1-1][y1-1][mid];if(tot>=H) ans=mid,l=mid+1;else r=mid-1;}total=sum[x2][y2][ans]-sum[x1-1][y2][ans]-sum[x2][y1-1][ans]+sum[x1-1][y1-1][ans]-H;tot=b[x2][y2][ans]-b[x1-1][y2][ans]-b[x2][y1-1][ans]+b[x1-1][y1-1][ans];ans=tot-total/ans;return ans;
}
void slove2()
{int x1,y1,x2,y2;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)c[i][j]=read();for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)s[i][j]=s[i][j-1]+s[i-1][j]+c[i][j]-s[i-1][j-1];for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)for(int k=1;k<=1000;k++){if(c[i][j]>=k) b[i][j][k]++,sum[i][j][k]=c[i][j];b[i][j][k]+=b[i][j-1][k]+b[i-1][j][k]-b[i-1][j-1][k];sum[i][j][k]+=sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k];}while(q--){x1=read(),y1=read(),x2=read(),y2=read();H=read();if(s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1]<H) printf("Poor QLW\n");else printf("%d\n",slovequery2(x1,y1,x2,y2));}
}
int main()
{freopen("susu.in","r",stdin);freopen("susu.out","w",stdout);n=read(),m=read(),q=read();if(n==1) slove1();else slove2();return 0;
}

转载于:https://www.cnblogs.com/nancheng58/p/10067998.html

Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)相关推荐

  1. BZOJ2653middle——二分答案+可持久化线段树

    题目描述 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右端点在 ...

  2. BZOJ 2144 跳跳棋(LCA+欧几里德+二分答案)

    跳跳棋 问题描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子.我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在a,b,c这三个位置.我们要通过最少的跳动把他们的位 ...

  3. 【BZOJ1926】【SDOI2010】粟粟的书架(DP,主席树,二分)

    Description 幸福幼儿园B29班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢Thomas H. Cormen的文章.粟粟家中有一个R行C列的巨型书架,书架的每一个位 ...

  4. Cutting Bamboos 主席树+二分 牛客

    链接:https://ac.nowcoder.com/acm/contest/889/H 题面: There are n bamboos arranged in a line. The i-th ba ...

  5. P2468 [SDOI2010]粟粟的书架 主席树 + 二分 + 二维前缀和

    传送门 文章目录 题意: 题意: 题意: 给你一个n∗mn*mn∗m的矩阵,每次询问一个矩形,左上角是(x1,y1)(x_1,y_1)(x1​,y1​),右上角是(x2,y2)(x_2,y_2)(x2 ...

  6. P2468 [SDOI2010]粟粟的书架 动态规划,主席树,二分答案

    题目 洛谷题目链接 题解 题目的数据范围非常奇怪,一半是200∗200200∗200200*200的矩阵,另一半是1∗500001∗500001*50000的矩阵,显然是一道二合一的题目,但是不一样的 ...

  7. [SDOI2010]粟粟的书架

    Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R行C 列的巨型书架,书 ...

  8. [SDOI2010] 粟粟的书架

    题目描述: 给出 N * M 的 表格 每个位置有一个权值 K 给出 Q 个查询 每次查询限定一个矩形区域 问至少在本矩形区域内取出多少个元素才可以>=Qi 题目分析: YY了半天没想出来 看了 ...

  9. 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)

    传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...

最新文章

  1. 史上最大规模 DDoS 攻击,每秒 1720 万次 HTTP 请求
  2. CentOS 6.5 LVM磁盘管理学习笔记
  3. python用户注册(基于django)
  4. python中的format方法和int方法
  5. html下拉框设置默认值_如何设置HTML select下拉框的默认值?
  6. debian9.4网络配置及永久静态默认路由
  7. cocos creator基础-(六)cc.Sprite使用
  8. VS2005最近项目和最近文件清除
  9. wap push概述
  10. LINUX系统使用锐捷客户端认证校园网(华中科技大学)
  11. resnet101网络结构
  12. 固体发动机内弹道matlab,固体火箭发动机内弹道性能的仿真研究
  13. 腾讯走上王者之位,你以为靠的只是抄袭?
  14. Springboot集成聚合数据火车票API
  15. 肝进ICU,万字真言点化八大排序——我奶奶都看得懂的算法详解
  16. 用html制作学生成绩表格代码,利用Excel制作学生成绩表.doc
  17. drv10893器件的使用
  18. html中visibility属性,(CSS) 不同浏览器对table中visibility属性显示的不同
  19. sqrt (2)不使用数学库,求2的开方。
  20. 计算机教案三维目标,教学设计的三维目标

热门文章

  1. 数据结构中La表的数据合并到Lb表中
  2. 【原创翻译】生动详细解释javascript的冒泡和捕获,包懂包会
  3. 电子邮件地址抓取工具
  4. 千兆网线制作(包括交叉线)
  5. 利用反射,批量启动WCF服务
  6. 【JAVA多线程】interrupted() 和 isInterrupted() 的区别
  7. python+PIL+pytesser处理验证码环境搭建
  8. Dubbo(一) -- 初体验
  9. JSPServlet精华笔记
  10. android ANR产生原因和解决办法