Description

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

其中a<b<c<d。位置也从0开始标号。我会使用一些方式强制你在线。

Input

第一行序列长度n。接下来n行按顺序给出a中的数。

接下来一行Q。然后Q行每行a,b,c,d,我们令上个询问的答案是x(如果这是第一个询问则x=0)。

令数组q={(a+x)%n,(b+x)%n,(c+x)%n,(d+x)%n}。

将q从小到大排序之后,令真正的要询问的a=q[0],b=q[1],c=q[2],d=q[3]。  

输入保证满足条件。

第一行所谓“排过序”指的是从小到大排序!

n<=20000,Q<=25000

Output

Q行依次给出询问的答案。

Sample Input

5

170337785

271451044

22430280

969056313

206452321

3

3 1 0 2

2 3 1 4

3 1 4 0

Sample Output

271451044

271451044

969056313


首先这题是肯定具有可二分性的,那么我们按照权值大小顺序建立n棵主席树,对于每个权值下的主席树,其叶子节点表示位置l上的数是否小于自己,如果小于自己,则位置l的叶子节点点值为-1,大于等于则为1

这样子我们就可以在主席树的每个节点上记录前缀最大值和后缀最大值,每次二分答案的时候,判断[a,b]的后缀最大值+(b,c)的权值和+[c,d]的后缀最大值是否\(\geqslant 0​\)

