Code:

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string>
#include <vector>
using namespace std; void setIO(string a)
{
string in=a+".in",out=a+".out";
freopen(in.c_str(),"r",stdin);
//freopen(out.c_str(),"w",stdout);
} #define maxn 210000
int arr[maxn],A[maxn],root[maxn],n;
vector<int>position[maxn];
struct Segment_Tree
{
#define max_Tree 21000*100
int lson[max_Tree],rson[max_Tree],cnt;
int sumv[max_Tree],lmax[max_Tree],rmax[max_Tree];
void pushup(int o)
{
sumv[o]=sumv[lson[o]]+sumv[rson[o]];
lmax[o]=max(lmax[lson[o]],sumv[lson[o]]+lmax[rson[o]]);
rmax[o]=max(rmax[rson[o]],sumv[rson[o]]+rmax[lson[o]]);
}
void build(int l,int r,int &o)
{
if(l>r)return;
o=++cnt;
if(l==r)
{
sumv[o]=lmax[o]=rmax[o]=1;
return;
}
int mid=(l+r)>>1;
build(l,mid,lson[o]);
build(mid+1,r,rson[o]);
pushup(o);
}
int update(int l,int r,int o,int pos) //modify val[pos] from 1 to -1
{
int oo=++cnt;
int mid=(l+r)>>1;
sumv[oo]=sumv[o];
lson[oo]=lson[o];
rson[oo]=rson[o];
if(l==r)
{
sumv[oo]=-1;
lmax[oo]=rmax[oo]=0;
return oo;
}
if(pos<=mid) lson[oo]=update(l,mid,lson[o],pos);
else rson[oo]=update(mid+1,r,rson[o],pos);
pushup(oo);
return oo;
}
int query_sum(int l,int r,int o,int L,int R)
{
if(l>r||r<L||l>R)return 0;
if(l>=L&&r<=R) return sumv[o];
int mid=(l+r)>>1;
return query_sum(l,mid,lson[o],L,R)+query_sum(mid+1,r,rson[o],L,R);
}
int query_left(int l,int r,int o,int L,int R)
{
if(l>r||r<L||l>R)return 0;
if(l>=L&&r<=R) return lmax[o];
int mid=(l+r)>>1;
return max(query_left(l,mid,lson[o],L,R),query_sum(l,mid,lson[o],L,R)+query_left(mid+1,r,rson[o],L,R));
}
int query_right(int l,int r,int o,int L,int R)
{
if(l>r||r<L||l>R)return 0;
if(l>=L&&r<=R) return rmax[o];
int mid=(l+r)>>1;
return max(query_right(mid+1,r,rson[o],L,R),query_sum(mid+1,r,rson[o],L,R)+query_right(l,mid,lson[o],L,R));
}
bool check(int a,int b,int c,int d,int tps)
{
int sum1=query_sum(1,n,root[tps],b,c);
int sum2=query_right(1,n,root[tps],a,b-1);
int sum3=query_left(1,n,root[tps],c+1,d);
if(sum1+sum2+sum3>=0)
return true;
return false;
}
}tree;
int main()
{
//setIO("input");
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&arr[i]);
for(int i=1;i<=n;++i) A[i]=arr[i];
sort(A+1,A+1+n);
for(int i=1;i<=n;++i) arr[i]=lower_bound(A+1,A+1+n,arr[i])-A; //离散编号
for(int i=1;i<=n;++i) position[arr[i]].push_back(i);
sort(arr+1,arr+1+n); int pre=arr[1];
tree.build(1,n,root[pre]); for(int i=2;i<=arr[n];++i)
{
int a=root[i-1];
for(int v=0;v<position[i-1].size();++v) a=tree.update(1,n,a,position[i-1][v]);
root[i]=a;
} int q,a,b,c,d,lastans=0,que[10];
scanf("%d",&q);
while(q--)
{
for(int i=1;i<=4;++i) scanf("%d",&que[i]),que[i]=(que[i]+lastans)%n+1;
sort(que+1,que+1+4);
a=que[1],b=que[2],c=que[3],d=que[4]; int l=1,r=n,mid,ans=1;
while(l<=r)
{
mid=(l+r)>>1;
if(tree.check(a,b,c,d,mid)) l=mid+1,ans=mid;
else r=mid-1;
}
lastans=A[ans];
printf("%d\n",lastans);
}
return 0;
}

  

