题面见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. [20200129]子光标不共享BIND_EQUIV_FAILURE.txt

    [20200129]子光标不共享BIND_EQUIV_FAILURE.txt --//生产系统再次遇到大量BIND_EQUIV_FAILURE原因导致子光标的情况.我看了我以前测试遇到的情况.--// ...

  2. 查找第K大的值

    这种题一般是给定N个数,然后N个数之间通过某种计算得到了新的数列,求这新的数列的第K大的值 POJ3579 题意: 用$N$个数的序列$x[i]$,生成一个新序列$b$. 新的序列定义为:对于任意的$ ...

  3. Winfrom中From控件的重绘

    重绘目的: 1. 满足非默认主题下的标题栏样式 2. 在保留停靠功能的同时进行重绘. 代码如下: public partial class FormEx: Form { public FormEx() ...

  4. Win10多用户同时登陆远程桌面

    想记录一下最近解决的一些问题,发现还是博客最合适,虽然之前从来没写过,希望以后能养成这个好习惯. 家里有一台台式机装着Win10,还有一台macbook,平时遇到需要用Win系统又不想坐在书桌前时,我 ...

  5. 【Android】WebDav For Android

    最近在写一个云备份功能,参考了一下市面上的软件,发现有一种采用WebDav协议的云备份成本比较低,故特地研究一下使用. 服务器提供商是使用国内的坚果云,还是非常良心的. 坚果云官网:https://w ...

  6. vue(二)--条件语句

    条件语句:v-if     v-else   v-else-if    v-show v-else .v-else-if 必须跟在 v-if 或者 v-else-if之后. 1.v-if <bo ...

  7. HTML指定页面编码

    HTML指定页面编码 <meta charset="UTF-8" />

  8. cisco 添加静态路由

    静态路由:由人,手动写出的路由条目就叫静态路由,永久有效,优先级最高,效率最高. 路由器是干啥的? 连接不同地址段的网络.屏蔽不同地址段的网络广播. 路由器有多个接口,至少得有2个吧,一边一个局域网. ...

  9. python学习随笔2:python判断和循环

    1.if-else _username = 'heyue' _password = ' username = input("username:") password = input ...

  10. Lucene搜索引擎入门

    一.什么是全文检索?            就是在检索数据,数据的分类:                在计算机当中,比如说存在磁盘的文本文档,HTML页面,Word文档等等......       ...