如果是,则l上移,否则r下移

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline char gc(){
static char buf[1000000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int frd(){
int x=0,f=1; char ch=gc();
for (;ch<'0'||ch>'9';ch=gc()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=gc()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline int read(){
int x=0,f=1; char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
return x*f;
}
inline void print(int x){
if (x<0) putchar('-'),x=-x;
if (x>9) print(x/10);
putchar(x%10+'0');
}
const int N=2e4,M=5e5;
int list[N+10],root[N+10],pos[N+10],n,T;
struct S1{
int v,ID;
void insert(int i){v=read(),ID=i;}
bool operator <(const S1 &tis)const{return v<tis.v;}
}val[N+10];
struct S2{
struct node{
int sum,Lf,Rg;
node(){sum=0,Lf=Rg=-inf;}
void insert(int x){sum=Lf=Rg=x;}
}tree[M+10];
int ls[M+10],rs[M+10],tot;
friend node operator +(const node &x,const node &y){
node z;
z.Lf=max(x.Lf,x.sum+y.Lf);
z.Rg=max(y.Rg,y.sum+x.Rg);
z.sum=x.sum+y.sum;
return z;
}
void build(int &p,int l,int r,int x){
p=++tot;
if (l==r){
tree[p].insert(l==x?1:-1);
return;
}
int mid=(l+r)>>1;
build(ls[p],l,mid,x);
build(rs[p],mid+1,r,x);
tree[p]=tree[ls[p]]+tree[rs[p]];
}
void insert(int &p,int k,int l,int r,int x){
tree[p=++tot]=tree[k];
ls[p]=ls[k],rs[p]=rs[k];
if (l==r){
tree[p].insert(1);
return;
}
int mid=(l+r)>>1;
if (x<=mid) insert(ls[p],ls[k],l,mid,x);
else insert(rs[p],rs[k],mid+1,r,x);
tree[p]=tree[ls[p]]+tree[rs[p]];
}
node Query(int p,int l,int r,int x,int y){
if (x<=l&&r<=y) return tree[p];
int mid=(l+r)>>1;
if (y<=mid) return Query(ls[p],l,mid,x,y);
if (x>mid) return Query(rs[p],mid+1,r,x,y);
return Query(ls[p],l,mid,x,y)+Query(rs[p],mid+1,r,x,y);
}
}CT;//Chairman Tree
int Q[5];
bool check(int limit){
int res=0;
if (Q[1]+1<=Q[2]-1) res+=CT.Query(root[limit],1,n,Q[1]+1,Q[2]-1).sum;
res+=CT.Query(root[limit],1,n,Q[0],Q[1]).Rg;
res+=CT.Query(root[limit],1,n,Q[2],Q[3]).Lf;
return res>=0;
}
int Binary_Search(){
int l=1,r=T;
while (l<=r){
int mid=(l+r)>>1;
if (check(mid)) l=mid+1;
else r=mid-1;
}
return r;
}
void init(int x){
Q[0]=(read()+x)%n,Q[1]=(read()+x)%n,Q[2]=(read()+x)%n,Q[3]=(read()+x)%n;
for (int i=0;i<4;i++) Q[i]++;
sort(Q,Q+4);
}
int main(){
n=read();
for (int i=1;i<=n;i++) val[i].insert(i);
sort(val+1,val+1+n);
for (int i=1;i<=n;i++) list[i]=val[i].v;
T=unique(list+1,list+1+n)-list-1;
for (int i=1;i<=n;i++) val[i].v=lower_bound(list+1,list+1+T,val[i].v)-list;
CT.build(root[val[n].v],1,n,val[n].ID);
for (int i=n-1;i;i--) CT.insert(root[val[i].v],root[val[i+1].v],1,n,val[i].ID);
int m=read(),lastans=0;
for (int i=1;i<=m;i++){
init(lastans);
printf("%d\n",lastans=list[Binary_Search()]);
}
return 0;
}

[洛谷2839/国家集训队]middle的更多相关文章

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

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

  2. 洛谷P2839 [国家集训队]middle 主席树_二分

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...

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

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

  4. 【洛谷2839/BZOJ2653】middle(主席树)

    题目: 洛谷2839 分析: 记\(s_i\)表示原序列中第\(i\)大的数. 考虑对于任意一个区间\([a,b]\),设它的中位数为\(s_m\),那么这个区间内大于等于\(s_m\)的数和小于\( ...

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

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

  6. 洛谷P1501 [国家集训队]Tree II(LCT,Splay)

    洛谷题目传送门 关于LCT的其它问题可以参考一下我的LCT总结 一道LCT很好的练习放懒标记技巧的题目. 一开始看到又做加法又做乘法的时候我是有点mengbi的. 然后我想起了模板线段树2...... ...

  7. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)

    洛谷题目传送门 给一个比较有逼格的名词--WQS二分/带权二分/DP凸优化(当然这题不是DP). 用来解决一种特定类型的问题: 有\(n\)个物品,选择每一个都会有相应的权值,需要求出强制选\(nee ...

  8. 洛谷 P1407 [国家集训队]稳定婚姻 解题报告

    P1407 [国家集训队]稳定婚姻 题目描述 我国的离婚率连续7年上升,今年的头两季,平均每天有近5000对夫妇离婚,大城市的离婚率上升最快,有研究婚姻问题的专家认为,是与简化离婚手续有关. 25岁的 ...

  9. 洛谷 P1852 [国家集训队]跳跳棋 解题报告

    P1852 [国家集训队]跳跳棋 题目描述 跳跳棋是在一条数轴上进行的.棋子只能摆在整点上.每个点不能摆超过一个棋子. 我们用跳跳棋来做一个简单的游戏:棋盘上有3颗棋子,分别在\(a\),\(b\), ...

随机推荐

  1. CentOS 5.11安装配置LAMP服务器(Apache+PHP5+MySQL)

    http://www.osyunwei.com/archives/8880.html 准备篇: CentOS 5.x系统安装配置图解教程 http://www.osyunwei.com/archive ...

  2. 创立一个站点的前前后后(起因,域名,云平台,备案,CDN等等)(1)

    起因 写完<完美软件开发:方法与逻辑>这书后,原本想继续写书的,可出来參加了些社区活动后,我发现我写的书大家评价还行.但事实上不太理解.而接下来想写的书更加抽象点.准备叫<管理的解析 ...

  3. 关于disable和readonly

    我们在做网页时,难免的会因为权限或者各种原因,想让使用者看到,但是却不想让用户去对值进行更改,我们有两个选择 一.我们使用disabled将文本框禁用掉. 二.我们使用readonly使得文本框只能读 ...

  4. xcode7 怎样真机測试

    1. 下载xcode7 能够通过訪问 https://developer.apple.com/xcode/downloads/ 下载最新的xcode7的版本号 只是官网的下载速度太慢了,这个最好百度一 ...

  5. 计算机体系结构的铁律(iron law)

    计算机体系结构的铁律可由下面公式来描写叙述: 从Programmer的角度来看,处理器的性能就是运行程序的耗费的时间.所以用Time/Program来刻画处理器性能.而这个简单的公式背后是有很丰富的内 ...

  6. the first week study

    1.In 1989, a man named Guido create "python" as a kind of computer languages. And now we u ...

  7. 访问某类型的元数据的方式-TypeDescriptor 类

    .NET Framework 提供了两种访问某类型的元数据的方式:通过 System.Reflection 命名空间中提供的反射 API,以及通过 TypeDescriptor 类.反射是可用于所有类 ...

  8. centos7 配置虚拟交换机(物理交换机truckport设置)(使用brctl)

    感谢朋友支持本博客.欢迎共同探讨交流,因为能力和时间有限.错误之处在所难免,欢迎指正! 假设转载,请保留作者信息. 博客地址:http://blog.csdn.net/qq_21398167 原博文地 ...

  9. jquery获取兄弟元素

    按照w3c school的指引,jquery中,要获得一个元素的兄弟,可以用 prev().next()两种方法.顾名思义,prev()获得前一个,next()获得后面一个. 问题是,如果存在前后兄弟 ...

  10. Hackrank Kingdom Division 树形DP

    题目链接:传送门 题意: 给你一棵树,n个点 每个点可以染成红色和蓝色 但是红色的点与其相邻的点中必须有红色节点,蓝色也是 问你有多少种染色的方案 题解: 树形dp 先转化为有根树,取1为根 设定dp ...