ABC128F Frog Jump题解
文中
设
观察性质,发现可以把整条路径拆成两条,从起点出发每隔
然后枚举
发现不合法的方案满足
代码好写,可以不需要用数组预处理前/后缀和,但是这样写比较简单。
因为在处理后缀和的时候可能会越界,所以开了两倍空间(因为这个调了好久/ll)
code
const int N=2e5+5;
int a[N];
int pre[N],suf[N];
signed main(){
int n=read()-1;
for(int i=0;i<=n;i++)
a[i]=read();
int ans=0;
for(int d=1;d<=n;d++){
for(int i=d;i<=n;i+=d)
pre[i]=pre[i-d]+a[i];
for(int i=n;i>=0;i-=d)
suf[i]=suf[i+d]+a[i];
for(int A=n%d+((n%d==0)+1)*d;A<=n;A+=d){
if(n%d==0&&n-A>=A)
continue;
ans=max(ans,pre[n-A]+suf[A]);
}
}print(ans),pc('\n');
return 0;
}