首先,对于每个询问,我们二分答案

然后对于序列中大于等于中位数的数,我们把它们置为1,小于中位数的数,置为-1

那么如果一个区间和大于等于0,那么就资磁,否则就不滋磁

这个区间和呢,我们可以用主席树维护前缀和

[c,d]上的最大前缀和减去[a-1,b-1]上的最小前缀和,就是所有可用区间的最大区间和

这样要求主席树支持区间修改,正好之前没写过(捂脸),练一下

复杂度O(nlog^2n)

(如果不资磁区间修改的话,也可以通过维护最大/小连续和的那套理论,达到同样的效果(好像所有题解都是这么做的))

(当然首先要离散化……)

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 23333 using namespace std;
inline int read(){
int ret=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while ('0'<=ch&&ch<='9'){
ret=ret*10-48+ch;
ch=getchar();
}
return ret;
} struct STnode{
int ls,rs;
int maxv,minv;
int tag;
}; int n,root[N];
struct SegmentTree{
STnode t[12333666];
int size;
inline int newnode(int x){t[++size]=t[x];return size;}
void PushUp(int x){
t[x].maxv=max(t[t[x].ls].maxv,t[t[x].rs].maxv);
t[x].minv=min(t[t[x].ls].minv,t[t[x].rs].minv);
}
void add(int &x,int delta){
x=newnode(x);
t[x].maxv+=delta;t[x].minv+=delta;t[x].tag+=delta;
}
void PushDown(int x){
if (!t[x].ls) t[x].tag=0;
if (t[x].tag){
add(t[x].ls,t[x].tag);add(t[x].rs,t[x].tag);
t[x].tag=0;
}
}
void build(int x,int l,int r){
t[x].tag=t[x].ls=t[x].rs=0;
if ((t[x].minv=l)==(t[x].maxv=r)) return;
int mid=(l+r)/2;
build(t[x].ls=++size,l,mid);
build(t[x].rs=++size,mid+1,r);
}
int clear(){build(size=1,1,n);return 1;}
void modify(int &x,int L,int R,int l,int r,int delta){
PushDown(x);
if (l<=L&&R<=r){add(x,delta);return;}
x=newnode(x);
int mid=(L+R)/2;
if (l<=mid) modify(t[x].ls,L,mid,l,r,delta);
if (r>mid) modify(t[x].rs,mid+1,R,l,r,delta);
PushUp(x);
}
int qmin(int x,int L,int R,int l,int r){
PushDown(x);
if (l<=L&&R<=r) return t[x].minv;
int mid=(L+R)/2;
if (r<=mid) return qmin(t[x].ls,L,mid,l,r);
if (l>mid) return qmin(t[x].rs,mid+1,R,l,r);
return min(qmin(t[x].ls,L,mid,l,r),qmin(t[x].rs,mid+1,R,l,r));
}
int qmax(int x,int L,int R,int l,int r){
PushDown(x);
if (l<=L&&R<=r) return t[x].maxv;
int mid=(L+R)/2;
if (r<=mid) return qmax(t[x].ls,L,mid,l,r);
if (l>mid) return qmax(t[x].rs,mid+1,R,l,r);
return max(qmax(t[x].ls,L,mid,l,r),qmax(t[x].rs,mid+1,R,l,r));
}
} st; int query(int a,int b,int c,int d){
int l=1,r=n+1,mid;
while (l+1<r){
mid=(l+r)/2;
int tmpr=st.qmax(root[mid],1,n,c,d);
int tmpl=st.qmin(root[mid],1,n,max(a-1,1),b-1);
if (a==1) tmpl=min(tmpl,0);
if (tmpr-tmpl>=0) l=mid;
else r=mid;
}
return l;
} int a[N];
struct num{
int value,pos;
num(){}
num(int _value,int _pos):value(_value),pos(_pos){}
} tt[N];
inline bool operator <(const num &x,const num &y){
return x.value<y.value;
} int main(){
n=read();
for (int i=1;i<=n;++i) tt[i]=num(a[i]=read(),i);
sort(tt+1,tt+n+1); root[1]=st.clear();
for (int i=1;i<n;++i)
st.modify(root[i+1]=root[i],1,n,tt[i].pos,n,-2); int lastans=0,q[4];
for (int Q=read();Q;Q--){
for (int k=0;k<4;++k) q[k]=(read()+lastans)%n+1;
sort(q,q+4);
lastans=tt[query(q[0],q[1],q[2],q[3])].value;
printf("%d\n",lastans);
}
return 0;
}

  

