判断中位数是否可行需要将当前的解作为分界,大于其的置为1,小于为-1,然后b-c必选,ab,cd可不选,这个用线段树判定就好

但不能每次跑,所以套主席树,按权值排序,构建主席树,更新时将上一个节点改为-1,能保证以上结论

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define N 20005
using namespace std;
int lon[32*N],ron[32*N],sum[32*N],maxl[32*N],maxr[32*N];
int n,m,sz,num[N],num_cnt,root[N]; template<typename _t>
inline _t read(){
_t x=0,f=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-f;
for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
return x*f;
} struct data{
int val,id;
bool operator <(const data &a)const{return a.val>val;}
}d[N];
void print(int x,int l,int r){
if(!x)return ;
printf("%4d %4d %4d %4d l=%4d r=%4d %4d %4d\n",x,l,r,sum[x],maxl[x],maxr[x],lon[x],ron[x]);
int mid=(l+r)>>1;
print(lon[x],l,mid);
print(ron[x],mid+1,r);
}
void pushup(int rt){
maxl[rt]=max(maxl[lon[rt]],sum[lon[rt]]+maxl[ron[rt]]);
maxr[rt]=max(maxr[ron[rt]],sum[ron[rt]]+maxr[lon[rt]]);
sum[rt]=sum[lon[rt]]+sum[ron[rt]];
}
void build (int &rt,int l,int r){
rt=++sz;
if(l==r){sum[rt]=maxl[rt]=maxr[rt]=1;return;}
int mid=(l+r)>>1;
build(lon[rt],l,mid);
build(ron[rt],mid+1,r);
pushup(rt);
}
void insert(int p,int &rt,int l,int r,int x,int y){
rt=++sz;
lon[rt]=lon[p]; ron[rt]=ron[p];
if(l==r){sum[rt]=maxl[rt]=maxr[rt]=y;return;}
int mid=(l+r)>>1;
if(x<=mid) insert(lon[p],lon[rt],l,mid,x,y);
else insert(ron[p],ron[rt],mid+1,r,x,y);
pushup(rt);
}
int query(int rt,int l,int r,int x,int y){
if(l>=x&&r<=y) return sum[rt];
int ans=0;
int mid=(l+r)>>1;
if(x<=mid) ans+=query(lon[rt],l,mid,x,y);
if(y>mid) ans+=query(ron[rt],mid+1,r,x,y);
return ans;
}
int getmaxr(int rt,int l,int r,int x,int y){
if(l==x&&r==y) return maxr[rt];
int mid=(l+r)>>1,ans=0;
if(y<=mid) return getmaxr(lon[rt],l,mid,x,y);
if(x>mid) return getmaxr(ron[rt],mid+1,r,x,y);
else return max(getmaxr(ron[rt],mid+1,r,mid+1,y),getmaxr(lon[rt],l,mid,x,mid)+query(ron[rt],mid+1,r,mid+1,y));
}
int getmaxl(int rt,int l,int r,int x,int y){
if(l==x&&r==y) return maxl[rt];
int mid=(l+r)>>1,ans=0;
if(y<=mid) return getmaxl(lon[rt],l,mid,x,y);
if(x>mid) return getmaxl(ron[rt],mid+1,r,x,y);
else return max(getmaxl(lon[rt],l,mid,x,mid),query(lon[rt],l,mid,x,mid)+getmaxl(ron[rt],mid+1,r,mid+1,y));
}
bool judge(int x,int a,int b,int c,int d){
int ans=0;
if(c>b+1)ans+=query(root[x],1,n,b+1,c-1);
ans+=getmaxr(root[x],1,n,a,b);
ans+=getmaxl(root[x],1,n,c,d);
if(ans>=0) return 1;
return 0;
}
int gy()
{
freopen("nt2012_middle.in","r",stdin);
freopen("nt2012_middle.out","w",stdout);
n=read<int>();
for(int i=1;i<=n;i++){
d[i].val=read<int>();
num[i]=d[i].val;
d[i].id=i;
}
sort(num+1,num+n+1);
for(int i=1;i<=n;i++)
d[i].val=lower_bound(num+1,num+n+1,d[i].val)-num;
sort(d+1,d+n+1);
/*for(int i=1;i<=n;i++)
printf("%d %d\n",i,d[i].val);*/
build(root[1],1,n);
for(int i=2;i<=n;i++)
insert(root[i-1],root[i],1,n,d[i-1].id,-1);
/*for(int i=1;i<=n;i++){
printf("i=========%d\n",i);
print(root[i],1,n);
}*/
scanf("%d",&m);
int a[4];
int ans=0;
while(m--){
for(int i=0;i<4;i++){a[i]=read<int>();a[i]=(a[i]+ans)%n+1;}
sort(a,a+4);
int L=1,R=n,mid;
while(L+1<R){
mid=(L+R)>>1;
if(judge(mid,a[0],a[1],a[2],a[3])) L=mid;
else R=mid;
}
if(judge(R,a[0],a[1],a[2],a[3])) ans=num[R];
else ans=num[L];
printf("%d\n",ans);
}
return 0;
}
int ryf=gy();
int main(){;}

