社区讨论

WA 0pts求调

P10067[CCO 2023] Real Mountains参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mk3gawpb
此快照首次捕获于
2026/01/07 11:20
上个月
此快照最后确认于
2026/01/10 13:30
上个月
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int f=1,x=0;
	char s=getchar();
	while(s<'0'||s>'9'){
		if(s=='-') f=-1;
		s=getchar();
	}
	while(s>='0'&&s<='9'){
		x=(x<<1)+(x<<3)+(s^48);
		s=getchar();
	}
	return x*f;
}
const int N=1e6+3;
int n,m,ans;
int a[N],uni[N];
vector<int>same[N];
int tr[N<<2];
void PushUp(int u){
	tr[u]=min(tr[u<<1],tr[u<<1|1]);
}
void Build(int u,int l,int r){
	if(l==r){
		tr[u]=a[l];
		return;
	}
	int mid=l+r>>1;
	Build(u<<1,l,mid);
	Build(u<<1|1,mid+1,r);
	PushUp(u);
}
void Update(int u,int l,int r,int x,int k){
	if(l==r){
		tr[u]=k;
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) Update(u<<1,l,mid,x,k);
	else Update(u<<1|1,mid+1,r,x,k);
	PushUp(u);
}
int Query(int u,int l,int r,int x,int y){
	if(x<=l&&r<=y) return tr[u];
	int mid=l+r>>1,res=1e18;
	if(x<=mid) res=min(res,Query(u<<1,l,mid,x,y));
	if(y>mid) res=min(res,Query(u<<1|1,mid+1,r,x,y));
	return res;
}
int Query(int l,int r){
	if(l<=r) return Query(1,1,n,l,r);
	return 0;
}
int Change(int l,int r){
	return (l+r)*(r-l+1)/2%N;
}
int lmax[N],rmax[N];
bool vis[N];
set<int>sme;
void Solve(){
	n=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		uni[i]=a[i];
	}
	sort(uni+1,uni+n+1);
	m=unique(uni+1,uni+n+1)-uni-1;
	for(int i=1;i<=n;i++){
		a[i]=lower_bound(uni+1,uni+m+1,a[i])-uni;
		same[a[i]].push_back(i);
	}
	Build(1,1,n);
	int ltp=0,rtp=0;
	for(int i=1;i<=n;i++){
		lmax[i]=lmax[i-1];
		if(a[i]>lmax[i]){
			lmax[i]=a[i];
			ltp=i;
		}
	}
	for(int i=n;i>=1;i--){
		rmax[i]=rmax[i+1];
		if(a[i]>rmax[i]){
			rmax[i]=a[i];
			rtp=i;
		}
	}
	for(int i=1;i<=n;i++){
		int h=lmax[n];
		if(i<ltp) h=lmax[i];
		else if(i>rtp) h=rmax[i];
		same[h].push_back(i);
	}
	for(int i=1;i<m;i++){
		for(int j:same[i]){
			if(vis[j]){
				sme.erase(j);
				vis[j]=0;
			}else{
				sme.insert(j);
				vis[j]=1;
				Update(1,1,n,j,1e18);
			}
		}
		if(!sme.size()) continue;
		int lres=uni[i],rres=uni[i+1];
		if(sme.size()==1){
			int p=*sme.begin();
			ans=(ans+(Query(1,p-1)+Query(p+1,n))*(rres-lres)%N+Change(lres,rres-1))%N;
		}else{
			int x=*sme.begin(),y=*sme.rbegin(),sum=sme.size();
			ans=(ans+(min(Query(x+1,n),Query(1,y-1))
					+Query(1,x-1)+Query(y+1,n))*(rres-lres)%N
					+Change(lres+1,rres)*(2*sum-3)%N
					+sum*Change(lres,rres-1)%N)%N; 
		}
	}
	cout<<ans;
}
signed main(){
	int T=1;
	while(T--) Solve();
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...