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; }
代码如下:
#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; }