RE 30pts 求助
查看原帖
RE 30pts 求助
363513
Lonely_Romance楼主2022/10/18 22:01
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define f(i,x,y,z) for(long long i=x;i<=y;i+=z)
#define fd(i,x,y,z) for(long long i=x;i>=y;i-=z)
ll n;
ll a[2000005];
ll ans=0;
struct Node{
	ll l,r,mx,mn,mxk,mnk;
}t[8000005];
Node nmm;
void pushup(ll now){
	t[now].mx=max(t[now<<1].mx,t[now<<1|1].mx);
	t[now].mn=min(t[now<<1].mn,t[now<<1|1].mn);
	if(t[now<<1].mx<t[now<<1|1].mx){
		t[now].mxk=t[now<<1|1].mxk;
	}
	else if(t[now<<1].mx>t[now<<1|1].mx){
		t[now].mxk=t[now<<1].mxk;
	}
	else if(t[now<<1].mx==t[now<<1|1].mx){
		t[now].mxk=min(t[now<<1].mxk,t[now<<1|1].mxk);
	}
	if(t[now<<1].mn<t[now<<1|1].mn){
		t[now].mnk=t[now<<1].mnk;
	}
	else if(t[now<<1].mn>t[now<<1|1].mn){
		t[now].mnk=t[now<<1|1].mnk;
	}
	else if(t[now<<1].mn==t[now<<1|1].mn){
		t[now].mnk=max(t[now<<1].mnk,t[now<<1|1].mnk);
	}
}
void build(ll now,ll l,ll r){
	t[now].l=l,t[now].r=r;
	if(l==r){
		t[now].mx=t[now].mn=a[l];
		t[now].mxk=t[now].mnk=l;
		return;
	}
	ll mid=(l+r)>>1;
	build(now<<1,l,mid);
	build(now<<1|1,mid+1,r);
	pushup(now);
}
Node query(ll now,ll l,ll r){
	if(l>r){
		return nmm;
	}
	if(t[now].l>=l&&t[now].r<=r){
		return t[now];
	}
	Node tot={0,0,0,0,0,0};
	ll mid=(t[now].l+t[now].r)>>1;
	if(l<=mid){
		Node _=query(now<<1,l,r);
		tot=_;
	}
	if(r>mid){
		Node _=query(now<<1,l,r);
	 	if(tot.mx<_.mx){
	 		tot.mx=_.mx;
	 		tot.mxk=_.mxk;
	 	}
	 	else if(tot.mx==_.mx){
	 		tot.mxk=min(tot.mxk,_.mxk);
	 	}
	 	if(tot.mn>_.mn){
	 		tot.mn=_.mn;
	 		tot.mnk=_.mnk;
	 	}
	 	else if(tot.mn==_.mn){
	 		tot.mnk=max(tot.mnk,_.mnk);
	 	}
	}
	return tot;
}
void solve(ll l,ll r){
	if(l>=r||l<0||r<0){
		return;
	}
	Node x=query(1,l,r);
	Node y=query(1,l,x.mxk);
	if(x.mxk!=y.mnk){
		ans=max(ans,x.mxk-y.mnk+1);
	}
	solve(l,y.mnk-1);
	solve(x.mxk+1,r);
}
int main(){
	scanf("%lld",&n);
	f(i,1,n,1){
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	solve(1,n);
	printf("%lld\n",ans);
	return 0;
}

用线段树写的,怎么都RE/kk

2022/10/18 22:01
加载中...