【CF1016C】Vasya And The Mushrooms(模拟)

题意:给定一个2*n的矩阵,每一个点有一个权值,从左上角出发,时间t=0开始,连续的走,将矩阵走完,

每走一步,t++,并且得到t*当前格子的权值的值,求最大的权值和

n<=3e5,1<=a[i][j]<=1e6

思路:合法的构造方案如图

记录几个前缀和,真的不想写这种题

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 typedef long long ll;
 6 using namespace std;
 7 #define N   310000
 8 #define oo  10000000
 9 #define MOD 1000000007
10 
11 ll s1[2][N],s2[2][N],s3[2][N],a[2][N];
12 
13 int main()
14 {
15     int n;
16     scanf("%d",&n);
17     for(int i=0;i<2;i++)
18      for(int j=0;j<n;j++) scanf("%lld",&a[i][j]);
19     for(int i=0;i<2;i++)
20      for(int j=n-1;j>=0;j--)
21      {
22          s1[i][j]=s1[i][j+1]+a[i][j]*(j+1);
23          s2[i][j]=s2[i][j+1]+a[i][j]*(n-j);
24          s3[i][j]=s3[i][j+1]+a[i][j];
25      }
26     ll sum=0,ans=0;
27     for(int i=0,j=0;j<n;j++,i^=1)
28     {
29         ll tmp=sum;
30         tmp+=s1[i][j]+s3[i][j]*j;
31         tmp+=s2[i^1][j]+s3[i^1][j]*(j+n);
32         ans=max(ans,tmp);
33         sum+=a[i][j]*(j*2+1);
34         sum+=a[i^1][j]*(j*2+2);
35     }
36     for(int i=0;i<n;i++) ans-=a[0][i]+a[1][i];
37     printf("%lld\n",ans);
38     return 0;
39 }
40     

猜你喜欢

转载自www.cnblogs.com/myx12345/p/9936811.html