传送门

解题思路

  首先可以想到一种暴力做法,就是询问时二分,然后大于等于这个值的设为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(主席树+二分答案)的更多相关文章

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

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

  2. BZOJ 2653: middle 主席树 二分

    https://www.lydsy.com/JudgeOnline/problem.php?id=2653 因为是两个方向向外延伸所以不能对编号取前缀和(这里只有前缀和向后传递的性质,不是实际意义的和 ...

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

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

  4. BZOJ 2653 middle | 主席树

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

  5. bzoj 2653 middle(主席树)

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

  6. BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案)

    BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次 ...

  7. 【bzoj2653】【middle】【主席树+二分答案】

    Description 一个长度为 n 的序列 a ,设其排过序之后为 b ,其中位数定义为 b[n/2] ,其中 a,b 从 0 开始标号 , 除法取下整. 给你一个长度为 n 的序列 s .回答 ...

  8. BZOJ 4556 [Tjoi2016&Heoi2016]字符串 ——后缀数组 ST表 主席树 二分答案

    Solution 1: 后缀数组暴力大法好 #include <map> #include <cmath> #include <queue> #include &l ...

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

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

随机推荐

  1. JS中的getter和setter

    对象有两种属性:(1)数据属性,就是我们经常使用的属性(2)访问器属性,也称存取器属性 存取器属性就是一组获取和设置值的函数.getter负责获取值,它不带任何参数.setter负责设置值,在它的函数 ...

  2. 第一次用angularJS做后台管理点滴

    很早以前就大概看过一点angualrjs,但是没有项目,一直没有进行下去,就是干巴巴的看着,过了一段时间发现什么也不记得了. 来yulebaby我的第一个后台管理是用easyui做的,做完那个以后发现 ...

  3. [CSP-S模拟测试]:Lost My Music(凸包)

    题目描述 小$w$在天堂看到了一棵世界树.世界树上有$n$个节点,其中$1$节点为根,每个节点有一个正整数权值$c_i$.现在小$w$想要对每个节点$u$求出它的祖先$v$中$\frac{c_v-c_ ...

  4. Axure RP 8.0软件安装教程

    Axure8.0(32/64)位下载地址: 链接:https://pan.baidu.com/s/1qYSLkKW 密码:skaw 软件介绍: Axure RP是一个专业的快速原型设计工具,让负责定义 ...

  5. git add 添加错文件的撤销方法

    git add 添加 多余文件 这样的错误是由于,有的时候 可能 git add . (空格+ 点) 表示当前目录所有文件,不小心就会提交其他文件 git add 如果添加了错误的文件的话 撤销操作 ...

  6. centos7运行yum报如下提示:Run "yum repolist all" to see the repos you have

    centos7运行yum报如下提示: There are no enabled repos. Run "yum repolist all" to see the repos you ...

  7. 测开之路三十九:js基础

    js的两种使用方式 第一种使用方式:单独写js文件 在static下新建一个js文件并写入内容 alert('这是一个弹窗'); 在html文件里面,用script标签引入 <script sr ...

  8. Shell逻辑运算符及表达式

    一. 运算符总结说明 1. 条件运算符 运算符号 代表意义 应用 说明 = 等于 整型或字符串比较: str1 = str2 字符串str1 和字符串str2 相等时返回真,如果在[]中,只能是字符串 ...

  9. <读书笔记>JavaScript系列之7种创建对象(面向对象)

    写在前面: 以下三选一: 阅读博文JavaScript 对象详解. 阅读<JavaScript权威指南>第6章. 阅读<JavaScript高级程序设计>第6章. 注意:只需要 ...

  10. 解决myeclipse validation验证javascript导致速度变慢的现象

    参考:https://jingyan.baidu.com/article/ca41422fe094251eae99ede7.html