洛谷P2839 [国家集训队]middle 主席树_二分的更多相关文章

  1. [洛谷P2839][国家集训队]middle

    题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...

  2. [洛谷2839/国家集训队]middle

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

  3. 2018.06.29 洛谷P1505 [国家集训队]旅游(树链剖分)

    旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城的任意两个景点之间有且只有 ...

  4. 洛谷P1505 [国家集训队]旅游(树剖+线段树)

    传送门 这该死的码农题…… 把每一条边变为它连接的两个点中深度较浅的那一个,然后就是一堆单点修改/路径查询,不讲了 这里就讲一下怎么搞路径取反,只要打一个标记就好了,然后把区间和取反,最大最小值交换然 ...

  5. P2839 [国家集训队]middle

    P2839 [国家集训队]middle 好妙的题啊,,,, 首先二分一个答案k,把数列里>=k的数置为1,=0就是k>=中位数,<0就是k<中位数 数列的最大和很好求哇 左边的 ...

  6. 模板—点分治A(容斥)(洛谷P2634 [国家集训队]聪聪可可)

    洛谷P2634 [国家集训队]聪聪可可 静态点分治 一开始还以为要把分治树建出来……• 树的结构不发生改变,点权边权都不变,那么我们利用刚刚的思路,有两种具体的分治方法.• A:朴素做法,直接找重心, ...

  7. 洛谷 P2634 [国家集训队]聪聪可可-树分治(点分治,容斥版) +读入挂+手动O2优化吸点氧才过。。。-树上路径为3的倍数的路径数量

    P2634 [国家集训队]聪聪可可 题目描述 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...

  8. 洛谷 P1505 [国家集训队]旅游 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1505 [国家集训队]旅游 题目描述 Ray 乐 ...

  9. [洛谷P1527] [国家集训队]矩阵乘法

    洛谷题目链接:[国家集训队]矩阵乘法 题目背景 原 <补丁VS错误>请前往P2761 题目描述 给你一个N*N的矩阵,不用算矩阵乘法,但是每次询问一个子矩形的第K小数. 输入输出格式 输入 ...

随机推荐

  1. linux操作系统下完全删除oracle数据库

    1.关掉oracle server 和 background processes ps -ef | grep ora 关掉数据库 shutdown immediate 2.关掉监听 lsnrctl  ...

  2. vue keep-alive保存路由状态1 (接下篇)

    本文很长,但是很详细,请耐心看完就一目了然了有下篇 keep-alive 是 Vue 内置的一个组件,使被包含的组件保留状态,或避免重新渲染. 1. 基础用法,缓存所有路由: <keep-ali ...

  3. MyBatis数据持久化(六)resultMap使用

    resultMap是MyBatis最强大也是最重要的特性,使用它我们可以將查询结果或者sql输入条件和一个HashMap的key进行映射,大大简化了sql查询条件的输入,而且使得数据的查询变得非常灵活 ...

  4. Pyinstaller 0

    Pyinstaller 是一个小的可以打包我们所写的Python脚本,来生成相应的可执行文件. 它是怎么工作的? PyInstaller读取您编写的Python脚本.它会分析您的代码,以发现您的脚本执 ...

  5. 【原创】不重启was server重新加载应用class文件

    类装入和更新检测(Class loading and update detection settings)菜单路径:Applications < Application Types < W ...

  6. IE9 下的ajax缓存问题的处理

      使用jQuery的getJSON从后台定时获取数据并刷新界面,使用以下方法时,在Chrome,Firefox下没问题,但在IE9下却无法刷新数据 1 2 3 4 5 $.getJSON(webAp ...

  7. luogu P1516 青蛙的约会(线性同余方程扩展欧几里德)

    题意 题解 做了这道题,发现扩欧快忘了. 根据题意可以很快地列出线性同余方程. 设跳了k次 x+mkΞy+nk(mod l) (m-n)kΞ-(x-y)(mod l) 然后化一下 (m-n)k+(x- ...

  8. mariadb数据库的链接查询和表格设计

    链接查询 练习准备: --创建学生表 create table students ( id int unsigned not null auto_increment primary key, name ...

  9. #error 、 #line 和 #pragma 的使用

    1. #error 的用法 (1)#error 是一种预编译器指示字,用于生成一个编译错误消息 (2)用法:#error message //注意:message 不需要用双引号包围 (3)#erro ...

  10. 【BZOJ 1293】[SCOI2009]生日礼物

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然的滑动窗口题. (尺取法 如果l..i这一段已经有k种珍珠了. 那么就尝试把l++; (即把l这个影响尝试去掉一下 如果不足k种 ...