题目链接

  我仿佛中了个爆零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++之RAII惯用法

    http://blog.csdn.net/hunter8777/article/details/6327704 C++中的RAII全称是“Resource acquisition is initial ...

  2. python_71_json序列化1

    #序列化:序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程. #本例把字典数据类型存成字符串存在硬盘 #文件只能存字符串和二进制码,字典之类的不可以 info={ ...

  3. python_25_string

    name="my name is 齐志光qizhiguang" print(name.capitalize())#首字母变大写 print(name.count('i'))#统计字 ...

  4. python_20_列表

    #1 names=["QiZhiguang","DaiYang","HuZhongtao","ZhangDong"] p ...

  5. 操作系统(6)_虚拟存储管理_李善平ppt

    image含各种段. 有些不需要的页可能永远不需要装入内存,可能只有百分之70-80是异常情况采用的,这种代码就可以放入硬盘. 抖动实际就是进程数太多导致内存不够用造成的. 页面换入换出在内存和磁盘之 ...

  6. 1269: [AHOI2006]文本编辑器editor

    Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 5269  Solved: 2037[Submit][Status][Discuss] Descript ...

  7. Uva 填充正方形

    暴力出奇迹 #include<iostream> #include<cstdio> using namespace std; +; int T,n; char S[maxn][ ...

  8. 基础篇(2):c++顺序结构程序设计

    一个程序最基本的结构莫过于3种:顺序,选择,循环.这篇讲讲顺序结构. c++语言的运算符与表达式数量之多,在高级语言中是少见的,也使得它的语言功能十分完善. c++的运算符有单目与双目之分(作用于一个 ...

  9. PAT 乙级 1044

    题目 题目地址:PAT 乙级 1044 思路 简单的进制转化问题,根据题意进行相应的进制转化即可,因为题目已经划定了数据的求解范围,甚至连进制转化中的循环都不需要,进行简单计算就可以得出结果: 但本题 ...

  10. 三 python并发编程之多线程-重点

    一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 二 开启线程的两种方式 #方式一 from th ...