MnZn10pts求调
查看原帖
MnZn10pts求调
863752
Red_stars楼主2024/7/19 18:52
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+5;
const int mod=1e9+7;
int n;
LL a[N];
LL f1[N],f0[N],g1[N],g0[N],cur[N];
LL solve(int l,int r){
	if(l==r){
		//cout<<l<<" "<<r<<" "<<a[l]<<endl;
		return a[l];
	}
	if(r-l==1){
		//cout<<l<<" "<<r<<" "<<a[l]+a[r]+max(a[l],a[r])<<endl;
		return a[l]+a[r]+max(a[l],a[r]);
	}
	if (r-l==2){
		return a[l]+a[l+1]+a[r]+max(a[l],a[l+1])+max(a[l+1],a[r])+max(a[l+1],a[l]+a[r]);
	}
	int mid=(l+r)>>1;
	LL ans=(solve(l,mid)+solve(mid+1,r))%mod;
    for(int i=l;i<=r;i++)f1[i]=f0[i]=0;
    for(int i=l;i<=r;i++)g1[i]=g0[i]=0;
    f1[mid]=a[mid];
    for(int i=mid-1;i>=l;i--){
        f1[i]=max(f1[i+1],f1[i+2]+a[i]);
    }
    for(int i=mid-1;i>=l;i--){
        f0[i]=max(f0[i+1],f0[i+2]+a[i]);
    }
    g1[mid+1]=a[mid+1];
    for(int i=mid+2;i<=r;i++){
        g1[i]=max(g1[i-1],g1[i-2]+a[i]);
    }
    for(int i=mid+2;i<=r;i++){
        g0[i]=max(g0[i-1],g0[i-2]+a[i]);
    }
    for(int i=mid+1;i<=r;i++){
    	cur[i]=g1[i]-g0[i];
	}
	sort(cur+mid+1,cur+r+1);
	//cout<<l<<" "<<r<<endl;
  	for(int i=l;i<=mid;i++){
  		LL p=f1[i]-f0[i];
  		LL op=lower_bound(cur+mid+1,cur+r+1,p)-(cur+mid+1);
  		ans+=f1[i]*(op);
  		//cout << op << endl;
  		//cout<<f1[i]<<" "<<f1[i]*(op)<<endl;
  		ans+=f0[i]*((r-mid-op)); 
  		//cout<<f0[i]<<" "<<f0[i]*(r-mid-op)<<endl;
	}
    for(int i=l;i<=mid;i++){
    	cur[i]=f1[i]-f0[i];
	}
	sort(cur+l,cur+mid+1);
  	for(int i=mid+1;i<=r;i++){
  		LL p=g1[i]-g0[i];
  		LL op=lower_bound(cur+l,cur+mid+1,p)-(cur+l);
  		ans+=g1[i]*(op);
		//cout<<g1[i]<<" "<<g1[i]*(op)<<endl;  		
		ans+=g0[i]*(mid-l-op+1); 
		//cout<<g0[i]<<" "<<g0[i]*(mid-l-op+1)<<endl;
	}
	ans%=mod;
//    for(int i=l;i<=mid;i++){
//        for(int j=mid+1;j<=r;j++){
//        	//cout << i << " " << j << " " << max(f1[i]+g0[j],f0[i]+g1[j]) << endl;
//            ans=(ans+max(f1[i]+g0[j],f0[i]+g1[j]))%mod;
//        }
//    }
    //cout<<l<<" "<<r<<" "<<ans<<endl;
    return ans;
}
int main () {
	scanf("%d",&n);
	for(int i=1;i<=n;i++)scanf("%d",a+i);
	printf("%d\n",solve(1,n));
	return 0;
}

2024/7/19 18:52
加载中...