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 主席树 二分的更多相关文章

  1. bzoj 2653: middle (主席树+二分)

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2522  Solved: 1434[Submit][Status][Disc ...

  2. BZOJ 2653: middle(主席树+二分答案)

    传送门 解题思路 首先可以想到一种暴力做法,就是询问时二分,然后大于等于这个值的设为1,否则设为-1,然后就和GSS1那样统计答案.但是发现这样时间空间复杂度都很爆炸,所以考虑预处理,可以用主席树来做 ...

  3. bzoj 2653 middle(主席树)

    题面:https://vjudge.net/problem/HYSBZ-2653 博客:https://blog.csdn.net/litble/article/details/78984846 这个 ...

  4. BZOJ 2653: middle [主席树 中位数]

    传送门 题意: 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你一个 长度为n的序列s.回答Q个这样的询问:s的左端点在[a,b]之间,右 ...

  5. BZOJ 2653 middle | 主席树

    题目: http://www.lydsy.com/JudgeOnline/problem.php?id=2653 题解: 设答案为ans,把大于等于ans的记为1,小于的记为-1,这样可以知道当前an ...

  6. [BZOJ2653]middle 主席树+二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 2042  Solved: 1123[Submit][Status][Disc ...

  7. [BZOJ 2653] middle(可持久化线段树+二分答案)

    [BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...

  8. BZOJ.1926.[SDOI2010]粟粟的书架(前缀和 主席树 二分)

    题目链接 题意: 在给定矩形区域内找出最少的数,满足和>=k.输出数的个数.两种数据范围. 0~50 注意到(真没注意到...)P[i,j]<=1000,我们可以利用前缀和预处理. num ...

  9. 2018湘潭邀请赛C题(主席树+二分)

    题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...

随机推荐

  1. 小白欢乐多——记ssctf的几道题目

    小白欢乐多--记ssctf的几道题目 二哥说过来自乌云,回归乌云.Web400来源于此,应当回归于此,有不足的地方欢迎指出. 0x00 Web200 先不急着提web400,让我们先来看看web200 ...

  2. mybatis模糊查询防止SQL注入

    SQL注入,大家都不陌生,是一种常见的攻击方式.攻击者在界面的表单信息或URL上输入一些奇怪的SQL片段(例如“or ‘1’=’1’”这样的语句),有可能入侵参数检验不足的应用程序.所以,在我们的应用 ...

  3. 【NOI题解】【bzoj题解】NOI2008 bzoj1063 道路设计

    @ACMLCZH学长出的毒瘤题T3.再也不是“善良”的出题人了. 题意:bzoj. 题解: 经典的树形DP题目,屡见不鲜了,然而我还是没有写出来. 这一类的题目有很多,例如这里的C题. 主要套路是把对 ...

  4. 公司内网yum源

    新增yum源配置文件 vi /etc/yum.repos.d/szyum.repo 内容如下: #[redhat6.3] [base] name=redhat63 baseurl=http://10. ...

  5. C/C++杂记:NULL与0的区别、nullptr的来历

    某些时候,我们需要将指针赋值为空指针,以防止野指针.   有人喜欢使用NULL作为空指针常量使用,例如:int* p = NULL;. 也有人直接使用0值作为空指针常量,例如:int* p = 0;. ...

  6. SQLite数据库初步

    Windows 10家庭中文版 想使用Python操作SQLite数据库,可是,不知道怎么建立数据库文件. 在SQLite官网溜达了一圈,总算使用上面的工具安装了建立了我需要的数据库文件. 1.进入官 ...

  7. java基础36 双例集合Map下的HashMap和TreeMap集合

    单例集合体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合 ...

  8. group by 并且 count(1)的linq写法

    SELECT [MobleNo],count(1) FROM [CustMobleNo] group by [MobleNo] GO ===作用等于=== var rst = from c in da ...

  9. 在VirtualBox虚拟机中安装Centos操作系统怎么与本地XShell远程连接

    问题: 在VirtualBox安装好了CentOS操作系统后,我们怎么才可以用XSell连接虚拟机中的CentOS呢? 答案: (1)在windows下用cmd--ipconfig查看VirtualB ...

  10. css边框内凹圆角,解决优惠券的边框问题

    关于css边框内凹圆角,找了好久才找到的 <html <head> <title>无标题页</title> <style> body{ backg ...