BZOJ 2653: middle 主席树 二分
https://www.lydsy.com/JudgeOnline/problem.php?id=2653
因为是两个方向向外延伸所以不能对编号取前缀和(这里只有前缀和向后传递的性质,不是实际意义的和),那么对排序后的数字取前缀和,线段树维护编号然后二分就可以了。
在一个值相对的线段树中,数小于该值的位置视为-1,数大于等于该值的位置视为+1. 那么当可取的区间内可以的到的最大的和>=0时该数就是合法的。
维护lmx, rmx, sum三个值分别表示该区间从左向右能得到的最大前缀和、从右向左能得到的最大前缀和、区间和。
二分到区间没有的数也没有关系,二分终究会收敛到区间中存在的数。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define LL long long
#define pa pair<int,int>
const int maxn=;
pa a[maxn];
int n,m;
int q[]={};
int rt[maxn]={};
int siz[maxn*]={},lmx[maxn*]={},rmx[maxn*]={},lc[maxn*]={},rc[maxn*]={},tot=;
inline void updata(int x){
siz[x]=siz[lc[x]]+siz[rc[x]];
lmx[x]=max(lmx[lc[x]],siz[lc[x]]+lmx[rc[x]]);
rmx[x]=max(rmx[rc[x]],siz[rc[x]]+rmx[lc[x]]);
}
void build(int &x,int l,int r){
x=++tot; siz[x]=lmx[x]=rmx[x]=(r-l+);
if(l==r)return;
int mid=(l+r)/;
build(lc[x],l,mid);
build(rc[x],mid+,r);
}
void inser(int &x,int y,int l,int r,int z){
x=++tot;siz[x]=siz[y];lmx[x]=lmx[y];rmx[x]=rmx[y];lc[x]=lc[y];rc[x]=rc[y];
if(l==r){siz[x]=-;lmx[x]=;rmx[x]=;return;}
int mid=(l+r)/;
if(z<=mid) inser(lc[x],lc[y],l,mid,z);
else inser(rc[x],rc[y],mid+,r,z);
updata(x);
}
int getsum(int x,int l,int r,int zl,int zr){
if(zl>zr)return ;
if(zl<=l&&r<=zr){return siz[x];}
int mid=(l+r)/,ans=;
if(zl<=mid)ans=getsum(lc[x],l,mid,zl,zr);
if(mid<zr)ans+=getsum(rc[x],mid+,r,zl,zr);
return ans;
}
int getl(int x,int l,int r,int zl,int zr){
if(zl>zr)return ;
if(zl<=l&&r<=zr)return lmx[x];
int mid=(l+r)/,ans=;
if(zl<=mid)ans=getl(lc[x],l,mid,zl,zr);
if(mid<zr)ans=max(ans,getl(rc[x],mid+,r,zl,zr)+getsum(lc[x],l,mid,zl,mid));
return ans;
}
int getr(int x,int l,int r,int zl,int zr){
if(zl>zr)return ;
if(zl<=l&&r<=zr)return rmx[x];
int mid=(l+r)/,ans=;
if(mid<zr)ans=getr(rc[x],mid+,r,zl,zr);
if(zl<=mid)ans=max(ans,getr(lc[x],l,mid,zl,zr)+getsum(rc[x],mid+,r,mid+,zr));
return ans;
}
bool check(int x){
int z=getsum(rt[x],,n,q[],q[]);//cout<<z<<endl;
int w=getl(rt[x],,n,q[]+,q[]);//cout<<w<<endl;
int k=getr(rt[x],,n,q[],q[]-);//cout<<k<<endl;
if(z+w+k>=)return ;
else return ;
}
inline int find(){
int l=,r=n,mid;
while(l<r){
mid=(l+r+)/;
if(check(mid))l=mid;
else r=mid-;
}return l;
}
int main(){
scanf("%d",&n);
int x;
for(int i=;i<=n;i++){ scanf("%d",&x); a[i]=make_pair(x,i); }
sort(a+,a++n);build(rt[],,n);
for(int i=;i<=n;i++){ rt[i]=rt[i-];inser(rt[i],rt[i],,n,a[i-].second); }
int ans=;scanf("%d",&m);
for(int i=;i<=m;i++){
scanf("%d%d%d%d",&q[],&q[],&q[],&q[]);
q[]=(q[]+ans)%n+;q[]=(q[]+ans)%n+;
q[]=(q[]+ans)%n+;q[]=(q[]+ans)%n+;
sort(q,q+);ans=a[find()].first;
printf("%d\n",ans);
}
return ;
}
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(主席树+二分答案)
传送门 解题思路 首先可以想到一种暴力做法,就是询问时二分,然后大于等于这个值的设为1,否则设为-1,然后就和GSS1那样统计答案.但是发现这样时间空间复杂度都很爆炸,所以考虑预处理,可以用主席树来做 ...
- bzoj 2653 middle(主席树)
题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...
- 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 ...
- [BZOJ2653]middle 主席树+二分
2653: middle Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2042 Solved: 1123[Submit][Status][Disc ...
- [BZOJ 2653] middle(可持久化线段树+二分答案)
[BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...
- BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)
题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...
- 2018湘潭邀请赛C题(主席树+二分)
题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...
随机推荐
- JavaScript 优雅的实现方式包含你可能不知道的知识点
有些东西很好用,但是你未必知道:有些东西你可能用过,但是你未必知道原理. 实现一个目的有多种途径,俗话说,条条大路通罗马.很多内容来自平时的一些收集以及过往博客文章底下的精彩评论,收集整理拓展一波,发 ...
- 关于Unix/Linux的终端、伪终端、控制台和shell
历史是什么:是过去传到将来的回声,是将来对过去的反映. ——雨果(法)<笑面人> 阅读本文大概需要花费你15分钟 文章导航: 计算机的发展 UNIX系统的诞生 UNIX系统的发展 终端与控 ...
- 小白欢乐多——记ssctf的几道题目
小白欢乐多--记ssctf的几道题目 二哥说过来自乌云,回归乌云.Web400来源于此,应当回归于此,有不足的地方欢迎指出. 0x00 Web200 先不急着提web400,让我们先来看看web200 ...
- imperva-代理安装
首先创建网关上面的监听端口
- 18 - csv文件-ini文件处理
目录 1 CSV文件 1.1 手动生成一个csv文件 1.2 cvs模块 1.2.1 reader方法 1.2.2 writer方法 2 ini文件处理 2.1 configparser模块 2.2 ...
- openjudge-NOI 2.5-1700 八皇后问题
题目链接:http://noi.openjudge.cn/ch0205/1700/ 题解: 经典深搜题目…… #include<cstdio> ][]; int num; void pri ...
- mybatis比hibernate处理速度快的原因
mybatis:是面向结果集的.当要展示的页面需要几个字段时,springmvc会提供这几个字段并将其拼接成结果集,在转化为相应的对象. hibernate:是面向对象的.要展示的页面需要某些字段时, ...
- 【前端vue开发】vue开发watch检测的使用
<span style="color:#006600;"><div id="app"> <input type="tex ...
- python网络编程-paramiko
python基础学习日志day8-paramiko 一:简介 Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 现有这样的需求:需要使用windows客户端,远程连 ...
- python2.7
python2.7支持win32.win64 下载地址:http://pan.baidu.com/s/1dE39eQ9 初学,附一个牛人的python教程地址:http://www.liaoxuefe ...