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 ...
随机推荐
- ES6中模块加载出现的问题
1.如何在浏览器中import模块 在使用模块加载时不同浏览器有不同的行为 使用 import 加载模块时,需要把script标签的type属性改为module.此时Firefox浏览器支持impor ...
- java 通过反射调用属性,方法,构造器
package reflection2; import static org.junit.Assert.assertArrayEquals; import java.lang.reflect.Cons ...
- 十、future其他成员函数、shared_future、atomic(原子操作)
一. int mythread(){ cout<<"thread"<<endl; std::chrono::milliseconds dura();//5秒 ...
- 用闭包解决 js 循环中函数变量暂存问题
需求:有一个数组,根据数组的值渲染对应的数字div,单击对应的div 在控制台打印对应的数字.如点击1,控制台打印1. 问题: 不管点击哪个值 打出来都是4 代码如下 <!DOCTYPE htm ...
- [CSP-S模拟测试]:施工(DP+单调栈+前缀和)
题目描述 小$Y$家门前有一条街道,街道上顺序排列着$n$幢建筑,其中左起第$i$幢建筑的高度为$h_i$.小$Y$定义街道的不美观度为所有相邻建筑高度差的绝对值之和乘上常数$c$,为了改善街道环境, ...
- [CSP-S模拟测试]:english(可持久化Trie+启发式合并)
题目传送门(内部题24) 输入格式 第一行有$3$个整数$n,opt$,$opt$的意义将在输出格式中提到.第二行有$n$个整数,第$i$个整数表示$a_i$. 输出格式 若$opt=1$,输出一行一 ...
- js中的$符
js中的$代表什么意思呢? 首先js的作用是什么呢?是修饰网页动态内容的.那么修饰就需要定位主题,比如你把html比喻一个美女,让她唱一首歌.那么首先你要定位出是你想让哪个美女唱歌,通常我们用id来定 ...
- 测开之路四十一:常用的jquery函数
jQuery选择器菜鸟教程:https://www.runoob.com/jquery/jquery-selectors.html 引用jquery2.1.1标签:<script src=&qu ...
- github 上的PHP资源大全
依赖管理 ——用于依赖管理的包和框架Composer/Packagist : 一个包和依赖管理器Composer Installers: 一个多框架Composer库安装器Pickle: 可以在任意 ...
- 1381. 删除 (Standard IO)
题目描述: Alice上化学课时又分心了,他首先画了一个3行N列的表格,然后把数字1到N填入表格的第一行,保证每个数只出现一次,另外两行他也填入数字1到N,但不限制每个数字的出现次数.Alice现在想 ...