请问线段树做法为啥不对??壶关
查看原帖
请问线段树做法为啥不对??壶关
684285
Makerlike楼主2024/7/14 17:38
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,a[N];
struct node{
	int mx,mxid;
	int mn,mnid;
};
struct SGT{
	node tr[N<<2];
	#define lson p<<1,L,mid
	#define rson p<<1|1,mid+1,R
	#define ls p<<1
	#define rs p<<1|1
	node merge(node a,node b){
		node c;
		if(a.mx>=b.mx){
			c.mxid=a.mxid;
			c.mx=a.mx;
		}
		else{
			c.mxid=b.mxid;
			c.mx=b.mx;
		}
		if(a.mn<b.mn){
			c.mnid=a.mnid;
			c.mn=a.mn;
		}
		else{
			c.mnid=b.mnid;
			c.mn=b.mn;
		}
		return c;
	}
	void build(int p,int L,int R){
		if(L==R){
			tr[p].mx=tr[p].mn=a[L];
			tr[p].mxid=tr[p].mnid=L;
			return ;
		}
		int mid=(L+R)>>1;
		build(lson);
		build(rson);
		tr[p]=merge(tr[ls],tr[rs]);
	}
	node query(int p,int L,int R,int l,int r){
		if(l<=L&&r>=R){
			return tr[p];
		}
		int mid=(L+R)>>1;
		if(l<=mid&&r<=mid)
			return query(lson,l,r);
		if(l>mid&&r>mid)
			return query(rson,l,r);
		return merge(query(lson,l,r),query(rson,l,r));
	}
}T;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	if(n<=1){
		cout<<"0\n";
		return 0;
	}
	if(n==2){
		if(a[1]<a[2])
			cout<<"2\n";
		else
			cout<<"0\n";
		return 0;
	}
	T.build(1,1,n);
	int ans=0;
	for(int i=1;i<=n;i++){
		node t1=T.query(1,1,n,1,i),t2=T.query(1,1,n,i,n);
		ans=max(ans,t1.mxid-t1.mnid+1);
		ans=max(ans,t2.mxid-t2.mnid+1);
	}
	cout<<ans<<"\n";
	return 0; 
} 
2024/7/14 17:38
加载中...