题目链接

  我仿佛中了个爆零debuff

  本题分成两部分,五十分用前缀和,f[i][j][k]表示(1,1)到(i,j)的矩形大于等于k的有多少个数(再记录页数和),查询时二分,另外的用主席树,类似方法二分求解,

  细节很多需要注意。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#include<cstdlib>
#define maxr 220
#define maxc 550000
#define maxv 1000
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} int d[maxr][maxr][maxv+],s[maxr][maxr][maxv+];
int tree[maxc*],root[maxc],ls[maxc*],rs[maxc*],tot,size[maxc*];
int q[maxr][maxr]; int r,c,m; int asks(int xa,int ya,int xb,int yb,int x){ return d[xb][yb][x]-d[xa-][yb][x]-d[xb][ya-][x]+d[xa-][ya-][x]; }
int askn(int xa,int ya,int xb,int yb,int x){ return s[xb][yb][x]-s[xa-][yb][x]-s[xb][ya-][x]+s[xa-][ya-][x]; } void solve1(){
for(int i=;i<=r;++i)
for(int j=;j<=c;++j) q[i][j]=read();
for(int k=;k<=maxv;++k)
for(int i=;i<=r;++i)
for(int j=;j<=c;++j){
bool flag=;
if(q[i][j]<k) flag=;;
d[i][j][k]=d[i-][j][k]+d[i][j-][k]-d[i-][j-][k]+(flag==?q[i][j]:);
s[i][j][k]=s[i-][j][k]+s[i][j-][k]-s[i-][j-][k]+(flag==?:);
}
while(m--){
int xa=read(),ya=read(),xb=read(),yb=read(),x=read();
if(asks(xa,ya,xb,yb,)<x){
printf("Poor QLW\n");
continue;
}
int lef=,rig=maxv,ans=-;
while(lef<=rig){
int mid=(lef+rig)>>;
//printf("%d>>>%d\n",asks(xa,ya,xb,yb,mid),mid);
if(asks(xa,ya,xb,yb,mid)>=x){
ans=mid;
lef=mid+;
}
else rig=mid-;
}
if(ans==-) printf("Poor QLW\n");
else printf("%d\n",askn(xa,ya,xb,yb,ans)-(asks(xa,ya,xb,yb,ans)-x)/ans);
}
} inline void update(int &o,int last,int lef,int rig,int p){
o=++tot; ls[o]=ls[last]; rs[o]=rs[last]; tree[o]=tree[last]+p; size[o]=size[last]+;
if(lef==rig) return;
int mid=(lef+rig)>>;
if(p<=mid) update(ls[o],ls[last],lef,mid,p);
else update(rs[o],rs[last],mid+,rig,p);
} void solve2(){
for(int i=;i<=c;++i){
int x=read();
update(root[i],root[i-],,maxv,x);
}
while(m--){
int xa=read(),ya=read(),xb=read(),yb=read(),x=read();
if(tree[root[yb]]-tree[root[ya-]]<x){
printf("Poor QLW\n");
continue;
}
register int lef=,rig=maxv,a=root[ya-],b=root[yb],ans=;
while(lef<rig){
register int mid=(lef+rig)>>;
if(tree[rs[b]]-tree[rs[a]]>=x){
lef=mid+;
a=rs[a]; b=rs[b];
}
else{
x-=tree[rs[b]]-tree[rs[a]];
ans+=size[rs[b]]-size[rs[a]];
rig=mid;
a=ls[a]; b=ls[b];
}
}
ans+=(x+lef-)/lef;
printf("%d\n",ans);
}
return;
} int main(){
r=read(),c=read(),m=read();
if(r!=) solve1();
else solve2();
return ;
}

【Luogu】P2468粟粟的书架(主席树+前缀和)的更多相关文章

  1. [Luogu 3701] 「伪模板」主席树

    [Luogu 3701] 「伪模板」主席树 这是一道网络流,不是主席树,不是什么数据结构,而是网络流. 题目背景及描述都非常的暴力,以至于 Capella 在做此题的过程中不禁感到生命流逝. S 向 ...

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

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

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

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

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

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

  5. BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)

    BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...

  6. Luogu P2468 [SDOI2010]粟粟的书架

    一道二合一的题目.两部分思维难度都不太高,但是也都很巧妙.尤其是主席树的\(50\)分,由于本人初学主席树,所以没有见过主席树上二分的套路,就被小小的卡了一下.. \(n <= 200\) \( ...

  7. 「Luogu P2468 [SDOI2010]粟粟的书架」

    这道题分为两个部分 Part1 前置芝士 前缀和(后缀和,二维前缀和):可以预处理一下数据. 二分查找:可以在较短的时间内找出答案. 具体做法 可以发现\(R,C\)不大,只有\(200\),于是可以 ...

  8. Luogu Dynamic Ranking (带修改的主席树)

    题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...

  9. [Luogu] P3701 「伪模板」主席树

    题目背景 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 题目描述 很快,这棵树就开花结果了.byx和手气君惊 ...

随机推荐

  1. C语言 数组名不是首地址指针

    今天上计算机系统课的时候老师讲到了C中的聚合类型的数据结构.在解释数组名的时候说"数组名是一个指针,指向该数组的第一个元素",附上ppt(第二行): 我觉得这是不正确的,是一个常见 ...

  2. IPython安装过程 @win7 64bit

    http://www.360doc.com/content/14/0902/11/16740871_406476389.shtml 为了测验测验一下IPython的应用,今天折腾了好久的从安装包msi ...

  3. Bootstrap 历练实例 - 折叠(Collapse)插件方法

    方法 下面是一些折叠(Collapse)插件中有用的方法: 方法 描述 实例 Options:.collapse(options) 激活内容为可折叠元素.接受一个可选的 options 对象. $(' ...

  4. ajax 的 promise

    $.when().done().fail() $.when($.ajax("test1.html"),$.ajax("test2.html")).done(fu ...

  5. 数据结构期末复习( はち)--VOA图关键路径求法

    题目如下图: 注:将123456当成abcdef. 事件最早发生事件求法:找从原点到该事件的最长路径(从前往后推) 对a:Ve=0 对b:Ve=max{ 2 , 15+4 }=19 对c:Ve=15 ...

  6. 初识Java程序,编写简单代码?

    Dear All: 初识Java程序,编写简单代码? 首先小编在这里说下我们今天编写Java程序使用的是 eclipse 开发工具! 1.下载eclipse 官网地址:http://www.eclip ...

  7. Java - 若try中有return语句,finally会执行吗?在return之前还是之后呢?

    会执行,在方法return动作之前,return语句执行之后,若finally中再有return语句,则此方法以finally的return作为最终返回,若finally中无return语句,则此方法 ...

  8. HTML5/CSS3 第二章页面组件

    页面组件 1 元素的尺寸/边框/背景 1.1 css尺寸相关属性 height 高度 min-height 最小高度 max-height 最大高度 width 宽度 min-width 最小宽度 m ...

  9. 【PHP】根据两地经纬度计算距离

    最近做一个H5活动的项目,有个要求是必须现场玩家才能参与,所以就需要计算玩家位置和活动地点的距离来判断是否在活动现场. 以下是写的一个根据经纬度计算两地距离的方法 1 function getDist ...

  10. JS的四舍五入问题

    最近踩了一个坑,mark一下toFixed四舍五入问题,详见代码: var myFixed = function(num, fix) { num = (parseFloat(num) * + ) / ...