1926: [Sdoi2010]粟粟的书架

Time Limit: 30 Sec  Memory Limit: 552 MB
Submit: 1064  Solved: 421
[Submit][Status][Discuss]

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

这个50% 和另外50%有点逗啊,强行把2个题搞到一起?

按照贪心思想来说,肯定是先取大的,这个题的关键就变成了怎么取大的

对于第一个50%  行列小于200,并且矩阵元素<=1000
可以预处理f[i][j][k]表示前i行j列大于等于k的数的和
                g[i][j][k]表示前i行j列大于等于k的数的个数
         
二分答案,得到ans表示用到的最小的数为ans,再暴力统计用了多少个ans+大于ans的数的个数

另外50% 由于只有一行,可以考虑数据结构
和第一种情况类似,先取大的,并且在一定区间内,可以想到用主席树维护

#include<bits/stdc++.h>
#define rint register int
#define N 500005
#define M 205
using namespace std;
int n,m,q,tot,rt[N],b[N],a[M][M],f[M][M][1005],g[M][M][1005];
struct node{int sum,num,ls,rs;}t[N*20];
inline char gc(){
static char s[1000000],*p1,*p2;
if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
return p1==p2?EOF:*p1++;
}
inline int R(){
static int x;static char ch;x=0;ch=gc();while(ch<'0'||ch>'9')ch=gc();
while(ch<='9'&&ch>='0')x=(x<<1)+(x<<3)+ch-'0',ch=gc();return x;
}
inline int getv(int x1,int y1,int x2,int y2,int k){
return f[x2][y2][k]+f[x1-1][y1-1][k]-f[x2][y1-1][k]-f[x1-1][y2][k];
}
inline int gets(int x1,int y1,int x2,int y2,int k){
return g[x2][y2][k]+g[x1-1][y1-1][k]-g[x2][y1-1][k]-g[x1-1][y2][k];
}
void solve2(){
for(rint x,i=1;i<=n;i++)
for(rint j=1;j<=m;j++){
x=R();
for(rint k=1;k<=1000;k++)
f[i][j][k]=f[i-1][j][k]+f[i][j-1][k]-f[i-1][j-1][k],
g[i][j][k]=g[i-1][j][k]+g[i][j-1][k]-g[i-1][j-1][k];
f[i][j][x]+=x;g[i][j][x]++;
}
for(rint i=1;i<=n;i++)
for(rint j=1;j<=m;j++)
for(rint k=1000;k;k--)
f[i][j][k]+=f[i][j][k+1],
g[i][j][k]+=g[i][j][k+1];
while(q--){
int x1=R(),y1=R(),x2=R(),y2=R();
int h=R(),l=1,r=1000,ans=-1,mid;
while(l<=r){
mid=(l+r)>>1;
if(getv(x1,y1,x2,y2,mid)>=h)l=(ans=mid)+1;
else r=mid-1;
}
if(ans==-1){puts("Poor QLW");continue;}
int cnt=gets(x1,y1,x2,y2,ans+1);
int tmp=gets(x1,y1,x2,y2,ans)-cnt;
int res=h-getv(x1,y1,x2,y2,ans+1);
int s=0;while(res>0&&s<=tmp)s++,res-=ans;
printf("%d\n",s+cnt);
}
}
void insert(int p,int &u,int l,int r,int pos){
u=++tot;t[u]=t[p];t[u].sum+=pos;t[u].num++;
if(l==r)return;int mid=(l+r)>>1;
if(pos<=mid)insert(t[p].ls,t[u].ls,l,mid,pos);
else insert(t[p].rs,t[u].rs,mid+1,r,pos);
}
inline int gs(int x,int y){return t[y].sum-t[x].sum;}
inline int gn(int x,int y){return t[y].num-t[x].num;}
int query(int p,int u,int l,int r,int v){
if(l==r)return (v-1)/l+1;int mid=(l+r)>>1,x=gs(t[p].rs,t[u].rs);
if(v<=x)return query(t[p].rs,t[u].rs,mid+1,r,v);
return query(t[p].ls,t[u].ls,l,mid,v-x)+gn(t[p].rs,t[u].rs);
}
inline void solve1(){
for(rint x,i=1;i<=m;i++)
x=R(),b[i]=b[i-1]+x,
insert(rt[i-1],rt[i],1,1000,x);
int A,B,C,D,h;
while(q--){
A=R();B=R()-1;C=R();D=R();h=R();
if(b[D]-b[B]<h){puts("Poor QLW");continue;}
printf("%d\n",query(rt[B],rt[D],1,1000,h));
}
}
int main(){
n=R();m=R();q=R();
if(n==1)solve1();
else solve2();
return 0;
}

