ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

EOJ Monthly 2021.10

2021-10-23 18:00:36  阅读:190  来源: 互联网

标签:2021.10 leq Monthly EOJ 秘密 整数 员工 int 秘密会议


比赛链接

EOJ Monthly 2021.10

B. Secret

众所周知,在苹果发布会前,所有即将被公布的新产品都是绝密。

我们可以认为苹果的所有员工之间的关系构成一张关系图,两个员工的关系密切,则两个员工之间会有一条边相连(给我们认为关系是双向的),员工的索引是从 \(1\) 到 \(n\) 递增的整数,假设每条边的长度都是 \(1\) 。

现在,苹果即将召开新的一次发布会了,在发布会前,高层将会有一次秘密会议,讨论决定发布会的具体内容,显然,秘密会议的内容是绝对的商业机密。

可惜的是,参与会议的人都是些藏不住秘密的人。从会议结束后的第一天开始,所有知道秘密的人都会和距离(在上述关系图中的距离)自己不超过 \(k\) 的所有人共享这个秘密,而第二天,所有知道秘密的人都会和距离自己不超过 \(2k\) 的所有人共享这个秘密。也就是说,在会议结束后的第 \(x\) 天,所有知道秘密的人都开始与距自己最多 \(x\times k\) 的所有人共享该秘密。

现在 Cuber QQ 被委托计算每个人都会在什么时候知道这个秘密。

输入格式

第一行包含四个整数 \(n, m,q\) 和 \(k(1\leq n,q,k \leq 10^5,q \leq n,1 \leq m\ 2\times 10^5)\) ,分别表示员工数量,关系数量,参加秘密会议的人数,以及任务描述中的 \(k\)。

接下来的一行包含 \(q\) 个整数,其中第 \(i\) 个整数表示秘密会议中第 \(i\) 个员工的索引。

接下来的 \(m\) 行,每行包含两个整数 \(a_i\) 和 \(b_i\) \((1\leq a_i.b_i \leq n,a_i \nq b_i)\),表示第 \(i\) 个关系为索引为 \(a_i\) 和 \(b_i\) 的员工。

题目保证给定的图是一张联通图,即任意两个员工之间,一定存在间接的关系相连。

输出格式

输出 \(n\) 个数字,第 \(i\) 个数字代表会议后的哪一天索引为 \(i\) 的员工将知道秘密。如果该员工参加了会议,则输出 \(0\) 。

input

6 8 1 1
6
1 3
1 5
1 6
2 5
2 6
3 4
3 5
5 6

output

1 1 2 2 1 0

解题思路

多源最短路

每条边都为1,可以用bfs求解,将所有源点放入队列里,其余操作跟求深度一样,最后根据这个最短路可推导出天数~

  • 时间复杂度:\(O(n+m)\)

代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,Q,k;
bool v[N];
int d[N];
int day[N];
vector<int> adj[N];
void bfs()
{
    queue<int> q;
    for(int i=1;i<=n;i++)
        if(v[i])q.push(i);
    while(q.size())
    {
        int x=q.front();
        q.pop();
        for(int y:adj[x])
        {
            if(v[y])continue;
            d[y]=d[x]+1;
            v[y]=true;
            q.push(y);
        }
    }
}
int main()
{
    scanf("%d%d%d%d",&n,&m,&Q,&k);
    for(int i=1;i<=Q;i++)
    {
        int x;
        scanf("%d",&x);
        v[x]=true;
    }
    int x,y;
    while(m--)
    {
        scanf("%d%d",&x,&y);
            adj[x].push_back(y),adj[y].push_back(x);
    }
    bfs();
    int cnt;
    for(cnt=1;;cnt++)
    {
        day[cnt]=k*(1+cnt)*cnt/2;
        if(day[cnt]>n)break;
    }
    for(int i=1;i<=n;i++)printf("%d ",lower_bound(day,day+cnt+1,d[i])-day);
    return 0;
}

标签:2021.10,leq,Monthly,EOJ,秘密,整数,员工,int,秘密会议
来源: https://www.cnblogs.com/zyyun/p/15449152.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有