P2839 [国家集训队]middle
P2839 [国家集训队]middle
好妙的题啊,,,,
首先二分一个答案k,把数列里>=k的数置为1,<k的数置为0
这样数列最大和>=0就是k>=中位数,<0就是k<中位数
数列的最大和很好求哇
左边的最大后缀+中间+右边的最大前缀
主席树搞搞
完事了

// It is made by XZZ
#include<cstdio>
#include<algorithm>
#define il inline
#define rg register
#define vd void
#define sta static
using namespace std;
il int gi(){
rg int x=0,f=1;rg char ch=getchar();
while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
const int maxn=20010;
int a[maxn],b[maxn];
const int maxd=500001;
struct node{
int tot,lmax,rmax;
node operator+(const node&x)const{
return (node){tot+x.tot,max(lmax,tot+x.lmax),max(x.rmax,rmax+x.tot)};
}
}s[maxd];
int rt[maxn],ls[maxd],rs[maxd],id;
struct yyb{int p,a;}c[maxn];
il bool operator<(const yyb&a,const yyb&b){return a.a<b.a;}
#define mid ((l+r)>>1)
il vd build(int&x,int l,int r){
x=++id;
s[x]=(node){r-l+1,r-l+1,r-l+1};
if(l==r)return;
build(ls[x],l,mid),build(rs[x],mid+1,r);
}
il vd update(int&x,int l,int r,const int&p,const int&o){
++id,ls[id]=ls[x],rs[id]=rs[x],s[id]=s[x];
x=id;
if(l==r){s[x]=(node){o,o,o};return;}
if(p<=mid)update(ls[x],l,mid,p,o);
else update(rs[x],mid+1,r,p,o);
s[x]=s[ls[x]]+s[rs[x]];
}
il node query(const int&x,int l,int r,const int&L,const int&R){
if(L>R)return(node){0,0,0};
if(L<=l&&r<=R)return s[x];
if(L<=mid)
if(mid<R)return query(ls[x],l,mid,L,R)+query(rs[x],mid+1,r,L,R);
else return query(ls[x],l,mid,L,R);
else return query(rs[x],mid+1,r,L,R);
}
#undef mid
int main(){
freopen("nt2012_middle.in","r",stdin);
freopen("nt2012_middle.out","w",stdout);
int n=gi(),m;
for(rg int i=1;i<=n;++i)a[i]=b[i]=gi();
sort(b+1,b+n+1);m=unique(b+1,b+n+1)-b-1;
for(rg int i=1;i<=n;++i)a[i]=lower_bound(b+1,b+m+1,a[i])-b;
for(rg int i=1;i<=n;++i)c[i]=(yyb){i,a[i]+1};
sort(c+1,c+n+1);
build(rt[1],1,n);
int p=1;
for(rg int i=1;i<=n;++i){
while(p<c[i].a)rt[p+1]=rt[p],++p;
if(c[i].a<=m)update(rt[c[i].a],1,n,c[i].p,-1);
}
while(p<m)rt[p+1]=rt[p],++p;
int l1,r1,l2,r2,l3,r3,l,r,mid,fafa[4],lst=0,sum;
int q=gi();
while(q--){
for(rg int i=0;i<4;++i)fafa[i]=(gi()+lst)%n+1;
sort(fafa,fafa+4);
l1=fafa[0],r1=fafa[1],l2=fafa[1]+1,r2=fafa[2]-1,l3=fafa[2],r3=fafa[3];
l=1,r=m;
while(l<r){
mid=((l+r)>>1)+1;
sum=query(rt[mid],1,n,l1,r1).rmax+query(rt[mid],1,n,l2,r2).tot+query(rt[mid],1,n,l3,r3).lmax;
(sum>=0)?l=mid:r=mid-1;
}
printf("%d\n",lst=b[l]);
}
return 0;
}
P2839 [国家集训队]middle的更多相关文章
- [洛谷P2839][国家集训队]middle
题目大意:给你一个长度为$n$的序列$s$.$Q$个询问,问在$s$中的左端点在$[a,b]$之间,右端点在$[c,d]$之间的子段中,最大的中位数. 强制在线. 题解:区间中位数?二分答案,如果询问 ...
- 洛谷P2839 [国家集训队]middle 主席树_二分
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <strin ...
- Luogu P2839 [国家集训队]middle
题目 首先我们考虑解决中位数一类问题的常用手段:二分\(mid\),将大于等于它的设为\(1\),小于它的设为\(−1\),判断区间和是否\(\ge0\). 对于询问\(a,b,c,d\),二分完\( ...
- [国家集训队]middle 解题报告
[国家集训队]middle 主席树的想法感觉挺妙的,但是这题数据范围这么小,直接分块草过去不就好了吗 二分是要二分的,把\(<x\)置\(-1\),\(\ge x\)的置\(1\),于是我们需要 ...
- [国家集训队]middle
[国家集训队]middle 题目 解法 开\(n\)颗线段树,将第\(i\)颗线段树中大于等于第\(i\)小的数权值赋为1,其他的则为-1,对于每个区间维护一个区间和,最大前缀和,最大后缀和. 然后二 ...
- CF484E Sign on Fence && [国家集训队]middle
CF484E Sign on Fence #include<bits/stdc++.h> #define RG register #define IL inline #define _ 1 ...
- 【LG2839】[国家集训队]middle
[LG2839][国家集训队]middle 题面 洛谷 题解 按照求中位数的套路,我们二分答案\(mid\),将大于等于\(mid\)的数设为\(1\),否则为\(-1\). 若一个区间和大于等于\( ...
- BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)
BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...
- luogu2839 [国家集训队]middle
题目链接:洛谷 题目大意:给定一个长度为$n$的序列,每次询问左端点在$[a,b]$,右端点在$[c,d]$的所有子区间的中位数的最大值.(强制在线) 这里的中位数定义为,对于一个长度为$n$的序列排 ...
随机推荐
- 转: c#.net利用RNGCryptoServiceProvider产生任意范围强随机数的办法
//这样产生0 ~ 100的强随机数(含100) ; int rnd = int.MinValue; decimal _base = (decimal)long.MaxValue; ]; System ...
- UIWindow的windowLevel详解
UIWindow的windowLevel详解
- 全自动LTI部署OS
全自动LTI部署OS:零.通过ADK制作WinPE(需包含有imagex.exe工具,用来捕获映像)一.使用WinPE中的imagex捕获映像(install.wim)二.使用MDT制作启动映像(bo ...
- mysql 创建数据数据库 (避免新建的库名已经存在、设置编码)
1.创建数据库的 create database 数据库名 eg: Create database mydatabase 查看已创建的数据: show databases; 结果: 2.数据库名所对应 ...
- 自定义input[type="checkbox"]的样式
对复选框自定义样式,我们以前一直用的脚本来实现,不过现在可以使用新的伪类 :checkbox 来实现. 如果直接对复选框设置样式,那么这个伪类并不实用,因为没有多少样式能够对复选框起作用.不过,倒是可 ...
- JNLP应用程序无法打开的解决办法
JNLP应用程序无法打开: 1.控制面板-Java-Java 选项卡-查看.用户选项卡勾选对应版本JDK(没有就添加,路径填类似:D:\Program Files\Java\jre6\bin\java ...
- AE-----界面介绍
AE-----界面介绍 一.大纲leiji 层级: 比如:高楼一层一层的盖起来的.千层蛋糕(一层一层的).地质(一层一层构造的) 图层的特征:有顺序.上面的一层总会覆盖掉下面的一层. AfterEff ...
- Java NIO(一)I/O模型概述
基本概念讲述 什么是同步? 同步就是:如果有多个任务或者事件要发生,这些任务或者事件必须逐个地进行,一个事件或者任务的执行会导致整个流程的暂时等待,这些事件没有办法并发地执行. 什么是异步? 异步就是 ...
- 【node.js】函数、路由
Node.js中函数的使用与Javascript类似,一个函数可以作为另一个函数的参数.我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数. function say(word) { ...
- webbench安装和简单使用
一.安装流程 wget http://home.tiscali.cz/~cz210552/distfiles/webbench-1.5.tar.gz tar zxvf webbench-1.5.tar ...