题目
输入
输出
样例输入
10
1
0
0
2
0
0
1
2
2
2
样例输出
33
数据范围
分析
题目给出了一个环,
但是环不是很好处理,
所以我们要破环为链。
可以发现这一个点,
它满足没有任何一条运输路径跨越这个点。
我们可以这么 x2+y2≤(x+y)2
所以,所以的运输路线就尽量短。
就把每个点多出来的部分放到最靠近它自己的地方。
在求运输价值的时候可以利用平方和公式。
- 注意:long long
Code(c++)
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <string.h>
#include <cmath>
#include <stdlib.h>
#include <math.h>
#define ll long long
using namespace std;
int n,t[200003],i,j;
ll ans,sum;
int main()
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&t[i]);
t[i+n]=t[i];
}
for(int k=1;k<=n;k++)
{
sum=0;
for(j=k;j<=k+n;j++)
{
sum+=t[j];
if(sum<j-k+1)break;
}
if(j==k+n+1)
{
i=j=k;
break;
}
}
for(int k=i;k<i+n;k++)
{
if(t[k]>0)
{
sum=(t[k]+j-k-1)*(t[k]+j-k)*(2*(t[k]+j-k-1)+1)/6-(j-k-1)*(j-k)*(2*(j-k-1)+1)/6;
ans+=sum;
j+=t[k];
}
}
printf("%lld\n",ans);
}