D. Maximum Sum of Products
time limit per test2 seconds
memory limit per test256 megabytes
inputstandard input
outputstandard output
You are given two integer arrays a and b of length n.
You can reverse at most one subarray (continuous subsegment) of the array a.
Your task is to reverse such a subarray that the sum ∑i=1nai⋅bi is maximized.
Input
The first line contains one integer n (1≤n≤5000).
The second line contains n integers a1,a2,…,an (1≤ai≤107).
The third line contains n integers b1,b2,…,bn (1≤bi≤107).
Output
Print single integer — maximum possible sum after reversing at most one subarray (continuous subsegment) of a.
Examples
inputCopy
5
2 3 2 1 3
1 3 2 4 2
outputCopy
29
inputCopy
2
13 37
2 4
outputCopy
174
inputCopy
6
1 8 7 6 3 6
5 9 6 8 8 6
outputCopy
235
Note
In the first example, you can reverse the subarray [4,5]. Then a=[2,3,2,3,1] and 2⋅1+3⋅3+2⋅2+3⋅4+1⋅2=29.
In the second example, you don’t need to use the reverse operation. 13⋅2+37⋅4=174.
In the third example, you can reverse the subarray [3,5]. Then a=[1,8,3,6,7,6] and 1⋅5+8⋅9+3⋅6+6⋅8+7⋅8+6⋅6=235.
积累技巧:
倒换反转:考虑中心,中心开花
中心周围,是一层一层贪心
不用枚举各种情况
(也是搞一次倒换应该做的)
#include<bits/stdc++.h>
#define _forplus(i,a,b) for(register int (i)=(a);(i)<=(b);(i)++)
#define forplus(i,a,b) for(register int (i)=(a);(i)<(b);(i)++)
#define ll long long
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define fastio std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);
using namespace std;
#define N 5005
int n;
ll a[N],b[N];
//倒换:考虑中心,中心开花
int main(){
fastio
cin>>n;
_forplus(i,1,n){
cin>>a[i];
}
_forplus(i,1,n){
cin>>b[i];
}
ll sum=0;
_forplus(i,1,n){
sum+=a[i]*b[i];
}
ll best=sum;
ll now=sum;
//奇数个倒换
_forplus(i,2,n-1){//中心为i
now=sum;
int fd=min(n-i,i-1);
_forplus(j,1,fd){
now+=(a[i-j]*b[i+j]+a[i+j]*b[i-j]-a[i-j]*b[i-j]-a[i+j]*b[i+j]);
best=max(now,best);
}
}
//偶数个倒换
_forplus(i,1,n-1){//中心-0.5为i
now=sum;
int fd=min(i,n-i);
_forplus(j,1,fd){
now+=(a[i-j+1]*b[i+j]+a[i+j]*b[i-j+1]-a[i-j+1]*b[i-j+1]-a[i+j]*b[i+j]);
best=max(now,best);
}
}
cout<<best<<endl;
return 0;
}