社区讨论
0pts过不了样例求条
P2839[国家集训队] middle参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mj0uz2tf
- 此快照首次捕获于
- 2025/12/11 11:08 2 个月前
- 此快照最后确认于
- 2025/12/13 15:40 2 个月前
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e4+5;
int n,q;
int a[N],re[N];
#define pii pair<int,int>
#define fi first
#define se second
pii pr[N];
int p[N];
struct sgt{
int ls,rs,pre,suf,sum;
}t[10000000];
int rt[N],id=1;
void build(int l,int r,int u){
t[u].pre=t[u].suf=t[u].sum=r-l+1;
if(l==r)return;
t[u].ls=++id;
build(l,(l+r)/2,t[u].ls);
t[u].rs=++id;
build((l+r)/2+1,r,t[u].rs);
}
void add(int l,int r,int p,int u,int nu){
if(l==r){
t[nu].pre=t[nu].suf=t[nu].sum=-1;
return;
}
int mid=(l+r)/2;
if(p<=mid){
t[nu].rs=t[u].rs;
t[nu].ls=++id;
add(l,mid,p,t[u].ls,t[nu].ls);
}
else{
t[nu].ls=t[u].ls;
t[nu].rs=++id;
add(mid+1,r,p,t[u].rs,t[nu].rs);
}
t[nu].pre=max(t[t[nu].ls].pre,t[t[nu].ls].sum+t[t[nu].rs].pre);
t[nu].suf=max(t[t[nu].rs].suf,t[t[nu].ls].suf+t[t[nu].rs].sum);
t[nu].sum=t[t[nu].ls].sum+t[t[nu].rs].sum;
}
sgt getans(int l,int r,int sl,int sr,int u){
if(sl<=l&&r<=sr)return t[u];
int mid=(l+r)/2;
if(sr<=mid){
return getans(l,mid,sl,sr,t[u].ls);
}
else if(sl>=mid+1)return getans(mid+1,r,sl,sr,t[u].rs);
else{
sgt x=getans(l,mid,sl,sr,t[u].ls);
sgt y=getans(mid+1,r,sl,sr,t[u].rs);
sgt ans;
ans.pre=max(x.pre,x.sum+y.pre);
ans.suf=max(y.suf+y.sum,x.suf);
ans.sum=x.sum+y.sum;
return ans;
}
}
int lst;
bool chk(int x,int a,int b,int c,int d){
sgt l=getans(1,n,a,b,rt[x]),r=getans(1,n,c,d,rt[x]);
sgt mid;
if(b+1<=c-1)getans(1,n,b+1,c-1,rt[x]);
else mid.sum=0;
if(l.suf+r.pre+mid.sum>=0)return 1;
else return 0;
}
int sol(int a,int b,int c,int d){
int l=1,r=n,ans,mid;
while(l<=r){
mid=(l+r)/2;
if(chk(mid,a,b,c,d)){
l=mid+1;
ans=l;
}else r=mid-1;
}
return re[ans];
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
pr[i]={a[i],i};
}
sort(pr+1,pr+1+n);
for(int i=1;i<=n;i++){
re[i]=a[pr[i].se];
p[i]=pr[i].se;
}
build(1,n,1);rt[1]=1;
for(int i=1;i<=n;i++){
rt[i+1]=++id;
add(1,n,p[i],rt[i],rt[i+1]);
}
cin>>q;
while(q--){
int Q[4];
for(int i=0;i<4;i++){
cin>>Q[i];
Q[i]=(Q[i]+lst)%n;
}sort(Q,Q+4);
lst=sol(Q[0]+1,Q[1]+1,Q[2]+1,Q[3]+1);
cout<<lst<<'\n';
}
return 0;
}
/*
5
170337785
271451044
22430280
969056313
206452321
3
3 1 0 2
2 3 1 4
3 1 4 0
*/
回复
共 0 条回复,欢迎继续交流。
正在加载回复...