加维降复杂度
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<map> #include<set> #include<queue> #include<stack> #include<iostream> using namespace std; typedef long long LL; const double pi=acos(-1.0),eps=1e-8; void File() { freopen("D:\\in.txt","r",stdin); freopen("D:\\out.txt","w",stdout); } inline int read() { char c = getchar(); while(!isdigit(c)) c = getchar(); int x = 0; while(isdigit(c)) { x = x * 10 + c - ‘0‘; c = getchar(); } return x; } const int maxn=50+10; int mod=998244353; int T,n,m,k,q,g[maxn][maxn],w[maxn],f[maxn][maxn][maxn][4]; bool check(int a,int b,int c) { if(abs(w[a]-w[b])>k) return 0; if(abs(w[a]-w[c])>k) return 0; if(abs(w[b]-w[c])>k) return 0; return 1; } int main() { scanf("%d",&T); while(T--) { scanf("%d%d%d%d",&n,&m,&k,&q); memset(g,0,sizeof g); for(int i=1;i<=n;i++) scanf("%d",&w[i]); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); g[u][v]=1; } memset(f,0,sizeof f); for(int i=n;i>=1;i--) { for(int j=n;j>=1;j--) { for(int k=n;k>=1;k--) { if(check(i,j,k)==0) f[i][j][k][0]=0; else f[i][j][k][0]=(f[i][j][k][0]+1)%mod; for(int s=1;s<k;s++) if(g[s][k]) f[i][j][s][2]=(f[i][j][s][2]+f[i][j][k][0])%mod; for(int s=1;s<=j;s++) if(g[s][j]) f[i][s][k][1]=(f[i][s][k][1]+f[i][j][k][2])%mod; for(int s=1;s<=i;s++) if(g[s][i]) f[s][j][k][0]=(f[s][j][k][0]+f[i][j][k][1])%mod; } } } for(int i=1;i<=q;i++) { int a,b,c; scanf("%d%d%d",&a,&b,&c); printf("%d\n",f[a][b][c][0]); } } return 0; }
时间: 2024-11-09 09:49:22