BZOJ 2653: middle(主席树+二分答案)
解题思路
首先可以想到一种暴力做法,就是询问时二分,然后大于等于这个值的设为1,否则设为-1,然后就和GSS1那样统计答案。但是发现这样时间空间复杂度都很爆炸,所以考虑预处理,可以用主席树来做了。以\(rt[i]\)为根线段树维护二分的答案为\(i\)的线段树,线段树下标是位置。处理的时候就排一遍序,然后每次\(mid+1\)的时候发现只有\(mid\)这个位置的值要变成\(-1\),所以可以直接处理。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=20005;
const int M=N*20;
template<class T> void rd(T &x){
x=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
}
inline int qmax(int x,int y){return x>y?x:y;}
int n,m,a[N],id[N],lx[M],rx[M],sum[M],ls[M],rs[M],tot,rt[N];
int q[10];
inline bool cmp(int x,int y){return a[x]<a[y];}
void build(int &x,int l,int r){
x=++tot;int mid=(l+r)>>1;
if(l==r) {sum[x]=lx[x]=rx[x]=1;return ;}
build(ls[x],l,mid);build(rs[x],mid+1,r);
sum[x]=sum[ls[x]]+sum[rs[x]];
lx[x]=rx[x]=sum[x];
}
void update(int pre,int &x,int l,int r,int k){
x=++tot;sum[x]=sum[pre];rx[x]=rx[pre];
ls[x]=ls[pre];rs[x]=rs[pre];lx[x]=lx[pre];
if(l==r) {lx[x]=rx[x]=sum[x]=-1;return ;}
int mid=(l+r)>>1;
if(k<=mid) update(ls[pre],ls[x],l,mid,k);
else update(rs[pre],rs[x],mid+1,r,k);
sum[x]=sum[ls[x]]+sum[rs[x]];
lx[x]=qmax(lx[ls[x]],sum[ls[x]]+lx[rs[x]]);
rx[x]=qmax(rx[rs[x]],sum[rs[x]]+rx[ls[x]]);
}
int query_sum(int x,int l,int r,int L,int R){
if(L>R) return 0;
if(L<=l && r<=R) return sum[x];
int mid=(l+r)>>1,ret=0;
if(L<=mid) ret+=query_sum(ls[x],l,mid,L,R);
if(mid<R) ret+=query_sum(rs[x],mid+1,r,L,R);
return ret;
}
int query_lx(int x,int l,int r,int L,int R){
if(L<=l && r<=R) return lx[x];
int mid=(l+r)>>1;
if(L>mid) return query_lx(rs[x],mid+1,r,L,R);
else if(mid>=R) return query_lx(ls[x],l,mid,L,R);
else return qmax(query_lx(ls[x],l,mid,L,R),query_sum(ls[x],l,mid,L,R)+query_lx(rs[x],mid+1,r,L,R));
}
int query_rx(int x,int l,int r,int L,int R){
if(L<=l && r<=R) return rx[x];
int mid=(l+r)>>1;
if(L>mid) return query_rx(rs[x],mid+1,r,L,R);
else if(mid>=R) return query_rx(ls[x],l,mid,L,R);
else return qmax(query_rx(rs[x],mid+1,r,L,R),query_sum(rs[x],mid+1,r,L,R)+query_rx(ls[x],l,mid,L,R));
}
inline bool check(int lim){
int ret=0;
ret+=query_sum(rt[lim],1,n,q[2]+1,q[3]-1);
ret+=query_lx(rt[lim],1,n,q[3],q[4]);
ret+=query_rx(rt[lim],1,n,q[1],q[2]);
return ret>=0?1:0;
}
int main(){
rd(n);int lstans=0;
for(int i=1;i<=n;i++) rd(a[i]),id[i]=i;
sort(id+1,id+1+n,cmp);build(rt[1],1,n);sort(a+1,a+1+n);
for(int i=2;i<=n+1;i++) update(rt[i-1],rt[i],1,n,id[i-1]);
for(rd(m);m;m--){
rd(q[1]);rd(q[2]);rd(q[3]);rd(q[4]);
q[1]=(q[1]+lstans)%n+1;q[2]=(q[2]+lstans)%n+1;
q[3]=(q[3]+lstans)%n+1;q[4]=(q[4]+lstans)%n+1;
sort(q+1,q+1+4);int L=1,R=n,mid;
while(L<=R){
mid=(L+R)>>1;
if(check(mid)) lstans=mid,L=mid+1;
else R=mid-1;
}
printf("%d\n",a[lstans]);lstans=a[lstans];
}
return 0;
}
BZOJ 2653: middle(主席树+二分答案)的更多相关文章
- bzoj 2653: middle (主席树+二分)
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2522 Solved: 1434[Submit][Status][Disc ...
- BZOJ 2653: middle 主席树 二分
https://www.lydsy.com/JudgeOnline/problem.php?id=2653 因为是两个方向向外延伸所以不能对编号取前缀和(这里只有前缀和向后传递的性质,不是实际意义的和 ...
- BZOJ 2653: middle [主席树 中位数]
传送门 题意: 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右 ...
- BZOJ 2653 middle | 主席树
题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2653 题解: 设答案为ans,把大于等于ans的记为1,小于的记为-1,这样可以知道当前an ...
- bzoj 2653 middle(主席树)
题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...
- BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)
BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...
- 【bzoj2653】【middle】【主席树+二分答案】
Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...
- BZOJ 4556 [Tjoi2016&Heoi2016]字符串 ——后缀数组 ST表 主席树 二分答案
Solution 1: 后缀数组暴力大法好 #include <map> #include <cmath> #include <queue> #include &l ...
- [BZOJ2653]middle 主席树+二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2042 Solved: 1123[Submit][Status][Disc ...
随机推荐
- tree 解题报告
tree 对于 \(n\) 个点带标号的无根森林,计算所有森林的树的个数的 \(k\) 次方,对 \(998244353\) 取模. 自闭,错了一堆关于长度的问题,这里以后一定要注意 比如需要 \(n ...
- jquery设置、判断、获取input单选标签选中状态
1.设置某项单选input为选中状态: $("input[type='radio']").eq(1).attr('checked',true); ②也可设其属性checked为'c ...
- CF 936C Lock Puzzle——构造
题目:http://codeforces.com/contest/936/problem/C 玩了一个小时,只能想出 5*n 的方法. 经过一番观察?考虑这样构造:已经使得 A 串的一个后缀 = B ...
- Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class
Aspect-Oriented Programming : Aspect-Oriented Programming with the RealProxy Class A well-architecte ...
- centos查看磁盘空间大小
查看磁盘空间大小 df -h 查看当前文件夹所有文件大小 du -sh 查看指定文件夹大小 du -h /data 查看指定文件夹下所有文件的大小 du -h /data/ 查看指定文件大小 du - ...
- VSphere随笔 - vCenter6.5安装配置手册
一.前期准备: 1.物理机准备 一台已安装了ESXI虚拟化系统的机器: 2.DNS服务器准备 新建一台DNS服务器,添加vcenter的双向解析. (1)安装一台win2008的机器 (2)开启DNS ...
- 测开之路四十:jQuery基本用法
从cdn引入jQuery库:https://www.bootcdn.cn/,搜索jQuery 在html里面(使用之前计算器的脚本),把复制的标签粘贴到引入js标签的前面:<script src ...
- https中引用http
https里引用http不安全,会报错 解决方案 1.可以部署在http中,http中引用https不会存在安全问题报错 2.https中引用https,把需要引用的http部署成https
- appium常见问题09_MAC打开uiautimatorviewer闪退怎么办?
问题: 下载安装Android SDK后,并且已在.bash_profile文件中配置环境变量.但是在tools中打开定位工具uiautomatorviewer出现闪退. 解决: 首先检查环境变量配置 ...
- cita 源码研究
适用环境 vim + YouCompleteMe 使用 github 源,不能使用 ustc 源 git clone --depth 1 --recusive https://github.com/k ...