先算区间中的(正数对应的和与最小值)再算(负数对应的和与最小值)
其中 负数对应区间的最小值等于它的正数区间的最大值
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=3e6+7;
ll a[maxn],b[maxn];
int main()
{
int n;scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
for (int i=1;i<=n;i++) scanf("%lld",&b[i]);
ll mn=a[1],sum=b[1];
ll ans=a[1]*b[1];
for (int i=2;i<=n;i++)
{
ans=max(a[i]*b[i],ans);
if(sum<0) {sum=b[i];mn=a[i];}
else
{
mn=min(mn,a[i]);
sum+=b[i];
ans=max(mn*sum,ans);
}
a[i]*=(-1);b[i]*=(-1);
}
int mx=a[1];sum=b[1];
for (int i=2;i<=n;i++)
{
ans=max(a[i]*b[i],ans);
if(sum<0) {sum=b[i];mx=a[i];}
else
{
mx=max(mx,a[i]);
sum+=b[i];
ans=max(mx*sum,ans);
}
}
printf("%lld\n",ans);
return 0;
}