15pts
思路:先bfs求出每个原子什么时候第一次被击中,然后对于每个原子,枚举 b 的值求出达到每个 b 值对应的时间,然后计算。
场上做不对红温了直接摆烂
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#define int long long
using namespace std;
const int mod=998244353;
int n,m,s[500010],a[500010],d[500010];
int k;
vector<int>v[500010],v2[500010];
bool flag[500010];
int cur;
void bfs()
{
queue<int>q;
flag[0]=1;
q.push(0);
while(!q.empty())
{
int x=q.front();
q.pop();
for(auto y:v[x])
if(!flag[y])
{
flag[y]=1,d[y]=d[x]+1;
q.push(y);
}
}
}
signed main()
{
scanf("%lld%lld%lld",&n,&k,&m);
for(int i=1;i<=m;i++)
{
scanf("%lld",&s[i]);
v[0].push_back(s[i]);
v2[s[i]].push_back(0);
}
for(int i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
for(int j=1;j<=a[i];j++)
{
int x;
scanf("%lld",&x);
v[i].push_back(x);
v2[x].push_back(i);
}
}
for(int i=0;i<=n;i++)
{
sort(v[i].begin(),v[i].end());
for(int j=0;j<v[i].size();j++)
if(v[i][j]==v[i][j+1])while(1);
}
bfs();
for(int i=1;i<=n;i++)
{
cur=0;
int sum=max(0ll,k-d[i]+1)%mod*a[i]%mod;
for(auto j:v2[i])
if(d[j]<k)sum=(sum+k-d[j])%mod;
printf("%lld ",sum);
}
return 0;
}