关于正确性
查看原帖
关于正确性
892084
xinxin2022楼主2025/7/21 17:02

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;
}
2025/7/21 17:02
加载中...