【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);
}
 
posted @ 2018-08-04 14:29  Newuser233  阅读(4)  评论(0)    收藏  举报