bzoj2653: middle的更多相关文章

  1. BZOJ2653 middle 【主席树】【二分】*

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

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

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

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

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

  4. [bzoj2653][middle] (二分 + 主席树)

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

  5. 题解【bzoj2653 middle】

    Description 给你一个序列,每次询问给出四个数 \(a,b,c,d\),求所有区间 \([l,r]\) 满足 \(l \in [a,b], r \in [c,d]\) 的中位数的最大值.强制 ...

  6. BZOJ2653 middle 【二分 + 主席树】

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

  7. PKUSC2018训练日程(4.18~5.30)

    (总计:共66题) 4.18~4.25:19题 4.26~5.2:17题 5.3~5.9: 6题 5.10~5.16: 6题 5.17~5.23: 9题 5.24~5.30: 9题 4.18 [BZO ...

  8. 【BZOJ2653】Middle(主席树)

    [BZOJ2653]Middle(主席树) 题面 BZOJ 洛谷 Description 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整.给你 ...

  9. 【BZOJ2653】middle 二分+可持久化线段树

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

随机推荐

  1. uva167 The Sultan's Successors

    The Sultan's Successors Description The Sultan of Nubia has no children, so she has decided that the ...

  2. Android M新的运行时权限开发者需要知道的一切

    android M 的名字官方刚发布不久,最终正式版即将来临!android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿, ...

  3. ipone5 无法安装ipa软件

    iphone5s软件无法安装解决方法一,点击设置 - 通用 - 访问限制,先关闭“安装应用程序”选项,再打开,把后台应用程序刷新也关了,测试. iphone5s软件无法安装解决方法二,点击设置 - 通 ...

  4. 1,字符是否为空,2,比较两个字符大小。String.Compare(String, String)。string.IsNullOrEmpty(string)

    1, String.Compare 方法 (String, String) 比较两个指定的 String 对象. 值 条件 小于零 strA 小于 strB. 零 strA 等于 strB. 大于零 ...

  5. HTML 学习笔记 CSS(选择器4)

    CSS 后代选择器 后代选择器(descendant selector)又称为包含选择器.后代选择器可以选择作为某元素后代的元素. 根据上下文选择元素 我们可以定义后代选择器来创建一些规则,使这些规则 ...

  6. ubuntu-12.10-server安装图形界面

    1.首先你需要确定你的源文件中 /etc/apt/sources.list 已经使用Universe和Multiverse库.然后使用下面的命令来进行更新源列表和安装图形桌面. sudo apt-ge ...

  7. Theano3.1-练习之初步介绍

    来自 http://deeplearning.net/tutorial/,虽然比较老了,不过觉得想系统的学习theano,所以需要从python--numpy--theano的顺序学习.这里的资料都很 ...

  8. mvc5+ef6+Bootstrap 项目心得--WebGrid

    1.mvc5+ef6+Bootstrap 项目心得--创立之初 2.mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理 3.mvc5+ef6+Bootstrap 项目心得--WebG ...

  9. 基于DDD的.NET开发框架 - ABP Session实现

    返回ABP系列 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  10. 必须要会的技能(一) 如何实现设计时Binding

    今天我们来分享一个主题:DesignTime Binding设计时绑定. 这一项技术可以使用在所有包括WPF及其衍生出来的技术上,比如Sliverlight,当然也包括UWP 先来说明一下设计时Bin ...