提交时间:2024-04-28 17:43:50

运行 ID: 28669

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back using namespace std; typedef long long ll; const int maxn=1e6+10; inline ll read(){ ll x=0;short t=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,q,OP; ll a[maxn],b[maxn],c[maxn],sa[maxn],sb[maxn],sc[maxn]; int dp[1005][1005]; map<ll,int>mp1[1005],mp2[1005],mp3; void slv(){ OP=read(),n=read(),q=read();up(i,1,n)a[i]=read(),sa[i]=sa[i-1]+a[i]; up(i,1,n)b[i]=read(),sb[i]=sb[i-1]+b[i]; up(i,1,n)c[i]=a[i]+b[i],sc[i]=sc[i-1]+c[i]; up(i,0,n){ up(j,0,n){ if(i==0&&j==0){ mp1[0][0]=mp2[0][0]=mp3[0]=0; continue; } if(i)dp[i][j]=max(dp[i][j],dp[i-1][j]); if(j)dp[i][j]=max(dp[i][j],dp[i][j-1]); if(mp1[j].count(sa[i]))dp[i][j]=max(dp[i][j],mp1[j][sa[i]]+1); if(mp2[i].count(sb[j]))dp[i][j]=max(dp[i][j],mp2[i][sb[j]]+1); if(i==j&&mp3.count(sc[i]))dp[i][j]=max(dp[i][j],mp3[sc[i]]+1); mp1[j][sa[i]]=max(mp1[j][sa[i]],dp[i][j]); mp2[i][sb[j]]=max(mp2[i][sb[j]],dp[i][j]); if(i==j)mp3[sc[i]]=max(mp3[sc[i]],dp[i][j]); //cout<<"DP "<<i<<' '<<j<<" : "<<dp[i][j]<<endl; } } if(OP){ ll res=0; up(i,0,n)up(j,0,n)res+=dp[i][j]; printf("%lld\n",res); } while(q--){ int x=read(),y=read(); printf("%d\n",dp[x][y]); } }int main(){ // freopen("zero.in","r",stdin); // freopen("zero.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }