链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926

题面;

1926: [Sdoi2010]粟粟的书架

Time Limit: 30 Sec  Memory Limit: 512 MB
Submit: 1669  Solved: 618
[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
思路:
一开始怎么都想不到怎么写,这道题主要就是要发现数据范围的特殊性,对于R,C<=200的数据我们可以前缀和维护,每次二分最小值,对于R=1的情况其实就是一维的数组,我们直接用主席树维护,然后二分最小值。
s[i][j][k] 代表  从(1,1) 到 (i,j)大于k的数的值之和
t[i][j][k] 代表 从(1,1)到(i,j) 大于k的数的个数
 
我们假设k为最小值,那么肯定k越大s[i][j][k]越小,那么就可以二分k找到最小的大于h的k。
 
实现代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 5e5+;
int ls[M*],rs[M*],sum[M*],idx,rt[M],num[M*],n,m;
int mp[][],s[][][],t[][][],v[];
void update(int old,int &k,int p,int c,int l,int r){
k = ++idx;
ls[k] = ls[old]; rs[k] = rs[old];
sum[k] = sum[old] + c;
num[k] = num[old] + ;
if(l == r) return ;
int mid = (l + r) >> ;
if(p <= mid) update(ls[old],ls[k],p,c,l,mid);
else update(rs[old],rs[k],p,c,mid+,r);
} int query(int old,int k,int L,int R,int l,int r){
if(L <= l&&R >= r){
return sum[k] - sum[old];
}
int mid = (l + r) >> ;
int ret = ;
if(L <= mid) ret += query(ls[old],ls[k],L,R,l,mid);
if(R > mid) ret += query(rs[old],rs[k],L,R,mid+,r);
return ret;
} int ask(int old,int k,int L,int R,int l,int r){
if(L <= l&&R >= r){
return num[k] - num[old];
}
int mid = (l + r) >> ;
int ret = ;
if(L <= mid) ret += ask(ls[old],ls[k],L,R,l,mid);
if(R > mid) ret += ask(rs[old],rs[k],L,R,mid+,r);
return ret;
} void init(){
for(int i = ;i <= n;i ++){
for(int j = ;j <= m;j ++){
for(int k = ;k <= ;k ++){
t[i][j][k] = t[i-][j][k]+t[i][j-][k]-t[i-][j-][k];
}
t[i][j][mp[i][j]] += ;
}
}
for(int i = ;i <= n;i ++){
for(int j = ;j <= m;j ++){
for(int k = ;k >= ;k --){
s[i][j][k] = s[i][j][k+]+t[i][j][k]*k;
t[i][j][k] += t[i][j][k+];
}
}
}
} int getsum(int k,int x1,int y1,int x2,int y2){
//cout<<s[x2][y2][k]<<" "<<s[x1-1][y1-1][k]<<" "<<s[x1-1][y2][k]<<endl;
int num = s[x2][y2][k] + s[x1-][y1-][k] - s[x1-][y2][k] - s[x2][y1-][k];
return num;
} int getnum(int k,int x1,int y1,int x2,int y2){
int num = t[x2][y2][k] + t[x1-][y1-][k] - t[x1-][y2][k] - t[x2][y1-][k];
return num;
} int main()
{
int p,x1,x2,y1,y2,h;
scanf("%d%d%d",&n,&m,&p);
for(int i = ;i <= n;i ++){
for(int j = ;j <= m;j ++){
cin>>mp[i][j],v[mp[i][j]]++;
}
}
if(n <= &&m <= ){
init();
for(int i = ;i <= p;i ++){
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&h);
int l = ,r = ,ans = ,id=-;
while(l <= r){
int mid = (l + r) >> ;
int num = getsum(mid,x1,y1,x2,y2);
if(num >= h){
id = mid,ans = num,l = mid+;
}
else r = mid-;
}
if(id == -){
printf("Poor QLW\n"); continue;
}
int cur = getnum(id,x1,y1,x2,y2);
while(ans-id>=h){
ans-=id; cur--;
}
printf("%d\n",cur);
}
}
else{
for(int i = ;i <= m;i ++)
update(rt[i-],rt[i],mp[][i],mp[][i],,M);
for(int i = ;i <= p;i ++){
scanf("%d%d%d%d%d",&x1,&y1,&x2,&y2,&h);
int l = ,r = ,ans = ,id = -;
while(l <= r){
int mid = (l + r) >> ;
int num = query(rt[y1-],rt[y2],mid,M,,M);
if(num >= h){
id = mid,ans = num,l = mid+;
}
else r = mid-;
}
if(id == -){
printf("Poor QLW\n"); continue;
}
int cur = ask(rt[y1-],rt[y2],id,M,,M);
while(ans-id>=h){
ans-=id; cur--;
}
printf("%d\n",cur);
}
}
return ;
}
 

bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)的更多相关文章

  1. BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)

    BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...

  2. BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)

    题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...

  3. 2018湘潭邀请赛C题(主席树+二分)

    题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...

  4. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  5. HDU - 4866 主席树 二分

    题意:在x轴\([1,X]\)内的上空分布有n个占据空间\([L_i,R_i]\),高度\(D_i\)的线段,射中线段的得分为其高度,每次询问从x轴的\(x\)往上空射的最近k个线段的总得分,具体得分 ...

  6. POJ 6621: K-th Closest Distance(主席树 + 二分)

    K-th Closest Distance Time Limit: 20000/15000 MS (Java/Others)    Memory Limit: 524288/524288 K (Jav ...

  7. HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分)

    HDU6621 K-th Closest Distance HDU2019多校训练第四场 1008(主席树+二分) 传送门:http://acm.hdu.edu.cn/showproblem.php? ...

  8. Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...

  9. 【刷题】BZOJ 1926 [Sdoi2010]粟粟的书架

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

随机推荐

  1. 【转载】Mysql创建表时报错error150

    从mysql数据库中导出正常数据库的脚本语句,而后使用脚本语句创建数据库的过程中,执行语句提示Can't Create Table 'XXX' erro150的错误,语句执行中断,创建table失败, ...

  2. int16, int32, int64等类型说明

    Int16  相当于 short  占2个字节   -32768 ~ 32767 Int32  相当于 int      占4个字节   -2147483648 ~ 2147483647 Int64  ...

  3. ITSA(IT Strategy and Architecture)方法介绍

    Architecture Capability – At a Glance Architectural coherence part1 Architectural coherence part2 SA ...

  4. 【spring实战第五版遇到的坑】3.1中的例子报错

    按照书中的例子,一直做到第3.1章使用JDBC读写数据时,在提交设计的taco表单时,报了如下的异常信息: Failed to convert property value of type java. ...

  5. 第二次上机,ASP内置对象的使用

    3.新建Reg.asp文档,参照1中的Reg.html,通过VBScript服务器端脚本代码实现 ”班级” Select表单的自动生成,如下所示: 注:通过循环语句,采用Response.Write命 ...

  6. “宇宙最强” IDE,Visual Studio 2019 正式发布

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 本文由葡萄城翻译并发布 今天凌晨Visual Studio 2019已经正式发布,现在已经可以下载了.使用V ...

  7. SpringMVC归纳-1(model数据模型与重定向传参技术)

    要点: model是一个Map结构的数据模型,能重定向时传递数据(拼接URL),但不安全,主要用于渲染前端页面,配合Thymeleaf填充html里面里设置好的参数. @RequestParam用来获 ...

  8. PMM Client 安装异常报错

    1.PMM架构 如下图所示 2.Client主要组件 PMM Client是安装在你要监视的MySQL或MongoDB主机上的一组代理组件.组件收集关于一般系统和数据库性能的各种数据,并将该数据发送到 ...

  9. Bootstrap table 行编辑导航

    /*开启表格编辑方向键导航 方向键(←): VK_LEFT (37) 方向键(↑): VK_UP (38) 方向键(→): VK_RIGHT (39) 方向键(↓): VK_DOWN (40) */ ...

  10. C# -- FTP上传下载

    C# -- FTP上传下载 1. C#实现FTP下载 private static void TestFtpDownloadFile(string strFtpPath, string strFile ...