90分求助
查看原帖
90分求助
563861
killer42楼主2024/10/31 07:44

在checkpoint8中第三组数据的时候,oj爆了个负数,可是我在本机和其他线上编译器上运行此程序是都是正确的答案。我有尝试过把求模变成if(x>mod) x-=mod这种形式,但是依旧会爆负数。 恳请dalao帮忙提提建议,是哪块出了问题,感激不尽。

#include <bits/stdc++.h>
#define R register
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
const ll mod=998244353,maxn=5005;
int t,n,c,c0,c1,d0,d1,k;
ll ans,dp[2][2][maxn][maxn],dpk[maxn],g[maxn],pre,tot;
struct node{
    int b,s,no;
    friend bool operator < (node &a,node &b){
        if((a.no==-1)^(b.no==-1)) return (a.no==-1)<(b.no==-1);
        return a.b<b.b;
    }
}rec[maxn];
struct city{
    int cnt;
    bool kflag;
}sch[maxn];
int main(){
    // freopen("P5289_8.in","r",stdin);
    // freopen("P5289_ans.out","w",stdout);
    cin>>t;
    while(t--){
        tot=0;
        memset(rec,-1,sizeof(rec));
        memset(sch,0,sizeof(sch));
        cin>>n>>c>>c0>>c1>>d0>>d1;
        for(R int i=1;i<=n;i++) cin>>rec[i].b>>rec[i].s;
        cin>>k;
        for(R int i=1;i<=k;i++){
            int num,index;
            cin>>num>>index;
            rec[num].no=index;
        }
        sort(rec+1,rec+1+n);
        for(R int i=1;i<=n;i++){
            tot+=rec[i].s;
            sch[rec[i].b].cnt+=rec[i].s;
            if(rec[i].no!=-1) sch[rec[i].b].kflag=1;
        }
        dpk[0]=1;
        for(R int i=1;i<=c;i++) if(!sch[i].kflag&&sch[i].cnt) for(R int j=c0;j>=sch[i].cnt;j--) dpk[j]=(dpk[j]+dpk[j-sch[i].cnt])%mod;
        for(R int i=1;i<=c0;i++) dpk[i]=(dpk[i]+dpk[i-1])%mod;
        
        g[0]=1;
        for(R int i=1;i<=n;i++) if(rec[i].no==-1) for(R int j=d0;j>=rec[i].s;j--) g[j]=(g[j]+g[j-rec[i].s])%mod;
        for(R int i=1;i<=d0;i++) g[i]=(g[i]+g[i-1])%mod;
        dp[0][0][0][0]=1;pre=0;
        for(R int i=1;i<=k;i++){
            pre+=rec[i].s;
            for(R int j=0;j<=c0;j++){
                for(R int k=0;k<=pre;k++){
                    if(rec[i].no!=0){
                        if(rec[i].b!=rec[i-1].b){
                            if(j>=sch[rec[i].b].cnt&&k>=rec[i].s){
                                dp[i&1][0][j][k]=(dp[i&1][0][j][k]+dp[!(i&1)][1][j-sch[rec[i].b].cnt][k-rec[i].s])%mod;
                                dp[i&1][0][j][k]=(dp[i&1][0][j][k]+dp[!(i&1)][0][j-sch[rec[i].b].cnt][k-rec[i].s])%mod;
                            }
                        }else{
                            if(k>=rec[i].s) dp[i&1][0][j][k]=(dp[i&1][0][j][k]+dp[!(i&1)][0][j][k-rec[i].s])%mod;
                        }
                    }
                    if(rec[i].no!=1){
                        if(rec[i].b!=rec[i-1].b){
                            if(j>=sch[rec[i].b].cnt){
                                dp[i&1][0][j][k]=(dp[i&1][0][j][k]+dp[!(i&1)][1][j-sch[rec[i].b].cnt][k])%mod;
                                dp[i&1][0][j][k]=(dp[i&1][0][j][k]+dp[!(i&1)][0][j-sch[rec[i].b].cnt][k])%mod;
                            }
                        }else dp[i&1][0][j][k]=(dp[i&1][0][j][k]+dp[!(i&1)][0][j][k])%mod;
                    }
                    if(rec[i].no!=2){
                        if(rec[i].b!=rec[i-1].b){
                            if(k>=rec[i].s){
                                dp[i&1][1][j][k]=(dp[i&1][1][j][k]+dp[!(i&1)][1][j][k-rec[i].s])%mod;
                                dp[i&1][1][j][k]=(dp[i&1][1][j][k]+dp[!(i&1)][0][j][k-rec[i].s])%mod;
                            }
                        }else if(k>=rec[i].s) dp[i&1][1][j][k]=(dp[i&1][1][j][k]+dp[!(i&1)][1][j][k-rec[i].s])%mod;
                    }
                    if(rec[i].no!=3){
                        if(rec[i].b!=rec[i-1].b) dp[i&1][1][j][k]=(dp[i&1][1][j][k]+dp[!(i&1)][0][j][k])%mod;
                        dp[i&1][1][j][k]=(dp[i&1][1][j][k]+dp[!(i&1)][1][j][k])%mod;
                    }
                }
            }
            for(R int j=0;j<=c0;j++){
                for(R int k=0;k<=pre;k++) dp[!(i&1)][0][j][k]=dp[!(i&1)][1][j][k]=0;
            }
        }
        ans=0;
        for(R int i=0;i<=c0;i++){
            for(R int j=0;j<=pre;j++){
                ll tmp=(dp[k&1][0][i][j]+dp[k&1][1][i][j])%mod;
                ll l1=tot-d1-j,r1=d0-j,l2=tot-c1-i,r2=c0-i;
                ll dpk_now=l2>r2?0:l2>0?(dpk[r2]-dpk[l2-1]+mod)%mod:dpk[r2];
                ll g_now=l1>r1?0:l1>0?(g[r1]-g[l1-1]+mod)%mod:g[r1];
                ans=(1ll*ans+tmp*dpk_now%mod*g_now%mod)%mod;
            }
        }
        cout<<ans<<endl;
        for(R int i=0;i<=c0;i++){
            dpk[i]=0;
            for(R int j=0;j<=pre;j++) dp[1][1][i][j]=dp[1][0][i][j]=dp[0][1][i][j]=dp[0][0][i][j]=0;
        }
        for(R int i=0;i<=d0;i++) g[i]=0;
    }
    // fclose(stdin);
    // fclose(stdout);
    return 0;
}
2024/10/31 07:44
加载中...