卡常卡不过求助
查看原帖
卡常卡不过求助
212349
ChengJY_楼主2022/8/28 14:38

赛时代码,卡了114514年都过不了70分。

#include<bits/stdc++.h>
#define N 505
#define lowbit(x) x&(-x)
using namespace std;

int read(){
    int x=0,w=1; char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return x*w;
}
void write(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>=10) write(x/10);
	putchar(x%10+'0');
}

const int mod = 998244353;
int n,q;
int l[N],r[N],c[N][2];
int dp[N][N][105],dp1[N][N][105];

int Mod(int x){
	if(x<0) return x+mod;
	if(x>=mod) return x-mod;
	return x;
}
void add(int k,int val,int id){
	c[k][id]=Mod(c[k][id]+val);
}

signed main(){
	n=read();q=read();
	for(int i=1;i<=n;++i) l[i]=read(),r[i]=read();
	for(int i=1;i<=n;++i) dp[i][i][0]=dp1[i][i][0]=1;
	for(int i=1;i<=100;++i){
		for(int u=1;u<=n;++u){
			memset(c,0,sizeof(c));
			for(int v=1;v<=n;++v){
				if(l[v]==0&&r[v]==0) continue;
				//c[l[v]]=Mod(c[l[v]],dp[u][v][i-1]);c[r[v]+1][0]=Mod(c[r[v]+1]-dp[u][v][i-1]);
				add(l[v],dp[u][v][i-1],0); add(r[v]+1,-dp[u][v][i-1],0);
				add(l[v],dp1[u][v][i-1],1); add(r[v]+1,-dp1[u][v][i-1],1);
				/*
				for(int j=l[v];j<=r[v];++j){
					dp[u][j][i]=(dp[u][j][i]+dp[u][v][i-1])%mod;
					if(j!=u) dp1[u][j][i]=(dp1[u][j][i]+dp1[u][v][i-1])%mod;
				}
				*/
			}
			int res1=0,res2=0;
			for(int j=1;j<=n;++j) {
				res1=Mod(res1+c[j][0]); res2=Mod(res2+c[j][1]);
				dp[u][j][i]=res1; if(u!=j)dp1[u][j][i]=res2;
			}
			
		}
	}
	//print();
	while(q--){
		int a=read(),b=read(),c=read(),m=read();
		if(a==c||b==c){puts("0");continue;}
		if(!l[c]){printf("%d\n",Mod(dp[a][b][m]));continue;}
		int ans=Mod(dp[a][b][m]);
		for(int i=1;i<m;++i)
			ans=Mod(ans-1ll*dp[a][c][i]*dp1[c][b][m-i]%mod);
		write(ans);putchar('\n');
	}
	//cout<<dp[1][2][3]<<" "<<dp[2][3][2]<<endl;
	return 0;
}
2022/8/28 14:38
加载中...