杂项
枚举翻转中心后向左右扩展可以快速计算翻转每个区间后的答案。
时间复杂度 $O(n^2)$。
#include<bits/stdc++.h>
using namespace std;
int n,ans,a[5001],b[5001];
long long sum[5001];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
transform(a+1,a+n+1,b+1,sum+1,[](int x,int y){return 1ll*x*y;});
for(int i=1;i<=n;i++) sum[i]+=sum[i-1];
long long ans=sum[n];
for(int i=2;i<=n-1;i++){
long long now=1ll*a[i]*b[i];
int l=i-1,r=i+1;
while(l>=1&&r<=n){
now+=1ll*a[l]*b[r]+1ll*b[l]*a[r];
ans=max(ans,sum[n]-sum[r]+sum[l-1]+now);
l--,r++;
}
}
for(int i=1;i<=n-1;i++){
long long now=0ll;
int l=i,r=i+1;
while(l>=1&&r<=n){
now+=1ll*a[l]*b[r]+1ll*b[l]*a[r];
ans=max(ans,sum[n]-sum[r]+sum[l-1]+now);
l--,r++;
}
}
printf("%lld\n",ans);
return 0;
}