Description

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

Solution

对着题解理解了半天……又对着代码调了半天……最后发现竟然是一个函数名没写orz

不过不得不说这题真的是主席树好题

先考虑二分答案,找出区间内比mid小的数有多少

因为对答案的贡献只有有或没有,所以可以把比mid小的都设为-1,比mid大的都设为1,如果区间内的和大于等于0,说明mid可行,继续二分下去

然而如果离散之后对每一个值建树,空间毫无疑问爆炸

于是只要用主席树维护一下就可以了

 //minamoto
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
char obuf[<<],*o=obuf;
inline void print(int x){
if(x>) print(x/);
*o++=x%+;
}
const int N=,M=N*;
int n,Pre,q,cnt;
int rt[N],p[];
struct node{
int l,r,lmx,rmx,sum;
}t[M],op;
struct data{
int x,id;
inline bool operator <(const data &b)const
{return x<b.x;}
}a[N];
inline void pushup(int x){
t[x].sum=t[t[x].l].sum+t[t[x].r].sum;
t[x].lmx=max(t[t[x].l].lmx,t[t[x].l].sum+t[t[x].r].lmx);
t[x].rmx=max(t[t[x].r].rmx,t[t[x].r].sum+t[t[x].l].rmx);
}
void build(int &now,int l,int r){
now=++cnt;
if(l==r){t[now].lmx=t[now].rmx=t[now].sum=;return;}
int mid=(l+r)>>;
build(t[now].l,l,mid);
build(t[now].r,mid+,r);
pushup(now);
}
void update(int last,int &now,int l,int r,int k){
now=++cnt;
if(l==r){t[now].lmx=t[now].rmx=t[now].sum=-;return;}
int mid=(l+r)>>;
if(k<=mid) t[now].r=t[last].r,update(t[last].l,t[now].l,l,mid,k);
else t[now].l=t[last].l,update(t[last].r,t[now].r,mid+,r,k);
pushup(now);
}
node merge(node x,node y){
node z;
z.sum=x.sum+y.sum;
z.lmx=max(x.lmx,x.sum+y.lmx);
z.rmx=max(y.rmx,y.sum+x.rmx);
return z;
}
node find(int x,int l,int r,int y,int z){
if(y>z) return op;
if(l==y&&r==z) return t[x];
int mid=(l+r)>>;
if(z<=mid) return find(t[x].l,l,mid,y,z);
else if(y>mid) return find(t[x].r,mid+,r,y,z);
else return merge(find(t[x].l,l,mid,y,mid),find(t[x].r,mid+,r,mid+,z));
}
int query(int x){
return find(rt[x],,n,p[],p[]).rmx+find(rt[x],,n,p[]+,p[]-).sum+find(rt[x],,n,p[],p[]).lmx;
}
int main(){
//freopen("testdata.in","r",stdin);
n=read();
for(int i=;i<=n;++i) a[i].x=read(),a[i].id=i;
sort(a+,a++n);
build(rt[],,n);
for(int i=;i<=n;++i) update(rt[i-],rt[i],,n,a[i-].id);
q=read();
while(q--){
int x=read(),y=read(),z=read(),k=read();
p[]=(x+Pre)%n+,p[]=(y+Pre)%n+,p[]=(z+Pre)%n+,p[]=(k+Pre)%n+;
sort(p+,p+);
int l=,r=n,ans=;
while(l<=r){
int mid=(l+r)>>;
int f=query(mid);
if(f>=) ans=mid,l=mid+;
else r=mid-;
}
Pre=a[ans].x;
print(a[ans].x),*o++='\n';
}
fwrite(obuf,o-obuf,,stdout);
return ;
}

【bzoj2653】【middle】【主席树+二分答案】的更多相关文章

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

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

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

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

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

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

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

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

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

    题目链接: CTSC2018混合果汁 显然如果美味度高的合法那么美味度低的一定合法,因为美味度低的可选方案包含美味度高的可选方案. 那么我们二分一个美味度作为答案然后考虑如何验证? 选择时显然要贪心的 ...

  6. P4094 [HEOI2016/TJOI2016]字符串 后缀数组+主席树+二分答案

    $ \color{#0066ff}{ 题目描述 }$ 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为n的字符串s,和m个问题.佳媛姐姐必须 ...

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

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

  8. HDU - 6621 K-th Closest Distance 主席树+二分答案

    K-th Closest Distance 主席树第二波~ 题意 给你\(n\)个数\(m\)个询问,问\(i\in [l,r]\)计算每一个\(|a_{i}-p|\)求出第\(k\)小 题目要求强制 ...

  9. BZOJ 2653: middle 主席树 二分

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

随机推荐

  1. docker的memory和cpu资源限制

    这里仅针对docker本身,不涉及任何编排工具compose或者k8s等. 按照惯例,官文撸起来. 重要的部分是一些选项,用来限制资源大小. Memory Most of these options ...

  2. A1075. PAT Judge

    The ranklist of PAT is generated from the status list, which shows the scores of the submittions. Th ...

  3. ASP:当 request.cookies 发生 Microsoft VBScript 运行时错误 (0x800A000D) 类型不匹配: '[string:

    昨天当一个客户告诉我,登录后看不到图片的时候,我还不相信,因为我的浏览器测试发现一切正常. 通过QQ远程协助后,我才发现服务器端真的报错: Microsoft VBScript 运行时错误 (0x80 ...

  4. DOM表单(复选框)

    在表单中,尤为重要的一个属性是name <!--复选框的全选.全不选.反选--> <!DOCTYPE> <html> <head lang="en& ...

  5. Windows环境安装MySQL数据库

    Windows环境安装MySQL数据库 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近在学习Java语言,开发环境在Windows操作系统上,因此需要在Windows上安装My ...

  6. JVM总结(四):JVM类加载机制

    这一节我们来总结一下JVM类加载机制.具体目录如下: 类加载的过程 类加载过程概括 说说引用 详解类加载全过程: 加载 验证 准备 解析 初始化 虚拟机把描述类的数据从Class文件加载到内存,并对数 ...

  7. synchronized的一些记录

    1.方法内的私有变量,不存在线程安全问题.非线程安全问题存在于实例变量(全局变量)中 2.在方法上加synchronized表示,当第一个线程进入时方法加锁(其他方法无法调用) 3.synchroni ...

  8. QT_文本编辑器_源码下载

    源码下载: 链接: http://pan.baidu.com/s/1c21EVRy 密码: qub8 实现主要的功能有:新建,打开,保存,另存为,查找(查找的时候需要先将光标放到最下面位置才能查全,不 ...

  9. 流媒体技术学习笔记之(一)nginx+nginx-rtmp-module+ffmpeg搭建流媒体服务器

    参照网址: [1]http://blog.csdn.net/redstarofsleep/article/details/45092147 [2]HLS介绍:http://www.cnblogs.co ...

  10. webx roadmap

    SpringExt 自定义Spring Schema的例子 基于Spring可扩展Schema提供自定义配置支持 使用SpringExt扩展Webx的示例 扩展点和捐献 一个namespace下可以声 ...