显示代码纯文本
#include <iostream>
#include <cstdio>
#include <unordered_map>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n,f[N][2];
ll sum,a[N][2],s[N][2];
unordered_map<ll,int>T[2],t[2];
int main(){
freopen("Chocolate.in","r",stdin);
freopen("Chocolate.out","w",stdout);
scanf("%d",&n);
for(int i=0;i<=1;i++){
for(int j=1;j<=n;j++){
scanf("%d",&a[j][i]);
sum+=a[j][i];
}
}
for(int i=0;i<=1;i++){
for(int j=1;j<=n;j++){
a[j][i]=2*n*a[j][i]-sum;
s[j][i]=s[j-1][i]+a[j][i];
}
}
T[0][0]=0,T[1][0]=0;
for(int i=1;i<=n;i++){
for(int j=0;j<=1;j++){
f[i][j]=max(f[i-1][1],f[i-1][0]);
if(T[j].count(s[i][j^1]))f[i][j]=max(f[i][j],T[j][s[i][j^1]]+1);
if(t[j^1].count(s[i][j^1]))f[i][j]=max(f[i][j],t[j^1][s[i][j^1]]+1);
}
if(s[i][0]+s[i][1]==0)f[i][0]=f[i][1]=max(f[i][0],f[i][1])+1;
for(int j=0;j<=1;j++){
ll sum=s[i][j^1];
T[j][sum]=max(T[j][sum],f[i][j]);
t[j][-sum]=max(t[j][-sum],f[i][j]);
}
}
printf("%d\n",f[n][0]);
return 0;
}