[国家集训队]middle

题目

解法

开\(n\)颗线段树,将第\(i\)颗线段树中大于等于第\(i\)小的数权值赋为1,其他的则为-1,对于每个区间维护一个区间和,最大前缀和,最大后缀和。

然后二分答案,查询二分到的答案对应线段树。

\(设s=[a,b-1]的最大后缀和+[b,c]的区间和+[c+1,d]的最大前缀和\)

若\(s\geq 0\),则答案可能更大,否则答案必须变小,仔细想想为什么。

这样不断二分即可。

考虑到开不下那么多线段树,而若排序后相邻线段树维护的序列只有一个元素不同,所以我们考虑用主席树来维护。

然后其实不需要离散化,离散化也没问题。

完整代码

#include<bits/stdc++.h>
#define rg register
#define il inline
using namespace std;
void ssort(int &a,int &b,int &c,int &d){
if(a>b)swap(a,b);if(a>c)swap(a,c);if(a>d)swap(a,d);
if(b>c)swap(b,c);if(b>d)swap(b,d);
if(c>d)swap(c,d);
}
const int N=3e4;
struct code{
int x,id;
}a[N];
struct tree{
int x,l,r,L,R,sum;
}t[N*100],ans,fz;
int cmp(code x,code y){return x.x<y.x;}
int root[N],cnt,aa,bb,cc,dd,n;
il void pushup(tree &no,tree l,tree r){
no.L=max(l.L,l.sum+r.L);
no.R=max(r.R,r.sum+l.R);
no.sum=l.sum+r.sum;
}
int build(int l,int r){
int no=++cnt;
if(l==r){
t[no].x=t[no].sum=t[no].L=t[no].R=1;
return no;
}
int mid=l+r>>1;
t[no].l=build(l,mid);
t[no].r=build(mid+1,r);
pushup(t[no],t[t[no].l],t[t[no].r]);
return no;
}
int modify(int last,int l,int r,int k){
int no=++cnt;
if(l==r){
t[no].x=t[no].sum=-1;
return no;
}
t[no].l=t[last].l;
t[no].r=t[last].r;
int mid=l+r>>1;
if(k<=mid)t[no].l=modify(t[last].l,l,mid,k);
else t[no].r=modify(t[last].r,mid+1,r,k);
pushup(t[no],t[t[no].l],t[t[no].r]);
return no;
}
void query(int no,int l,int r,int L,int R){
if(l>=L&&r<=R){
pushup(ans,ans,t[no]);
return ;
}
if(l>R||r<L||R<L)return ;
int mid=l+r>>1;
query(t[no].l,l,mid,L,R);
query(t[no].r,mid+1,r,L,R);
}
int check(int x){
int s=0;
ans=fz;query(root[x],1,n,aa,bb-1);s+=ans.R;
ans=fz;query(root[x],1,n,bb,cc);s+=ans.sum;
ans=fz;query(root[x],1,n,cc+1,dd);s+=ans.L;
return s>=0;
}
int main(){
cin>>n;
for(int i=1;i<=n;++i){
scanf("%d",&a[i].x);
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
root[0]=build(1,n);
for(int i=1;i<=n;++i)
root[i]=modify(root[i-1],1,n,a[i].id);
int q,x=0;
cin>>q;
while(q--){
scanf("%d%d%d%d",&aa,&bb,&cc,&dd);
aa=(aa+x)%n+1;bb=(bb+x)%n+1;cc=(cc+x)%n+1;dd=(dd+x)%n+1;
ssort(aa,bb,cc,dd);
int l=0,r=n;
while(l!=r){
int mid=l+r>>1;
if(check(mid+1))l=mid+1;
else r=mid;
}
x=a[l+1].x;
printf("%d\n",x);
}
}

[国家集训队]middle的更多相关文章

  1. [国家集训队]middle 解题报告

    [国家集训队]middle 主席树的想法感觉挺妙的,但是这题数据范围这么小,直接分块草过去不就好了吗 二分是要二分的,把\(<x\)置\(-1\),\(\ge x\)的置\(1\),于是我们需要 ...

  2. P2839 [国家集训队]middle

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

  3. CF484E Sign on Fence && [国家集训队]middle

    CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...

  4. 【LG2839】[国家集训队]middle

    [LG2839][国家集训队]middle 题面 洛谷 题解 按照求中位数的套路,我们二分答案\(mid\),将大于等于\(mid\)的数设为\(1\),否则为\(-1\). 若一个区间和大于等于\( ...

  5. BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)

    BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...

  6. luogu2839 [国家集训队]middle

    题目链接:洛谷 题目大意:给定一个长度为$n$的序列,每次询问左端点在$[a,b]$,右端点在$[c,d]$的所有子区间的中位数的最大值.(强制在线) 这里的中位数定义为,对于一个长度为$n$的序列排 ...

  7. 解题:国家集训队 Middle

    题面 求中位数的套路:二分,大于等于的设为1,小于的设为-1 于是可以从小到大排序后依次加入可持久化线段树,这样每次只会变化一个位置 那左右端点是区间怎么办? 先把中间的算上,然后维护每个区间左右两侧 ...

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

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

  9. Luogu 2839 [国家集训队]middle

    感觉这题挺好的. 首先对于中位数最大有一个很经典的处理方法就是二分,每次二分一个数组中的下标$mid$,然后我们把$mid$代回到原来的数组中检查,如果一个数$a_{i} \geq mid$,那么就把 ...

随机推荐

  1. CentOS中配置CDH版本的ZooKeeper

    三台CentOS:Host0,Host1,Host2 在三台中分别安装zookeeper-server yum install zookeeper-server -y 修改zookeeper的配置文件 ...

  2. statefulSet + headless service 学习记录 service :selector --> template :label

    1.statefulset.yaml apiVersion: apps/v1kind: StatefulSetmetadata:   name: webspec:    serviceName: &q ...

  3. js 按指定属性给对象数组排序(json数组)

    有时,我们有一个json对象的数组集合,如何按指定对象属性来进行排序? //fieldArr为一个json对象数组 var fieldArr = fieldArr.sort(compare(" ...

  4. CAN总线学习系列之— CAN总线特点介绍

    CAN总线学习系列之— CAN总线特点介绍 CAN 总线作为一种工业界的流行总线广泛应于工业自动化.多种控制设备.交通工具.医疗仪器以及建筑.环境控制等各个行业中,它是是一种多主机局域网,所以这样 一 ...

  5. LoRa---数据包结构、跳频

    数据包结构  跳频扩频技术FHSS 人太懒,直接贴图,自己看!

  6. Ubuntu 守护进程

    项目中用的Qt开发的GUI程序,需要随机自启动. 最初尝试过使用SuperVisor,但是会出现下面的错误. qt.qpa.screen: QXcbConnection: Could not conn ...

  7. TMS320VC5509的MCBSP配置成SPI模式通信

    1. 首先是把MCBSP的配置 其次是时钟停止模式的配置,关闭大同小异 SPI有4中模式,怎么根据上面的寄存器选择哪种模式?下面展示了其中两种,CLKXP=1的时候有另外两种,暂时不整出来了 2. 代 ...

  8. Codeforces 954C Matrix Walk (思维)

    题目链接:Matrix Walk 题意:设有一个N×M的矩阵,矩阵每个格子都有从1-n×m的一个特定的数,具体数的排列如图所示.假设一个人每次只能在这个矩阵上的四个方向移动一格(上下左右),给出一条移 ...

  9. 基于.NET Standard的分布式自增ID算法--美团点评LeafSegment

    概述 前一篇文章讲述了最流行的分布式ID生成算法snowflake,本篇文章根据美团点评分布式ID生成系统文章,介绍另一种相对更容易理解和编写的分布式ID生成方式. 实现原理 Leaf这个名字是来自德 ...

  10. Asp.Net_Wcf跟Wpf的区别

    摘要:WCF,你就先把它想成WebService的下一代也没什么问题.WCF为WindowsCommunicationFoundation,是Microsoft为构建面向服务的应用提供的分布式通信编程 ...