CF 1016 C —— 思路

题目:http://codeforces.com/contest/1016/problem/C

一定是先蛇形走在回形走,所以预处理、暴力即可;

自己一开始写了一个,总是WA,又看了看TJ写法;

模仿一下,还是WA,发现中间的一些地方 int 相乘要加 (ll)!

然后把我原来那个改一下就A了...

20分钟写,60分钟调...

不过模仿的那个写法比我原来的快多了(虽然做法一样)。

模仿:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const maxn=3e5+5;
int n,g[3][maxn];
ll s[3][maxn],f[3][maxn][3],ans;
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)scanf("%d",&g[0][i]);
    for(int i=0;i<n;i++)scanf("%d",&g[1][i]);
    for(int j=0;j<=1;j++)
        for(int i=n-1;i>=0;i--)
        {
            f[j][i][0]=f[j][i+1][0]+(ll)(n-i-1)*g[j][i];//<-  
            f[j][i][1]=f[j][i+1][1]+(ll)i*g[j][i];//->  //走过来一定在 i 时间或以后 
            s[j][i]=s[j][i+1]+g[j][i];
        }
    ll w=0,add=0;
    for(int x=0,y=0;x<n;x++,y^=1)
    {
        add=x*s[y][x]+f[y][x][1]+(x+n)*s[!y][x]+f[!y][x][0];
        ans=max(ans,w+add);
        w+=(ll)g[y][x]*2*x+(ll)g[!y][x]*(2*x+1);
    }
    printf("%I64d\n",ans);
    return 0;
}
View Code

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int const maxn=3e5+5;
int n,g[3][maxn];
ll s[3][maxn],f[3][maxn][3],ans;
void dfs(int x,int y,ll w)
{
    if(x==n)return;
    ll t=2*x,tt=t+n-x;
    ans=max(ans,w+t*s[y][x+1]+f[y][x+1][1]+tt*s[!y][x+1]+f[!y][x+1][0]);
    dfs(x+1,y^1,w+(ll)(t+1)*(g[0][x+1]+g[1][x+1])+g[!y][x+1]);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)cin>>g[0][i];
    for(int i=1;i<=n;i++)cin>>g[1][i];
    for(int j=0;j<=1;j++)
    {
        for(int i=n,k=1;i;i--,k++)
        {
            f[j][i][0]=f[j][i+1][0]+(ll)k*g[j][i];//<-
            s[j][i]=s[j][i+1]+g[j][i];
        }
        for(int i=n;i;i--)
        {
            f[j][i][1]=f[j][i+1][1]+s[j][i];//->
        }
    }
    dfs(0,0,0);
    cout<<ans-s[1][1]-s[0][1];
    return 0;
}

 

posted @ 2018-08-15 20:35  Zinn  阅读(258)  评论(0编辑  收藏  举报