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. 关于hexo markdown添加的图片在github page中无法显示的问题

    title: 关于hexo markdown添加的图片在github page中无法显示的问题 date: 2018-03-31 00:21:18 categories: methods tags: ...

  2. ksh简介

    -- Start 什么是 Shell 如果把 Linux 比作一个蛋,那么 Shell 就是蛋壳,我们需要通过 Shell 来使用系统. Shell 的种类 最早的 Shell 是 Bourne Sh ...

  3. Dos.ORM使用教程

    Dos.C#.Net使用 Dos.ORM(原Hxj.Data)于2009年发布,并发布实体生成工具.在开发过程参考了多个ORM框架,特别是NBear,MySoft.EF.Dapper等.吸取了他们的一 ...

  4. Windbg调试托管代码

    Windbg调试.net托管代码需要借助于SOS.dll,.Net 4.0的32位sos.dll的路径在C:\Windows\Microsoft.NET\Framework\v4.0.30319,64 ...

  5. AOP为Aspect Oriented Programming的缩写,意为:面向切面编程

    在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的 ...

  6. 企业级URL检测脚本

    #!/bin/bash #检查web url 是否正常 . /etc/init.d/functions #引用系统函数库 #判断传参个数是否为一个 function usage(){ echo $&q ...

  7. Vue组件使用基础

    这篇博文用来记录 .vue 组件的使用方法. 可以把组件代码按照 template.style.script 的拆分方式,放置到对应的 .vue 文件中. 模板(template).初始数据(data ...

  8. 2015 Multi-University Training Contest 4 hdu 5336 XYZ and Drops

    XYZ and Drops Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  9. 洛谷——P2615 神奇的幻方 【Noip2015 day1t1】

    https://www.luogu.org/problem/show?pid=2615 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之 ...

  10. 使用AFNetworking第三方下载类

    AFNetworking 眼下使用比較多得一个下载库 眼下一直在维护更新,使用的是很easy 不须要加入不论什么关联的库  1.带block形式 内部是任务队列进行下载  就是对operation的一 ...