rt,有没有哪位大佬能证明我这个实现方法第二问的不重不漏。
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
const int N=5005;
const int mod=1e9+7;
int op,t,n;
int a[N],b[N],c[N],ml[N],mr[N],l,r;
ll f[N],g[N],s[N],mx[2][N][N],nx[2][N][N],st[N],d,tot[N],ptot[N],pc[N],val;
ll maxnf,sumg;
ll poww(ll a,ll b){
ll res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b/=2;
}
return res;
}
signed main(){
cin>>op>>t;
while(t--){
cin>>n;
tot[0]=1;
ptot[0]=1;
memset(g,0,sizeof(g));
memset(f,-0x3f,sizeof(f));
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=n;i++) cin>>c[i];
for(int i=1;i<=n;i++) s[i]=s[i-1]+b[i];
for(int i=1;i<=n;i++) pc[i]=poww(c[i],mod-2);
for(int i=1;i<=n;i++) tot[i]=tot[i-1]*c[i]%mod;
for(int i=1;i<=n;i++) ptot[i]=poww(tot[i],mod-2);
for(int i=1;i<=n;i++){
st[i]=st[i-1];
if(i&1) st[i]-=a[i];
else st[i]+=a[i];
}
for(int i=1;i<=n;i++){
mx[0][i][i-1]=mx[1][i][i-1]=1e18;
nx[0][i][i-1]=nx[1][i][i-1]=0;
for(int j=i;j<=n;j++){
mx[0][i][j]=mx[0][i][j-1];
mx[1][i][j]=mx[1][i][j-1];
mx[j%2][i][j]=min(mx[j%2][i][j],1LL*b[j]);
nx[0][i][j]=nx[0][i][j-1];
nx[1][i][j]=nx[1][i][j-1];
nx[j%2][i][j]=(nx[j%2][i][j]+pc[j])%mod;
}
}
for(int i=1;i<=n;i++){
d=a[i];
for(int j=i;j;j--){
d=a[j-1]-d;
if(d<=0||j==1){
mr[i]=j;
if(j!=1&&d==0) mr[i]--;
break;
}
}
d=a[i];
for(int j=i;j<=n;j++){
d=a[j+1]-d;
if(d<=0||j==n){
ml[i]=j;
break;
}
}
}
f[0]=0;g[0]=1;
for(int i=0;i<=n;i++){
for(int j=i+1;j<=n;j++){
l=max(i+1,mr[j]);
r=min(j,ml[i+1]);
if(l>r) continue;
val=g[i]*tot[j]%mod*ptot[i]%mod;
if(st[j]-st[i]==0){
f[j]=max(f[j],f[i]+s[j]-s[i]);
g[j]=(g[j]+val)%mod;
}
if(st[j]-st[i]>0){
f[j]=max(f[j],f[i]+s[j]-s[i]-mx[0][l][r]);
g[j]=(g[j]+val*nx[0][l][r]%mod)%mod;
}
if(st[j]-st[i]<0){
f[j]=max(f[j],f[i]+s[j]-s[i]-mx[1][l][r]);
g[j]=(g[j]+val*nx[1][l][r]%mod)%mod;
}
}
}
cout<<f[n]<<' '<<g[n]<<'\n';
}
return 0;
}