SDOI2010 粟粟的书架 lg2468(可持久化,前缀和)
题面见https://www.luogu.org/problemnew/show/P2468
然后这道题属于合二为一题,看一眼数据范围就能发现
首先我们先考虑50分,二维前缀和维护一下(反正我不记得公式,手推了半天)
tot[i][j][k]表示矩阵(1,1)到(i,j)中数值大等于k的总和
num[i][j][k]表示矩阵(1,1)到(i,j)中数值大等于k的个数
那么做法也就显而易见了,二分k的值进行check
最后注意一个小问题,就是有可能一个k值有多个点,而我不需要全选就能满足条件,这个可以自行理解一下
后百分之五十,一开始口胡了一个一维前缀和的做法,貌似是两个log,然而我在学可持久化数据结构,不能偷懒
思考了一下,开一棵权值线段树,把它变成主席树,根x代表插入了第x个数后的情况
然后建树,更新都是裸的操作
关于查询我的想法我写在了代码里,想不通的可以看一下
// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int w=,f=;
char ch=getchar();
while(ch<''||ch>''){
if(ch=='-') f=-;
ch=getchar();
}
while(ch>=''&&ch<=''){
w=(w<<)+(w<<)+ch-;
ch=getchar();
}
return w*f;
}
int n,m,q,a[][],tot[][][],num[][][],ans,cnt,root[],b[];
int get_sum(int x1,int y1,int x2,int y2,int k,int f)
{
if(f==)return tot[x2][y2][k]-tot[x2][y1-][k]-tot[x1-][y2][k]+tot[x1-][y1-][k];
else return num[x2][y2][k]-num[x2][y1-][k]-num[x1-][y2][k]+num[x1-][y1-][k];
}
inline void work2(){//二维前缀和大力维护,口胡了一下写在上面了,就不多解释了,着重看主席树
int i,j,k,maxx=;
for(i=;i<=n;i++){
for(j=;j<=m;j++){
a[i][j]=read();maxx=max(maxx,a[i][j]);
}
}
for(k=;k<=maxx;k++){
for(i=;i<=n;i++){
for(j=;j<=m;j++){
tot[i][j][k]=tot[i-][j][k]+tot[i][j-][k]-tot[i-][j-][k]+(a[i][j]>=k)*a[i][j];
num[i][j][k]=num[i-][j][k]+num[i][j-][k]-num[i-][j-][k]+(a[i][j]>=k);
}
}
}
while(q--){
int x1,y1,x2,y2,h;
x1=read();y1=read();x2=read();y2=read();h=read();
if(get_sum(x1,y1,x2,y2,,)<h) puts("Poor QLW");
else{
int l=,r=maxx+;ans=-;
while(l<=r){
int mid=(l+r)>>;
if(get_sum(x1,y1,x2,y2,mid,)>=h){
ans=mid;l=mid+;
}
else r=mid-;
}
printf("%d\n",get_sum(x1,y1,x2,y2,ans,)-(get_sum(x1,y1,x2,y2,ans,)-h)/ans);
}
}
}
struct Node{
int ls,rs,sum,size;
}st[];
inline int build(int l,int r){
int pos=cnt++;
if(l==r) return pos;
int mid=(l+r)>>;
st[pos].ls=build(l,mid);
st[pos].rs=build(mid+,r);
return pos;
}//常规建树
inline int update(int tim,int l,int r,int x){//tim表示历史版本,l,r为范围,x为我当前插入的数
int pos=cnt++;
st[pos]=st[tim];st[pos].size++;st[pos].sum+=x;//这个节点的size+1,sum+=x
if(l==r) return pos;//到叶子了,大力返回就好
int mid=(l+r)>>;
if(x<=mid) st[pos].ls=update(st[tim].ls,l,mid,x);
else st[pos].rs=update(st[tim].rs,mid+,r,x);
return pos;
}
inline int query(int l,int r,int fir,int sec,int w){//具体解释见下方
if(l==r) return (w-)/l+;//可能不会整除,就这么处理一下就好了
int mid=(l+r)>>;int x=st[st[sec].rs].sum-st[st[fir].rs].sum;
if(w<=x) return query(mid+,r,st[fir].rs,st[sec].rs,w);
else return st[st[sec].rs].size-st[st[fir].rs].size+query(l,mid,st[fir].ls,st[sec].ls,w-x);
}
/*
这棵主席树是基于权值线段树的,权值的范围只有1k
主席树维护了历史版本的权值线段树上的size和sum
然后关于建树和更新都没什么新意
查询这个我一开始不能很好的理解,那么我现在稍微解释一下我的思路
首先l,r,fir,sec,w分别表示区间,版本号,还需要多少值
然后大多数题查询的时候都是向左子树查一下,比一下大小
这里查右子树是因为这是一棵权值线段树,我们希望尽量少地选点,也就意味着选的数要尽可能大
那么能选右子树(也就是值更大的点),当然选大的啊
如果右子树总和够,就往右子树走,不够的话,算上右子树,往左子树走
*/
inline void work1()
{
int maxw=-1e9-;
for(int i=;i<=m;i++) b[i]=read(),maxw=max(b[i],maxw);
root[]=build(,maxw+);
for(int i=;i<=m;i++) root[i]=update(root[i-],,maxw,b[i]);
for(int i=;i<=q;i++)
{
int y1,y2,h;y1=read(),y1=root[read()-],y2=read(),y2=root[read()],h=read();
if(st[y2].sum-st[y1].sum<h){puts("Poor QLW");continue;}
printf("%d\n",query(,maxw,y1,y2,h));
}
}
int main(){
n=read();m=read();q=read();
if(n!=){//合二为一辣鸡题
work2();
}
else work1();
return ;
}
SDOI2010 粟粟的书架 lg2468(可持久化,前缀和)的更多相关文章
- 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 班的粟粟是一 ...
随机推荐
- Apache Log4j 反序列化代码执行(CVE-2019-17571) 漏洞分析
Apache Log4j 漏洞分析 仅用于研究漏洞原理,禁止用于非法用途,后果自负!!! CVE-2019-17571 漏洞描述 Log4j是美国阿帕奇(Apache)软件基金会的一款基于Java的开 ...
- win10安装两个不同版本的mysql(mysql5.7和mysql-8.0.19)
win10中安装mysql5.7后,安装mysql-8.0.19 在D:\mysql-8.0.19-winx64目录下创建一个my.ini文件 [mysqld] # 设置3307端口 port # 设 ...
- stlink 下载报错:Error Flash Download failed - "Cortext-M0+"
stlink 下载报错:Error Flash Download failed - "Cortext-M0+" 解决方法: STM32 ST-LINK Utility 用这个软件把 ...
- mysql必知必会--数 据 过 滤
如何组合 WHERE 子句以建立功能更强的更高级的搜索条件?如何使用 NOT 和 IN 操作符? 组合 WHERE 子句 第6章中介绍的所有 WHERE 子句在过滤数据时使用的都是单一的条 件.为了进 ...
- Hook 初学习
Hook 概念 百度上的概念 每个Hook都有一个相关的指针列表,后加入的Hook再链表的开始,先加入的在链表的尾部 即后加入先获得控制权 Hook 原理 原本的流程 graph LR id1(Mes ...
- 在线编辑器(WangEditor)
自己之前写了一篇关于POI 相关的博客, 想了想在公司中一般常用的不就是上传下载,poi,分页,定时等.好像还有个在线编辑器, 于是自己就花了两个多小时把编辑器相关的代码撸了遍,当然了是先百度找了找资 ...
- Markdown数学公式如何打出回归符号
来源:https://blog.csdn.net/garfielder007/article/details/51646604 函数.符号及特殊字符 语法 效果 语法 效果 语法 效果 \bar{x} ...
- Visionpro学习笔记(壹)
注册4年,第一次发了随笔.我的博客将主要涉及到visionPro软件的学习,labview数据采集方面的思考,c#及VS的学习 此随笔系列主要是关于VisionPro(以后简称VP)的学习及使用. 近 ...
- React函数式组件使用Ref
目录: 简介 useRef forwardRef useImperativeHandle 回调Ref 简介 大家都知道React中的ref属性可以帮助我们获取子组件的实例或者Dom对象,进而对子组件进 ...
- 单向链表的简单Java实现-sunziren
写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 最近面试的过程中,发现有的公 ...