SDOI2010粟粟的书架
题目传送:https://www.luogu.org/problemnew/show/P2468
这是一个二合一的题目,前50% \(n!=1\)的分数中,我们考虑用动态规划来做。
设\(sum[i][j][k]\)表示大于等于k的\([1,1]\)到\([i,j]\)范围内的数的总和,然后用\(num[i][j][k]\)表示数的个数。
之后就可以用二维前缀和来维护了,具体见代码subtask1
后50%的题目因为数据范围很大,所以我们只能考虑使用log复杂度的数据结构,因为还涉及到区间排名的问题,所以自然查询的时候要换成主席树。
不需要离散化。在查询的时候因为是查找大于等于当前查找值的数的个数,所以我们要从右子树开始查找(显然是要从大到小),之后如果右子树的总和大于等于当前查找值,那么就进入右子树,如果不是,那么加上右子树的数的个数然后查找左子树。之后要注意的是如果到了叶子节点,我们要求的个数等于还需要的总和除以该节点值的向上取整。
具体见代码subtask2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 1000*10+500000*15+10
int n,m,kkk;
namespace subtask1
{
int maxx=0;
int sum[210][210][1010],num[210][210][1010],a[1010][1010];
inline int max(int x,int y){return x>y?x:y;}
inline int getsum(int x1,int x2,int y1,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];}
inline int getnum(int x1,int x2,int y1,int y2,int k){return num[x2][y2][k]-num[x1-1][y2][k]-num[x2][y1-1][k]+num[x1-1][y1-1][k];}
inline void init()
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&a[i][j]),maxx=max(maxx,a[i][j]);
for(int k=0;k<=maxx;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
sum[i][j][k]=sum[i][j-1][k]+sum[i-1][j][k]-sum[i-1][j-1][k]+(a[i][j]>=k?a[i][j]:0);
num[i][j][k]=num[i][j-1][k]+num[i-1][j][k]-num[i-1][j-1][k]+(a[i][j]>=k?1:0);
}
}
inline void work(int x1,int x2,int y1,int y2,int h)
{
if(getsum(x1,x2,y1,y2,0)<h)
{
printf("Poor QLW\n");
return;
}
int l=0,r=maxx+1,ans=-0x3f;
while(l<r)
{
int mid=(l+r)>>1;
if(getsum(x1,x2,y1,y2,mid)>=h) ans=mid,l=mid+1;
else r=mid;
}
if(ans==-0x3f)
{
printf("Poor QLW\n");
return;
}
printf("%d\n",getnum(x1,x2,y1,y2,ans)-(getsum(x1,x2,y1,y2,ans)-h)/ans);
}
}
namespace subtask2
{
int cnt;
int sum[MAXN],siz[MAXN],ls[MAXN],rs[MAXN],rt[MAXN],a[500010];
inline int max(int x,int y){return x>y?x:y;}
inline void build(int &x,int l,int r)
{
x=++cnt;
if(l==r) return;
int mid=(l+r)>>1;
build(ls[x],l,mid);
build(rs[x],mid+1,r);
}
inline int modify(int x,int l,int r,int p)
{
int to=++cnt;
ls[to]=ls[x],rs[to]=rs[x],siz[to]=siz[x]+1,sum[to]=sum[x]+p;
if(l==r) return to;
int mid=(l+r)>>1;
if(mid<p) rs[to]=modify(rs[to],mid+1,r,p);
else ls[to]=modify(ls[to],l,mid,p);
return to;
}
inline int query(int u,int v,int l,int r,int k)
{
if(l==r) return (k+l-1)/l;
int mid=(l+r)>>1;
int x=sum[rs[v]]-sum[rs[u]];
if(k<=x) return query(rs[u],rs[v],mid+1,r,k);
else return siz[rs[v]]-siz[rs[u]]+query(ls[u],ls[v],l,mid,k-x);
}
inline void work()
{
int maxx=0;
for(int i=1;i<=m;i++) scanf("%d",&a[i]),maxx=max(maxx,a[i]);
build(rt[0],1,m);
for(int i=1;i<=m;i++) rt[i]=modify(rt[i-1],1,maxx,a[i]);
for(int i=1;i<=kkk;i++)
{
int cur1,cur2,u,v,h;
scanf("%d",&cur1),scanf("%d",&u);
scanf("%d",&cur2),scanf("%d",&v);
scanf("%d",&h);
if(sum[rt[v]]-sum[rt[u-1]]<h)
{
printf("Poor QLW\n");
continue;
}
printf("%d\n",query(rt[u-1],rt[v],1,maxx,h));
}
}
}
using namespace std;
using namespace subtask1;
using namespace subtask2;
int main()
{
scanf("%d%d%d",&n,&m,&kkk);
if(n!=1)
{
subtask1::init();
for(int i=1;i<=kkk;i++)
{
int xx1,xx2,yy1,yy2;
int val;
scanf("%d%d%d%d%d",&xx1,&yy1,&xx2,&yy2,&val);
subtask1::work(xx1,xx2,yy1,yy2,val);
}
}
else
subtask2::work();
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 ...
- [bzoj1926][Sdoi2010]粟粟的书架_二分_主席树
粟粟的书架 bzoj-1926 Sdoi-2010 题目大意:题目链接 注释:略 想法:分成两个题 前面的我们可以二分,直接二分出来检验即可. 对于R=1的,相当一个数列,我们在上面建立主席树. 然后 ...
- 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]粟粟的书架
BZOJ Luogu Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R ...
- BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树
题目描述 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位 ...
- 【刷题】BZOJ 1926 [Sdoi2010]粟粟的书架
Description 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Cormen 的文章.粟粟家中有一个 R行C 列的巨型书架,书 ...
- BZOJ1926:[SDOI2010]粟粟的书架——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1926 https://www.luogu.org/problemnew/show/P2468 幸福幼 ...
- 【BZOJ1926】【SDOI2010】粟粟的书架 [主席树]
粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB[Submit][Status][Discuss] Description 幸福幼儿园 B29 班的粟粟是一 ...
随机推荐
- 解决SharePoint下载文件时自动修改扩展名的问题
今天,有人告诉了我一个有趣的问题.当用户将一个扩展名为.ai的文件(Adobe illustrator格式的文件)上载到SharePoint 2013文档库中之后,点击它下载时,下载提示栏所显示的文件 ...
- linux下echo与time服务的程序实现
一.针对ECHO服务的TCP客户软件的实现 1.网络拓扑结构: 2.源码: #include <stdio.h> #include <stdlib.h> #include &l ...
- 由Strurts2漏洞引开谈谈web代码安全问题
漏洞与补丁齐飞,蓝屏共死机一色. 最近struts2的安全漏洞影响面甚广,此后门为可以在url中直接远程调用脚本的漏洞和一个重定向漏洞.大家可以在s2-016远程执行脚本漏洞和s2-017重定向开放漏 ...
- Python学习笔记_从CSV读取数据写入Excel文件中
本示例特点: 1.读取CSV,写入Excel 2.读取CSV里具体行.具体列,具体行列的值 一.系统环境 1. OS:Win10 64位英文版 2. Python 3.7 3. 使用第三方库:csv. ...
- 数据库版本控制工具:NeXtep Designer
下载地址:http://pan.baidu.com/s/1dFuxKFB NeXtep Open Designer 是一个强大的多人协同/多平台的开源数据库的开发工具,致力于于自动化和生产级的集成开发 ...
- 在git bash中使用命令行调用tortoisegit提交代码或查看日志
Tortoisegit commit / show log命令行 TortoiseGitProc.exe /command:commit TortoiseGitProc.exe /command:lo ...
- Photo3
Story: 这是一个简朴的家,有用旧了的风扇,木制的桌子,桌子上放了未完成的功课,还有一只正在睡觉的猫.阳光从窗户照进来,微风轻轻的吹着.想象你是坐在窗边吹风的小女孩,你的眼睛正眺望着不远处的风景, ...
- Sql的行列转换
创建表scores 一.传统的行列转换 纵表转横表 我们要转成的横表是这样子的: pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用.主要用于行和列的转 ...
- Linux Mint 17 搭建 JSP 环境
一.配置Tomcat 服务器 1.下载 tomcat 2.解压后放到/usr/local目录下面 3.以root权限执行 chmod +x *.sh 4.启动 ./startup.sh#方式1 ./ ...
- Hadoop分布式模式下SSH免密码登录
1.Hadoop中为什么要配置免密码登录 最近在学习Hadoop,在集群中,Hadoop控制脚本依赖SSH来执行针对整个集群的操作.例如,某个脚本能够终止并重启集群中的所有守护进程.所以,需要安装SS ...