求调基础赛D
  • 板块学术版
  • 楼主Night_sea_64
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/21 19:12
  • 上次更新2024/12/21 21:51:51
查看原帖
求调基础赛D
554145
Night_sea_64楼主2024/12/21 19:12

15pts

思路:先bfs求出每个原子什么时候第一次被击中,然后对于每个原子,枚举 bb 的值求出达到每个 bb 值对应的时间,然后计算。

场上做不对红温了直接摆烂

#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;
}
2024/12/21 19:12
加载中...