cf 1016C
Vasya's house is situated in a forest, and there is a mushroom glade near it. The glade consists of two rows, each of which can be divided into n consecutive cells. For each cell Vasya knows how fast the mushrooms grow in this cell (more formally, how many grams of mushrooms grow in this cell each minute). Vasya spends exactly one minute to move to some adjacent cell. Vasya cannot leave the glade. Two cells are considered adjacent if they share a common side. When Vasya enters some cell, he instantly collects all the mushrooms growing there.
Vasya begins his journey in the left upper cell. Every minute Vasya must move to some adjacent cell, he cannot wait for the mushrooms to grow. He wants to visit all the cells exactly once and maximize the total weight of the collected mushrooms. Initially, all mushrooms have a weight of 0. Note that Vasya doesn't need to return to the starting cell.
Help Vasya! Calculate the maximum total weight of mushrooms he can collect.
The first line contains the number n (1 ≤ n ≤ 3·105) — the length of the glade.
The second line contains n numbers a1, a2, ..., an (1 ≤ ai ≤ 106) — the growth rate of mushrooms in the first row of the glade.
The third line contains n numbers b1, b2, ..., bn (1 ≤ bi ≤ 106) is the growth rate of mushrooms in the second row of the glade.
Output one number — the maximum total weight of mushrooms that Vasya can collect by choosing the optimal route. Pay attention that Vasya must visit every cell of the glade exactly once.
3
1 2 3
6 5 4
70
3
1 1000 10000
10 100 100000
543210
In the first test case, the optimal route is as follows:

In the second test case, the optimal route is as follows:

1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 #include<vector> 7 using namespace std; 8 typedef long long ll; 9 int n; 10 #define N 300009 11 #define ll long long 12 ll a[2][N],sum[2][N],s[N]; 13 /* 14 sum[0][i]:从a[0][i]走到a[1][i]的花费,a[0][i]为起点,a[1][i]为终点 15 sum[0][i]:从a[1][i]走到a[0][i]的花费,a[1][i]为起点,a[0][i]为终点 16 s[i] : 前i列的两行数据之和 17 */ 18 int main() 19 { 20 scanf("%d",&n); 21 for(int i=1;i<=n;i++) scanf("%lld",&a[0][i]); 22 for(int i=1;i<=n;i++) scanf("%lld",&a[1][i]); 23 for(int i=1;i<=n;i++) s[i]=s[i-1]+a[0][i]+a[1][i]; 24 sum[0][n]=a[1][n];sum[1][n]=a[0][n]; 25 for(int i=n-1;i>=1;i--){ 26 sum[0][i]=sum[0][i+1]+s[n]-s[i]+a[1][i]*(1+2*(n-i)); 27 /* 28 s[n]-s[i]+a[1][i]*(1+2*(n-i)):sum[0][i]与sum[1][i]的差值 29 */ 30 sum[1][i]=sum[1][i+1]+s[n]-s[i]+a[0][i]*(1+2*(n-i)); 31 } 32 ll ans=sum[0][1]; 33 ll cnt=0; 34 //只能前面若干个锯齿行走,在U 行走 35 for(int i=1;i<=n;i++){ 36 if(i&1){ 37 cnt+=a[0][i]*(2*i-2)+a[1][i]*(2*i-1);//锯齿花费 38 ans=max(ans,cnt+sum[1][i+1]+(s[n]-s[i])*(2*i)); 39 //(s[n]-s[i])*(2*i) :sum[1][i+1]的起点为i+1,但实际不是 40 } 41 else{ 42 cnt+=a[0][i]*(2*i-1)+a[1][i]*(2*i-2); 43 ans=max(ans,cnt+sum[0][i+1]+(s[n]-s[i])*(2*i)); 44 } 45 } 46 printf("%lld\n",ans); 47 return 0; 48 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现