社区讨论

调不过力:(

P6406[COCI 2014/2015 #2] Norma参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lt9vccxj
此快照首次捕获于
2024/03/02 17:16
2 年前
此快照最后确认于
2024/03/02 19:33
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mo = 1e9;
const int N = 5e5 + 1145;
int n;
ll ans,a[N],qzh[N];
ll qzmx[N],qzmn[N],qzhmx[N],qzhmn[N],qzsum[N],qzhsum[N];

void solve(int l,int r){
	if(r==l) {
		(ans+=a[l]*a[l]%mo)%=mo;
		return ; 
	}
	int mid=l+r>>1;
	solve(l,mid),solve(mid+1,r);
	ll mn=a[mid+1],mx=a[mid+1];
	for(int i=mid+1;i<=r;i++) {
		mx=max(mx,a[i]),mn=min(mn,a[i]);
		(qzmx[i]=mx+qzmx[i-1])%=mo,(qzmn[i]=mn+qzmn[i-1])%=mo;
		(qzhmx[i]=mx*(i-mid)%mo+qzhmx[i-1])%=mo,(qzhmn[i]=mn*(i-mid)%mo+qzhmn[i-1])%=mo;
		(qzsum[i]=mx*mn%mo+qzsum[i-1])%=mo,(qzhsum[i]=mx*mn%mo*(i-mid)%mo+qzhsum[i-1])%=mo;
	}
	mx=a[mid],mn=a[mid];
	int mnid=mid,mxid=mid;
	for(int i=mid;i>=l;i--){
		mx=max(mx,a[i]),mn=min(mn,a[i]);
		while(a[mnid+1]>mn&&mnid<r) mnid++; 
		while(a[mxid+1]<mx&&mxid<r) mxid++;
		int s1=min(mnid,mxid),s2=max(mnid,mxid);
		if(s1>mid) (ans+=mx*mn%mo*((mid+1-i+1+s1-i+1)*(s1-(mid+1)+1)/2%mo)%mo)%=mo;//(qzh[s1-i+1]-qzh[mid-i]+mo)%mo)%=mo;//懒得写式子 
		if(mnid>s1) (ans+=mn*(((mid-i+1)*(qzmx[s2]-qzmx[s1])%mo+qzhmx[s2]-qzhmx[s1]+mo)%mo))%=mo;//从mxid开始有比mx更大的数 
		if(mxid>s1) (ans+=mx*(((mid-i+1)*(qzmn[s2]-qzmn[s1])%mo+qzhmn[s2]-qzhmn[s1]+mo)%mo))%=mo;
		(ans+=(qzhsum[r]-qzhsum[s2]+mo)%mo+(mid-i+1)*(qzsum[r]-qzsum[s2]+mo)%mo)%=mo;
		
	}
	for(int i=mid+1;i<=r;i++) {
		qzmx[i]=0,qzmn[i]=0;
		qzhmx[i]=0,qzhmn[i]=0;
		qzsum[i]=0,qzhsum[i]=0;
	}
}

int main()
{
	cin>>n;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	solve(1,n);
	cout<<ans;
	return 0;
}

回复

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

正在加载回复...