列表

详情


NC213948. RikkawithMaximumSegmentSum

描述

Maximum Subsegment Sum is a classical problem. When Rikka first saw this problem, she was still an outsider of competitive programming, and now, she has become a problem setter of this grand event.
Therefore, Rikka decides to set a problem about Maximum Subsegment Sum. Given an array x of length m, its maximum subsegment sum is defined as:

Now, given an integer array A of length n, Rikka wants you to calculate the sum of the maximum subsegment sums of all subsegments of A, i.e.

输入描述

The first line contains a single integer .
The second line contains n integers .

输出描述

Output a single line with a single integer, the answer. The answer can be very large, therefore, you are only required to output the answer modulo .
More formally, suppose the answer is x, you are required to find the smallest non-negative integer y satisfying for some integer k.

示例1

输入:

5
1 -1 1 -1 1

输出:

11

示例2

输入:

5
1 -2 3 -4 5

输出:

39

示例3

输入:

10
1 -3 -5 7 -9 10 8 -6 -4 2

输出:

555

示例4

输入:

4
-1 -2 -3 -4

输出:

18446744073709551596

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++11) 解法, 执行用时: 45ms, 内存消耗: 5848K, 提交时间: 2020-11-24 19:43:36

#include<bits/stdc++.h>
#define rep(i,x,y) for(auto i=(x);i<=(y);++i)
#define dep(i,x,y) for(auto i=(x);i>=(y);--i)
using namespace std;
typedef long long ll;
const ll inf=1e18;
const int N=1e5+10;
ll a[N],bl[N],br[N],cl[N],cr[N],sl[N],sr[N],ans;
ll* fd1(ll*l,ll*r,ll x){
	while(l<r){
		ll*m=l+((r-l)>>1);
		if(*m>x)r=m;else l=m+1;
	}
	return l;
}
ll* fd2(ll*l,ll*r,ll x){
	while(l>r){
		ll*m=l-((l-r)>>1);
		if(*m>x)r=m;else l=m-1;
	}
	return l;
}
void sol(int L,int R){
	if(L==R){
		ans+=a[L];return;
	}
	int m=(L+R)>>1;
	sol(L,m);sol(m+1,R);
	ll nw=0,sum=0;bl[m+1]=cl[m+1]=-inf;sl[m+1]=0;
	dep(i,m,L){
		bl[i]=max(nw+=a[i],bl[i+1]);
		cl[i]=max(sum+=a[i],cl[i+1]);
		if(nw<0)nw=0;
		sl[i]=sl[i+1]+cl[i];
	}
	nw=sum=0;br[m]=cr[m]=-inf;sr[m]=0;
	rep(i,m+1,R){
		br[i]=max(nw+=a[i],br[i-1]);
		cr[i]=max(sum+=a[i],cr[i-1]);
		if(nw<0)nw=0;
		sr[i]=sr[i-1]+cr[i];
	}
	int l=m,r=m+1;
	while(l>=L||r<=R){
		if(r>R||(l>=L&&bl[l]<br[r])){
			int x=fd1(cr+m+1,cr+r,bl[l]-cl[l])-cr;
			ans+=bl[l]*(x-m-1)+cl[l]*(r-x)+sr[r-1]-sr[x-1];
			--l;
		}else{
			int x=fd2(cl+m,cl+l,br[r]-cr[r])-cl;
			ans+=br[r]*(m-x)+cr[r]*(x-l)+sl[l+1]-sl[x+1];
			++r;
		}
	}
}
int main(){int n;
	scanf("%d",&n);
	rep(i,1,n)scanf("%lld",&a[i]);
	sol(1,n);printf("%llu\n",(unsigned long long)ans);
}

上一题