bzoj 2653 middle 二分答案 主席树判定的更多相关文章

  1. BZOJ 2653 middle 二分答案+可持久化线段树

    题目大意:有一个序列,包含多次询问.询问区间左右端点在规定区间里移动所得到的最大中位数的值. 考虑对于每个询问,如何得到最优区间?枚举显然是超时的,只能考虑二分. 中位数的定义是在一个序列中,比中位数 ...

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

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

  3. BZOJ5343: [Ctsc2018]混合果汁 二分答案+主席树

    分析: 整体二分或二分答案+主席树,反正没有要求强制在线,两个都可以做... 贪心还是比较显然的,那么就是找前K大的和...和CQOI的任务查询系统很像 附上代码: #include <cstd ...

  4. BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树

    BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...

  5. 2019杭电多校第四场hdu6621 K-th Closest Distance(二分答案+主席树)

    K-th Closest Distance 题目传送门 解题思路 二分答案+主席树 先建主席树,然后二分答案mid,在l和r的区间内查询[p-mid, p+mid]的范围内的数的个数,如果大于k则说明 ...

  6. BZOJ 4556: [Tjoi2016&Heoi2016]字符串(后缀数组 + 二分答案 + 主席树 + ST表 or 后缀数组 + 暴力)

    题意 一个长为 \(n\) 的字符串 \(s\),和 \(m\) 个询问.每次询问有 \(4\) 个参数分别为 \(a,b,c,d\). 要你告诉它 \(s[a...b]\) 中的所有子串 和 \(s ...

  7. BZOJ2653 middle(二分答案+主席树)

    与中位数有关的题二分答案是很常用的trick.二分答案之后,将所有大于它的看成1小于它的看成-1,那么只需要判断是否存在满足要求的一段和不小于0. 由于每个位置是1还是-1并不固定,似乎不是很好算.考 ...

  8. BZOJ4556 [Tjoi2016&Heoi2016]字符串 SA ST表 二分答案 主席树

    原文链接https://www.cnblogs.com/zhouzhendong/p/BZOJ4556.html 题目传送门 - BZOJ4556 题意 给定一个长度为 $n$ 的字符串 $s$ . ...

  9. BZOJ1926[Sdoi2010]粟粟的书架——二分答案+主席树

    题目描述 幸福幼儿园 B29 班的粟粟是一个聪明机灵.乖巧可爱的小朋友,她的爱好是画画和读书,尤其喜欢 Thomas H. Co rmen 的文章.粟粟家中有一个 R行C 列的巨型书架,书架的每一个位 ...

随机推荐

  1. <mate name="viewport">移动端设置详解

    <meta name="viewport" content="width=device-width,height=device-height,initial-sca ...

  2. 使用IntelliJ IDEA的小技巧快乐编程(2)

    前言 本篇介绍的技巧为IntelliJ IDEA中自动代码生成相关的技巧,合理的使用这些技巧将大大提高的你的编码效率 :) Trick 6. 使用模板代码 idea默认的提供了许多模板代码,你可以使用 ...

  3. ]Java 5|6 并发包介绍

    ava.util.concurrent 包含许多线程安全.测试良好.高性能的并发构建块.不客气地说,创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结 ...

  4. tomcat6 高并发配置 与优化

    server.xml配置 1.  <Connectorport="8080"protocol="HTTP/1.1" 2.  maxThreads=&quo ...

  5. https证书链不完整

    公司的一个域名,用浏览器打开能正常访问,但是在linux下使用curl命令,总是报错,报错信息如下: curl: (60) Peer certificate cannot be authenticat ...

  6. FFPLAY的原理

    概要 电影文件有很多基本的组成部分.首先,文件本身被称为容器Container,容器的类型决定了信息被存放在文件中的位置.AVI和Quicktime就是容器的例子.接着,你有一组流,例如,你经常有的是 ...

  7. Java自学编程学习之路资源合集

    Java Web学习 STEP.1---Java基础最重要 工欲善其事,必先利其器.想要学好Java Web,或者说想要开始学Java Web,Java的基础是必不可少. 基本语法(★★★★★) 数组 ...

  8. SpringCloud实战-Eureka

    熟悉微服务架构或Dubbo框架的都知道,微服务中最核心.最基础的组件就是注册中心了.下面利用Spring Cloud Eureka实现服务注册中心.并注册一个简单的服务提供者. 首先先创建一个spir ...

  9. 洛谷 P1054 解题报告

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  10. 【Android学习笔记】Android Studio简单断点调试

    首先点击断点调试按钮运行App 启动之后,会弹出如下图的提示框,不要管,几秒之后这个弹框会自动消失,然后App会成功运行. 下面介绍一下断点调试的相关操作按钮对应的功能: 按钮1的功能:从当前断点跳到 ...