BZOJ 2653: middle | 주석 트 리
13242 단어 의장 수
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<iostream>
#include<algorithm>
#define ll unsigned long long
#define N 20022
#define mx 1e9
using namespace std;
int sc()
{
int i=0,f=1; char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')i=i*10+c-'0',c=getchar();
return i*f;
}
struct W{int v,pos;}h[N];
int sum[N*500],lmx[N*500],rmx[N*500],ch[N*500][2];
int root[N],q[4];
int n,m,cnt,ans;
bool cmp(W a,W b){return a.v<b.v;}
void push_up(int x)
{
sum[x]=sum[ch[x][0]]+sum[ch[x][1]];
lmx[x]=max(lmx[ch[x][0]],sum[ch[x][0]]+lmx[ch[x][1]]);
rmx[x]=max(rmx[ch[x][1]],sum[ch[x][1]]+rmx[ch[x][0]]);
}
void build(int &x,int l,int r)
{
if(!x)x=++cnt;
if(l==r)
{
sum[x]=lmx[x]=rmx[x]=1;
return;
}
int mid=l+r>>1;
build(ch[x][0],l,mid);
build(ch[x][1],mid+1,r);
push_up(x);
}
void add(int pre,int &x,int l,int r,int v,int f)
{
if(!x)x=++cnt;
if(l==r)
{
lmx[x]=rmx[x]=sum[x]=f;
return;
}
int mid=l+r>>1;
if(v<=mid)
ch[x][1]=ch[pre][1],add(ch[pre][0],ch[x][0],l,mid,v,f);
else
ch[x][0]=ch[pre][0],add(ch[pre][1],ch[x][1],mid+1,r,v,f);
push_up(x);
}
int ask_all(int x,int L,int R,int l,int r)
{
if(L==l&&R==r)return sum[x];
int mid=L+R>>1;
if(r<=mid)return ask_all(ch[x][0],L,mid,l,r);
else if(l>mid)return ask_all(ch[x][1],mid+1,R,l,r);
return ask_all(ch[x][0],L,mid,l,mid)+ask_all(ch[x][1],mid+1,R,mid+1,r);
}
int ask_left(int x,int L,int R,int l,int r)
{
if(L==l&&R==r)return lmx[x];
int mid=L+R>>1;
if(r<=mid)return ask_left(ch[x][0],L,mid,l,r);
else if(l>mid)return ask_left(ch[x][1],mid+1,R,l,r);
return max(ask_left(ch[x][0],L,mid,l,mid),ask_all(ch[x][0],L,mid,l,mid)+ask_left(ch[x][1],mid+1,R,mid+1,r));
}
int ask_right(int x,int L,int R,int l,int r)
{
if(L==l&&R==r)return rmx[x];
int mid=L+R>>1;
if(r<=mid)return ask_right(ch[x][0],L,mid,l,r);
else if(l>mid)return ask_right(ch[x][1],mid+1,R,l,r);
return max(ask_right(ch[x][1],mid+1,R,mid+1,r),ask_all(ch[x][1],mid+1,R,mid+1,r)+ask_right(ch[x][0],L,mid,l,mid));
}
bool check(int x,int a,int b,int c,int d)
{
int sum=ask_left(root[x],1,n,c,d)+ask_right(root[x],1,n,a,b);
if(b+1<c) sum+=ask_all(root[x],1,n,b+1,c-1);
return sum>=0;
}
int main()
{
n=sc();
for(int i=1;i<=n;i++)
h[i].v=sc(),
h[i].pos=i;
sort(h+1,h+n+1,cmp);
build(root[1],1,n);
for(int i=2;i<=n;i++)
add(root[i-1],root[i],1,n,h[i-1].pos,-1);
m=sc();
for(int i=1;i<=m;i++)
{
for(int j=0;j<4;j++)
q[j]=(sc()+ans)%n+1;
sort(q,q+4);
int l=1,r=n;ans=1;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid,q[0],q[1],q[2],q[3]))ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d
",ans=h[ans].v);
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
POJ 2104 K - th Number 문제 풀이 & 코드뭐 공부 해요?HDU 제목 이랑 똑 같 아 요?아니 야, 아니 야. 이게 다 중 데이터 가 아니 야.http://blog.csdn.net/Rainbow6174/article/details/50374737 사실 포 인...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.