在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;
}