社区讨论

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 条回复,欢迎继续交流。

正在加载回复...