题面见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(可持久化,前缀和)的更多相关文章

  1. bzoj1926[Sdoi2010]粟粟的书架 二分 主席树

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MBSubmit: 1064  Solved: 421[Submit][Stat ...

  2. bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926 题面; 1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Se ...

  3. [bzoj1926][Sdoi2010]粟粟的书架_二分_主席树

    粟粟的书架 bzoj-1926 Sdoi-2010 题目大意:题目链接 注释:略 想法:分成两个题 前面的我们可以二分,直接二分出来检验即可. 对于R=1的,相当一个数列,我们在上面建立主席树. 然后 ...

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

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

  5. [SDOI2010]粟粟的书架 [主席树]

    [SDOI2010]粟粟的书架 考虑暴力怎么做 显然是提取出来 (x2-x1+1)*(y2-y1+1) 个数字拿出来 然后从大到小排序 然后就可以按次取数了- 然而接下来看数据范围 \(50\%\ r ...

  6. [BZOJ1926][SDOI2010]粟粟的书架

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

  7. BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树

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

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

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

  9. BZOJ1926:[SDOI2010]粟粟的书架——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1926 https://www.luogu.org/problemnew/show/P2468 幸福幼 ...

  10. 【BZOJ1926】【SDOI2010】粟粟的书架 [主席树]

    粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MB[Submit][Status][Discuss] Description 幸福幼儿园 B29 班的粟粟是一 ...

随机推荐

  1. Apache Log4j 反序列化代码执行(CVE-2019-17571) 漏洞分析

    Apache Log4j 漏洞分析 仅用于研究漏洞原理,禁止用于非法用途,后果自负!!! CVE-2019-17571 漏洞描述 Log4j是美国阿帕奇(Apache)软件基金会的一款基于Java的开 ...

  2. 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 # 设 ...

  3. stlink 下载报错:Error Flash Download failed - "Cortext-M0+"

    stlink 下载报错:Error Flash Download failed - "Cortext-M0+" 解决方法: STM32 ST-LINK Utility 用这个软件把 ...

  4. mysql必知必会--数 据 过 滤

    如何组合 WHERE 子句以建立功能更强的更高级的搜索条件?如何使用 NOT 和 IN 操作符? 组合 WHERE 子句 第6章中介绍的所有 WHERE 子句在过滤数据时使用的都是单一的条 件.为了进 ...

  5. Hook 初学习

    Hook 概念 百度上的概念 每个Hook都有一个相关的指针列表,后加入的Hook再链表的开始,先加入的在链表的尾部 即后加入先获得控制权 Hook 原理 原本的流程 graph LR id1(Mes ...

  6. 在线编辑器(WangEditor)

    自己之前写了一篇关于POI 相关的博客, 想了想在公司中一般常用的不就是上传下载,poi,分页,定时等.好像还有个在线编辑器, 于是自己就花了两个多小时把编辑器相关的代码撸了遍,当然了是先百度找了找资 ...

  7. Markdown数学公式如何打出回归符号

    来源:https://blog.csdn.net/garfielder007/article/details/51646604 函数.符号及特殊字符 语法 效果 语法 效果 语法 效果 \bar{x} ...

  8. Visionpro学习笔记(壹)

    注册4年,第一次发了随笔.我的博客将主要涉及到visionPro软件的学习,labview数据采集方面的思考,c#及VS的学习 此随笔系列主要是关于VisionPro(以后简称VP)的学习及使用. 近 ...

  9. React函数式组件使用Ref

    目录: 简介 useRef forwardRef useImperativeHandle 回调Ref 简介 大家都知道React中的ref属性可以帮助我们获取子组件的实例或者Dom对象,进而对子组件进 ...

  10. 单向链表的简单Java实现-sunziren

    写在前面,csdn的那篇同名博客就是我写的,我把它现在在这边重新发布,因为我实在不想用csdn了,那边的广告太多了,还有就是那个恶心人的“阅读更多”按钮,惹不起我躲得起. 最近面试的过程中,发现有的公 ...