题解 SDOI2010 【栗栗的书架】
\]
看到这题洛谷标签有 主席树 ,还以为是什么二维主席树的玄学做法(雾
\]
给出一个 \(R×C\) 的矩阵。
一共 \(m\) 次询问,每次询问给出一个五元组 \((x1,y1,x2,y2,h)\) 。
求:在矩阵 \((x1,y1,x2,y2)\) 里至少取多少个数,它们的和大于等于 \(h\)
无解输出 Poor QLW 。
\]
显然是贪心地取数,数取的越大,就可以越早使和大于等于 \(h\) 。
因此我们都考虑优先选择大的数,然后一步一步往小的数考虑。
所以我们可以把 " 矩阵内大于等于 \(k\) 的数 " 的和以及个数求出来,然后去二分取数的最小值,把最优性问题转化成一个判定性问题。
\(~\)
注意到:
对于50%的数据,满足R, C≤200,M≤200,000;
另有50%的数据,满足R=1,C≤500,000,M≤20,000;
\(~\)
对于 \(type1\) ,可以直接用 \(O(1000RC)\) 的时间预处理(二维前缀和)。
\(~\)
对于 \(type2\) ,发现 \(O(1000RC)\) 的时间预处理会 \(T\) 飞。
观察到 \(R=1\) ,此时实质上这个矩阵是一个序列,解决 " 区间内大于等于 \(k\) 的数 " 的和以及个数正是主席树擅长的,用主席树维护一下即可。
\]
#include<cstdio>
#define RI register int
using namespace std;
inline int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
return x*f;
}
const int N1=210,N2=500100,MLOGN=10001000;
const int MaxV=1000;
int n,m,Q;
int val[N1][N1];
int sum[N1][N1][MaxV+100],cnt[N1][N1][MaxV+100];
int GetSum(int x1,int y1,int x2,int y2,int k)
{
return sum[x2][y2][k]-sum[x1-1][y2][k]-sum[x2][y1-1][k]+sum[x1-1][y1-1][k];
}
int GetCnt(int x1,int y1,int x2,int y2,int k)
{
return cnt[x2][y2][k]-cnt[x1-1][y2][k]-cnt[x2][y1-1][k]+cnt[x1-1][y1-1][k];
}
void Work1()
{
for(RI i=1;i<=n;i++)
for(RI j=1;j<=m;j++)
val[i][j]=read();
for(RI k=1;k<=MaxV;k++)
for(RI i=1;i<=n;i++)
for(RI j=1;j<=m;j++)
{
sum[i][j][k]=sum[i-1][j][k]+sum[i][j-1][k]-sum[i-1][j-1][k]+(val[i][j]>=k?val[i][j]:0);
cnt[i][j][k]=cnt[i-1][j][k]+cnt[i][j-1][k]-cnt[i-1][j-1][k]+(val[i][j]>=k?1:0);
}
while(Q--)
{
int x1=read(),y1=read(),x2=read(),y2=read(),h=read();
if(GetSum(x1,y1,x2,y2,1)<h)
{
puts("Poor QLW");
continue;
}
int l=1,r=MaxV;
while(l<r)
{
int mid=(l+r+1)/2;
if(GetSum(x1,y1,x2,y2,mid)<h)
r=mid-1;
else
l=mid;
}
printf("%d\n",GetCnt(x1,y1,x2,y2,l)-(GetSum(x1,y1,x2,y2,l)-h)/l);
}
}
int seq[N2];
int tot,root[N2];
struct SegmentTree{
int lc,rc;
int cnt;
int sum;
}t[MLOGN];
int New()
{
tot++;
t[tot].lc=t[tot].rc=t[tot].cnt=t[tot].sum=0;
return tot;
}
void insert(int &p,int now,int l,int r,int delta,int val1,int val2)
{
p=New();
t[p]=t[now];
t[p].cnt+=val1;
t[p].sum+=val2;
if(l==r)return;
int mid=(l+r)/2;
if(delta<=mid)
insert(t[p].lc,t[now].lc,l,mid,delta,val1,val2);
else
insert(t[p].rc,t[now].rc,mid+1,r,delta,val1,val2);
}
int ask(int p,int q,int l,int r,int h)
{
if(l==r)return (h-1)/l+1;
int mid=(l+r)/2;
int rcnt=t[t[q].rc].cnt-t[t[p].rc].cnt,
rsum=t[t[q].rc].sum-t[t[p].rc].sum;
if(h<=rsum)
return ask(t[p].rc,t[q].rc,mid+1,r,h);
else
return ask(t[p].lc,t[q].lc,l,mid,h-rsum)+rcnt;
}
void Work2()
{
n=m;
for(RI i=1;i<=n;i++)
seq[i]=read();
for(RI i=1;i<=n;i++)
insert(root[i],root[i-1],1,MaxV,seq[i],1,seq[i]);
while(Q--)
{
int l,r,h;
read(),l=read(),read(),r=read(),h=read();
if(t[root[r]].sum-t[root[l-1]].sum<h)
{
puts("Poor QLW");
continue;
}
printf("%d\n",ask(root[l-1],root[r],1,MaxV,h));
}
}
int main()
{
n=read(),m=read(),Q=read();
if(n>1)
Work1();
else
Work2();
return 0;
}
\]
题解 SDOI2010 【栗栗的书架】的更多相关文章
- bzoj1926[Sdoi2010]粟粟的书架 二分 主席树
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MBSubmit: 1064 Solved: 421[Submit][Stat ...
- bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926 题面; 1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Se ...
- Bzoj 1926: [Sdoi2010]粟粟的书架(二分答案+乱搞+主席树)
1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱 ...
- [SDOI2010]粟粟的书架 [主席树]
[SDOI2010]粟粟的书架 考虑暴力怎么做 显然是提取出来 (x2-x1+1)*(y2-y1+1) 个数字拿出来 然后从大到小排序 然后就可以按次取数了- 然而接下来看数据范围 \(50\%\ r ...
- BZOJ1926:[SDOI2010]粟粟的书架——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1926 https://www.luogu.org/problemnew/show/P2468 幸福幼 ...
- BZOJ1926 [Sdoi2010]粟粟的书架 【主席树 + 二分 + 前缀和】
题目 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位置都 ...
- [bzoj1926][Sdoi2010]粟粟的书架_二分_主席树
粟粟的书架 bzoj-1926 Sdoi-2010 题目大意:题目链接 注释:略 想法:分成两个题 前面的我们可以二分,直接二分出来检验即可. 对于R=1的,相当一个数列,我们在上面建立主席树. 然后 ...
- BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)
BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...
- [BZOJ1926][SDOI2010]粟粟的书架
BZOJ Luogu Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R ...
随机推荐
- 关于java php go 中AES加解密秘钥长度问题
今天心血来朝,想用go把php中的一个小功能重写一下,但在解密aes加密的数据时碰到了个坑! php的mcrypt拓展(貌似php7.1版本以上不支持了)提供了aes的加解密: 而且php aes 的 ...
- php配置xdebug插件,断点调试
xdebug 下载地址:https://xdebug.org 1.项目目录下新建phpinfo(); 文件: 2.快速查找符合自己的phpxdebug插件: https://xdebug.org/wi ...
- [apue] 一个查看当前终端标志位设置的小工具
话不多说,先看运行效果: >./term input flag 0x00000500 BRKINT not in ICRNL IGNBRK not in IGNCR not in IGNPAR ...
- DataFrame数据合并
一.join 作用:默认情况下,他是把行索引相同的数据合并到一起注意:以左为准,没有的部分用NaN补全 例子 import pandas as pd import numpy as np df1 = ...
- MySQL-5.7.29 的安装与配置
解压缩,我这里的解压路径是:D:\Program Files\Java MySQL-5.7.29下载地址:https://www.jianguoyun.com/p/DcKSfd8Q6LnsBxiY8c ...
- (转) exp1-3://一次有趣的XSS漏洞挖掘分析(3)最终篇
这真是最后一次了.真的再不逗这个程序员了.和预期一样,勤奋的程序员今天又更新程序了.因为前面写的payload都有一个致命的弱点,就是document.write()会完全破坏DOM结构.而且再“ ...
- Windows Server 2016 Active Directory 图文搭建指南
1. 首先打开Manage --> Add Roles and Features 2. 点击Next 3. 不做修改,点击Next 4. 不做修改,点击Next 5. 选择Active Dire ...
- beta版本发布说明与总结
1.发布说明: 软件介绍: deta版本的发布最终是一个可安装使用的窗体程序,已经由Alpha版本的应用解决方案完成到一个程序: deta版本解决了Alpha版本遗留的软件技术方面错误问题,以及针对有 ...
- python从excel中读取数据传给其他函数使用
首先安装xlrd库 pip install xlrd 方法1: 表格内容如下: 场景描述,读取该表格A列数据,然后打印出数据 代码何解析如下: import xlrd #引入xlrd库 def exc ...
- Python3基础之数据类型(字典)
Python3数据类型之 字典 字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({} ...