这是本蒟蒻的RE代码,请各位大佬帮我康康:
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int MOD=998244353,N=5e5+5,STEPS=200;
int n,m,a[N],t0=-1;
long long k;
vector<int>initial,adj[N],in_degree(N);
vector<long long>f(N),s(N),res(N),c(n),d(n);
int main(){
scanf("%d%lld%d",&n,&k,&m);
initial.resize(m);
for(int i=0;i<m;i++){
scanf("%d",&initial[i]);
initial[i]--;
}for(int i=0;i<n;i++){
scanf("%d",&a[i]);
adj[i].resize(a[i]);
for(int j=0;j<a[i];j++){
scanf("%d",&adj[i]);
adj[i][j]--;
}
}for(int i=0;i<n;i++)
for(int j:adj[i])
in_degree[j]++;
for(int v:initial)f[v]=1;
bool all_positive;
for(int t=1;t<=min((long long)STEPS,k);t++){
vector<long long>new_f(n);
all_positive=1;
for(int v:initial)new_f[v]+=1;
for(int i=0;i<n;i++)
if(f[i]>0&&t<k)
for(int j:adj[i])
new_f[j]++;
for(int i=0;i<n;i++)
if(f[i]>0)res[i]=(res[i]+a[i]+f[i])%MOD;
f=new_f;
bool flag=1;
for(int i=0;i<n;i++){
if(f[i]==0){
flag=0;
break;
}
}if(flag){
t0=t;
break;
}
}if(t0!=-1&&t0<k){
fill(s.begin(),s.end(),0);
f.assign(n,0);
for(int v:initial)
f[v]=1;
for(int t=1;t<=t0;t++){
vector<long long>new_f(n);
for(int v:initial)
new_f[v]++;
for(int i=0;i<n;i++)
if(f[i]>0&&t<k)
for(int j:adj[i])
new_f[j]++;
for(int i=0;i<n;i++)
if(f[i]>0)s[i]++;
f=new_f;
}for (int i=0;i<n;i++){
d[i]=in_degree[i];
c[i]=(initial.end()!=find(initial.begin(),initial.end(),i))?1:0;
for(int j=0;j<n;j++)
for(int x:adj[j])
if(x==i)c[i]+=s[j];
}long long K=k-t0;
for(int i=0;i<n;i++){
long long term=0;
term=(a[i]+c[i])%MOD;
term=term*(K%MOD)%MOD;
long long temp=(K%MOD)*((K-1)%MOD)%MOD;
temp=temp*((MOD+1)/2)%MOD;
temp=temp*(d[i]%MOD)%MOD;
term=(term+temp)%MOD;
res[i]=(res[i]+term)%MOD;
}
}for(int i=0;i<n;i++)
printf("%lld ",res[i]);
return 0;
}