【Luogu】P2468粟粟的书架(主席树+前缀和)
我仿佛中了个爆零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粟粟的书架(主席树+前缀和)的更多相关文章
- [Luogu 3701] 「伪模板」主席树
[Luogu 3701] 「伪模板」主席树 这是一道网络流,不是主席树,不是什么数据结构,而是网络流. 题目背景及描述都非常的暴力,以至于 Capella 在做此题的过程中不禁感到生命流逝. S 向 ...
- bzoj 1926: [Sdoi2010]粟粟的书架 (主席树+二分)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1926 题面; 1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Se ...
- 【BZOJ1926】【SDOI2010】粟粟的书架 [主席树]
粟粟的书架 Time Limit: 30 Sec Memory Limit: 552 MB[Submit][Status][Discuss] Description 幸福幼儿园 B29 班的粟粟是一 ...
- [SDOI2010]粟粟的书架 [主席树]
[SDOI2010]粟粟的书架 考虑暴力怎么做 显然是提取出来 (x2-x1+1)*(y2-y1+1) 个数字拿出来 然后从大到小排序 然后就可以按次取数了- 然而接下来看数据范围 \(50\%\ r ...
- BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)
BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...
- Luogu P2468 [SDOI2010]粟粟的书架
一道二合一的题目.两部分思维难度都不太高,但是也都很巧妙.尤其是主席树的\(50\)分,由于本人初学主席树,所以没有见过主席树上二分的套路,就被小小的卡了一下.. \(n <= 200\) \( ...
- 「Luogu P2468 [SDOI2010]粟粟的书架」
这道题分为两个部分 Part1 前置芝士 前缀和(后缀和,二维前缀和):可以预处理一下数据. 二分查找:可以在较短的时间内找出答案. 具体做法 可以发现\(R,C\)不大,只有\(200\),于是可以 ...
- Luogu Dynamic Ranking (带修改的主席树)
题目大意: 网址:https://www.luogu.org/problemnew/show/2617 给定一个序列a[1].a[2].....a[N],完成M个操作,操作有两种: [1]Q i j ...
- [Luogu] P3701 「伪模板」主席树
题目背景 byx和手气君都非常都非常喜欢种树.有一天,他们得到了两颗奇怪的树种,于是各自取了一颗回家种树,并约定几年后比一比谁种出来的树更加牛x. 题目描述 很快,这棵树就开花结果了.byx和手气君惊 ...
随机推荐
- 【HHHOJ】NOIP2018 模拟赛(二十五) 解题报告
点此进入比赛 得分: \(100+100+20=220\)(\(T1\)打了两个小时,以至于\(T3\)没时间打了,无奈交暴力) 排名: \(Rank\ 8\) \(Rating\):\(+19\) ...
- 【51nod1705】七星剑(成环DP)
点此看题面 大致题意: 你要把一把剑从0星升至7星,有n颗宝石供你选择,第i颗宝石的价值是c[i],用第i颗宝石将剑从k-1星升至k星的成功率是prob[k][i],而失败后会掉lose[k][i], ...
- 优化通过redis实现的一个抢红包流程【下】
上一篇文章通过redis实现的抢红包通过测试发现有严重的阻塞的问题,抢到红包的用户很快就能得到反馈,不能抢到红包的用户很久(10秒以上)都无法获得抢红包结果,起主要原因是: 1.用了分布式锁,导致所有 ...
- antd-design-pro 服务代理问题
公司希望又一个后台管理页面.因为之前技术栈是react 所以选择了antd-design-pro作为后台的框架. 在连调api的时候,困惑怎么去代理.因为网上查到很多都是1.0的版本,而我现在用的是2 ...
- Java 对数组的筛选
在Java里面 一般对一个数组进行筛选,去剔除一些元素,一般做法是用临时数组来存储,把符合条件的元素加入到新数组中,虽然数组有移除的方法但是 是线程不安全的: 而用迭代器Iterator,可以在遍历的 ...
- 2D和3D效果
<style type="text/css"> #div1{ width: 200px; height: 200px; background-color:#aaa; c ...
- linux关于权限
用户权限:drwxr-x---. 8 root root 4096 8月 6 23:18 mnt 第一个root:所有者 即root用户第二个root:所有者所在的组mnt:所有者创建的文件夹Rwx: ...
- 5-1 json模块
1.json.loads(json_str) 把字符串(json串)转成字典 import json # 解析json的 json_str = ''' {"name":" ...
- 阻止touchslider事件冒泡,防止左右滑动时出发全局滑动事件
最近适用mui开发一个项目,全局有个侧滑菜单offCanvasSideScroll,首页用了一个touchslider插件来实现行的左右滚动 touchslider的当滚动方向与侧滑菜单滚动方向一致时 ...
- JavaScriptDate(日期)
如何使用Date()方法获取当日的日期. getFullYear(): 使用getFullYear()获取年份. getTime(): getTime()返回1970年1月1日至今的毫秒数. setF ...