【CF Educational Codeforces Round 48 (Rated for Div. 2) C,1016C】
又要掉rating, orz ,灰名边缘挣扎
CF1016C
一道DP(与数学结合?)
题意:两行数都为0,每秒增加一个数(每个位置上增长速度不一样),求全部都走过恰好一遍的最大值
可以考虑到其只能开始曲折上下走,要么就一直向右然后又回折向左。
那么就有f[0][i]表示从i号点的上行向右一路到底又回折一路向左,f[1][i]表示从i号点的下行向右一路到底又回折一路向左,枚举从什么地方结束上下回折。然后随便推推就可以搞出来了。
就是思路一定要清晰!不然就像蒟蒻一样,写炸得样例都过不了orz orz orz
#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define int long long
using namespace std;
const int maxn = 300005;
int sum[maxn],f[2][maxn];
int QZ,dd,n,a[2][maxn];
int ANS;
main()
{
scanf("%I64d",&n);
for(int i=0;i<n;i++) scanf("%I64d",&a[0][i]);
for(int i=0;i<n;i++) scanf("%I64d",&a[1][i]);
for(int i=n-1;i>=0;i--)
{
sum[i]=sum[i+1]+a[0][i]+a[1][i];
f[0][i]=f[0][i+1]+sum[i+1]+a[1][i]*((n-i)*2-1);
f[1][i]=f[1][i+1]+sum[i+1]+a[0][i]*((n-i)*2-1);
}
for(int i=0;i<n;i++)
{
ANS = max(ANS,f[i&1][i]+i*2*sum[i]+QZ);
QZ+=dd*a[i&1][i]; dd++;
QZ+=dd*a[(i&1)^1][i]; dd++;
}
printf("%I64d",ANS);
}

浙公网安备 33010602011771号