bzoj1926[Sdoi2010]粟粟的书架 二分 主席树的更多相关文章

  1. 【BZOJ1926】粟粟的书架(主席树,前缀和)

    [BZOJ1926]粟粟的书架(主席树,前缀和) 题面 Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co ...

  2. 洛谷P4559 [JSOI2018]列队 【70分二分 + 主席树】

    题目链接 洛谷P4559 题解 只会做\(70\)分的\(O(nlog^2n)\) 如果本来就在区间内的人是不用动的,区间右边的人往区间最右的那些空位跑,区间左边的人往区间最左的那些空位跑 找到这些空 ...

  3. 【BZOJ 4556】[Tjoi2016&Heoi2016]字符串 SAM+二分+主席树

    这道题市面上就两种法:一种是SA+二分+主席树,一种是SAM+二分+主席树(有不少人打线段树合并???)(除此之外还有一种利用炒鸡水的数据的暴力SA,贼快.....)(当时学SA的时候没做这道题,现在 ...

  4. BZOJ2653 middle 【二分 + 主席树】

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

  5. BZOJ1926 [Sdoi2010]粟粟的书架 【主席树 + 二分 + 前缀和】

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

  6. 【Luogu】P2468粟粟的书架(主席树+前缀和)

    题目链接 我仿佛中了个爆零debuff 本题分成两部分,五十分用前缀和,f[i][j][k]表示(1,1)到(i,j)的矩形大于等于k的有多少个数(再记录页数和),查询时二分,另外的用主席树,类似方法 ...

  7. [bzoj2653][middle] (二分 + 主席树)

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

  8. Codeforces Round #276 (Div. 1) E. Sign on Fence 二分+主席树

    E. Sign on Fence   Bizon the Champion has recently finished painting his wood fence. The fence consi ...

  9. 【BZOJ-4556】字符串 后缀数组+二分+主席树 / 后缀自动机+线段树合并+二分

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 657  Solved: 274[Su ...

随机推荐

  1. Scrum 冲刺 总结

    Scrum 冲刺 总结 冲刺阶段链接 Scrum冲刺第一天 Scrum冲刺第二天 Scrum冲刺第三天 Scrum冲刺第四天 Scrum冲刺第五天 Scrum冲刺第六天 Scrum冲刺第七天 冲刺阶段 ...

  2. Scrum 冲刺 第一日

    Scrum 冲刺 第一日 站立式会议 燃尽图 Alpha 阶段认领任务 明日任务安排 项目预期任务量 成员贡献值计算规则 今日贡献量 参考资料 站立式会议 返回目录 燃尽图 返回目录 Alpha 阶段 ...

  3. git基本语法

    基本用法(上)               一.实验说明 本节实验为 Git 入门第一个实验,可以帮助大家熟悉如何创建和使用 git 仓库. 二.git的初始化 在使用git进行代码管理之前,我们首先 ...

  4. 《高级软件测试》11.14.安装和运行Jira

    今日任务完成情况如下: 小段:研究Jira在Linux的安装教程 小费:尝试在Ubuntu下安装Jira 小高:查阅了关于Jira软件的介绍和安装教程,下载准备明天安装,并学习使用 小王:注册Jira ...

  5. python解释NTFS runlist的代码(文章转自北亚数据恢复张宇工程师)

    代码如下: 执行效果如下:root@zhangyu-VirtualBox:~/NTFS-5# python3 read_runlist.py mft_source.img ***参数数量或格式错误! ...

  6. python 学习笔记

    1. 关于两者详细解释,参考链接:www.crifan.com/python_re_search_vs_re_findall/ 代码图

  7. 关于python爬虫经常要用到的一些Re.正则表达式

    转载:https://blog.csdn.net/skyeyesxy/article/details/50837984 1.正则表达式的常用符号与方法 常用符号:点号,星号,问号与括号(小括号) (. ...

  8. (转载) Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)

    1 . 查看当天日期 select current_date(); 2. 查看当天时间 select current_time(); 3.查看当天时间日期 select current_timesta ...

  9. Mock API是如何在开发中发光发热的?

    在长期的服务过程中,我们经常会遇到前来咨询的用户与我们反馈以下这种情况:咨询者是一个前端人员,在项目开发的过程中需要与后端进行对接,遇到后端还没完成数据输出的情况下,他只好写静态模拟数据,在遇到大型项 ...

  10. SpringCloud的Hystrix(一) 一个消费者内的两个服务监控

    一.概念与定义 1.服务雪崩 在微服务架构中,整个系统按业务拆分出一个个服务,这些服务之间可以相互调用(RPC),为了保证服务的高可用,单个服务通常会集群部署. 但是由于网络原因或自身原因,服务并不能 ...