ST表90pts求调2关
查看原帖
ST表90pts求调2关
1063855
xu_zhihao楼主2024/9/28 16:03

rt

#include<bits/stdc++.h>
using namespace std;
int st[500010][25];
int a[500010],b[500010];
int nxt[500010];
int lst[500010];//上一个出现在哪里 
int head[500010];
int cnt[500010];

int n;
void Init(){
	int lg=log2(1+n);
	for(int i=1;i<=n;i++){
		st[i][0]=a[i];
	}
	for(int j=1;j<=lg;j++){
		for(int i=1;i<=n;i++)if(i+(1<<j)-1<=n){
			st[i][j]=max(st[i][j-1],st[i+(1<<(j-1))][j-1]);
		}
	}
	/*构建一条链记录nxt[i]*/ 
	for(int i=n;i>=1;i--){
		if(!lst[a[i]]){
			nxt[i]=-1;
			lst[a[i]]=i;
		}
		else{
			nxt[i]=lst[a[i]];
			lst[a[i]]=i;
		}
	}
	for(int i=1;i<=n;i++){
		if(!head[a[i]]){
			head[a[i]]=i;
		}
	} 
	return;
}
int Max(int l,int r){
	int lg=log2(r-l+1);
	int ans=max(st[l][lg],st[r-(1<<lg)+1][lg]);
	return ans;
}
long long C(int n,int m){
	long long ans=(n*(n-1))/2;
	return ans;
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		b[i]=abs(a[i]);
	}
	sort(b+1,b+n+1);
	int m=unique(b+1,b+n+1)-b-1;
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(b+1,b+m+1,abs(a[i]))-b;
	}
	Init();
	long long ret=0;
	for(int i=1;i<=m;i++){
		int l=0,r=0;
		cnt[i]=1;
		long long sum=1;
		for(int j=head[i];nxt[j]!=-1;j=nxt[j]){
			//cout<<j<<" ";
			l=j;
			r=nxt[j];
			int ans=Max(l,r);
			if(!(ans^i)){
				sum++;
			}
			else{
				if(!b[i]){
					long long ans=C(sum,2);
			        ret+=ans;
			        sum=1;
					continue;
				}
				if(sum==1){
					continue;
				}
				long long x=sum/2ll;
			    long long y=sum-x;
			    long long ans=C(x,2)+C(y,2);
			    ret+=ans;
			    sum=1;
			} 
		}
		cout<<endl;
		if(sum==1){
			continue;
		}
		if(!b[i]){
			
			long long ans=C(sum,2);
			ret+=ans;
			continue;
		}
		long long x=sum/2ll;
		long long y=sum-x;
		long long ans=C(x,2)+C(y,2);
		ret+=ans;
	} 
	printf("%lld\n",ret); 
	return 0;
}
2024/9/28 16:03
加载中...