Book of Evil

Book of Evil

https://ac.nowcoder.com/acm/problem/110130

Book of Evil

题目大意

就是给定一棵 个点的树🌲,有 个关键点
问你有多少个点满足到关键点的最大距离小于等于

分析

到关键点的最大距离无非就是,所以就可以分别跑两次 ,求子树内外的信息即可
然后所有的都可以直接初始化为无穷小,表示子树内/外不存在关键点
遇到关键点把距离设为 即可

Code

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 1e5 + 10;
const int inf = 0x3f3f3f3f;
int dist[maxn][2], dis[maxn], cur;
int Head[maxn], Edge[maxn << 1], Next[maxn << 1];
bool vis[maxn];

inline void AddEdge(int u, int v) 
{
    Next[++cur] = Head[u];
    Head[u] = cur;
    Edge[cur] = v;
}

void dfs(int u, int f)
{
    if (vis[u]) dist[u][0] = dist[u][1] = 0;
    for (int i = Head[u]; i; i = Next[i]) {
        int v = Edge[i];
        if (v == f) continue;
        dfs(v, u);
        if (dist[v][0] + 1 > dist[u][0]) {
            dist[u][1] = dist[u][0];
            dist[u][0] = dist[v][0] + 1;
        } else {
            dist[u][1] = max(dist[v][0] + 1, dist[u][1]);
        }
    }
}

void sfd(int u, int f)
{
    for (int i = Head[u]; i; i = Next[i]) {
        int v = Edge[i];
        if (v == f) continue;
        if (dist[u][0] == dist[v][0] + 1) {
            dis[v] = max(dis[u] + 1, dist[u][1] + 1);
        } else {
            dis[v] = max(dis[u] + 1, dist[u][0] + 1);
        }
        sfd(v, u);
    }
}

inline int __read()
{
    int x(0), t(1);
    char o (getchar());
    while (o < '0' || o > '9') {
        if (o == '-') t = -1;
        o = getchar();
    }
    for (; o >= '0' && o <= '9'; o = getchar()) {
        x = (x << 1) + (x << 3) + (o ^ 48);
    }
    return x * t;
}

int main()
{
    memset (dis, 128, sizeof dis);
    memset (dist, 128, sizeof dist);
    int n = __read(), m = __read(), d = __read();
    while (m--) {
        int temp = __read();
        vis[temp] = 1;
    }

    for (int i = 1; i < n; ++i) {
        int u = __read(), v = __read();
        AddEdge(u, v), AddEdge(v, u);
    }

    dfs(1, 0), sfd(1, 0);

    int ans(dist[1][0] <= d);

    for (int i = 2; i <= n; ++i)
        if (dist[i][0] <= d && dis[i] <= d) ++ans;

    printf("%d\n", ans);
}
有的没的 文章被收录于专栏

RT,有的没的

全部评论

相关推荐

10-21 23:48
蚌埠坦克学院
csgq:可能没hc了 昨天一面完秒挂
点赞 评论 收藏
分享
投递华为等公司10个岗位
点赞 评论 收藏
分享
最近又搬回宿舍了,在工位坐不住,写一写秋招起伏不断的心态变化,也算对自己心态的一些思考表演式学习从开始为实习准备的时候就特别焦虑,楼主一开始选择的是cpp后端,但是24届这个方向已经炸了,同时自己又因为本科非92且非科班,所以感到机会更加迷茫。在某天晚上用java写出hello&nbsp;world并失眠一整晚后选择老本行干嵌入式。理想是美好的,现实情况是每天忙但又没有实质性进展,总是在配环境,调工具,顺带还要推科研。而这时候才发现自己一直在表演式学习,徘徊在设想如何展开工作的循环里,导致没有实质性进展。现在看来当时如果把精力专注在动手写而不是两只手端着看教程,基本功或许不会那么差。实习的焦虑5月,楼主...
耶比:哲学上有一个问题,玛丽的房间:玛丽知道眼睛识别色彩的原理知道各种颜色,但是她生活在黑白的房间里,直到有一天玛丽的房门打开了她亲眼看到了颜色,才知道什么是色彩。我现在最大可能的减少对非工作事情的思考,如果有一件事困扰了我, 能解决的我就直接做(去哪里或者和谁吵架等等……),解决不了的我就不想了,每一天都是最年轻的一天,珍惜今天吧
投递比亚迪等公司10个岗位 > 秋招被确诊为…… 牛客创作赏金赛
点赞 评论 收藏
分享
评论
8
2
分享
牛客网
牛客企业服务