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 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...
随机推荐
- 在jsp中接收并处理servlet传过来的含有bean的List
在jsp中接收并处理servlet传过来的含有bean的List 例如有以下bean package com.test.domain; class Student{ private Stirng na ...
- JS事件用法
1.常用事件理解
- SQLServer 学习相关资料整理【转】
存储过程: SQL Server 存储过程 博客园上的一篇文章,讲解的非常详细,有测试代码,很实用. sqlserver存储过程中执行动态sql语句 The Curse and Blessings ...
- Focal Loss笔记
论文:<Focal Loss for Dense Object Detection> Focal Loss 是何恺明设计的为了解决one-stage目标检测在训练阶段前景类和背景类极度不均 ...
- 004_MAC实用的小工具
一.XtraFinder(右键菜单扩展) http://www.xuebuyuan.com/173454.html http://www.mamicode.com/info-detail-111618 ...
- asterisk控制台取消NOTICE信息
中道拨号方案取消了控制台输出的NOTICE信息: 方法:vim /etc/asterisk/logger.conf;console => notice,warning,error把上面这行取消 ...
- SQL Server中常用全局变量介绍
在SQL Server中,全局变量是一种特殊类型的变量,服务器将维护这些变量的值.全局变量以@@前缀开头,不必进行声明,它们属于系统定义的函数.下表就是SQL Server中一些常用的全局变量. 全局 ...
- Alpine里的用户管理命令
注意噢,和普通的linux不一样的. 1, 建立一个指定GID的组: addgroup -g 10001 -S groupA 2, 建立一个指定UID的用户,指定shell, 让它属于指定的用户组. ...
- mysql 通过sqoop导入hive
sudo -u hdfs sqoop import --connect jdbc:mysql://192.168.33.93:3306/leochentest --username root --pa ...
- centos6编译安装zabbix3.0和中文支持整理文档
编者按: 最近公司部分业务迁移机房,为了更方便的监控管理主机资源,决定上线zabbix监控平台.运维人员使用2.4版本的进行部署,个人在业余时间尝鲜,使用zabbix3.0进行部署,整理文档如下,仅供 ...