CF1340D Nastya and Time Machine

Posted handlip

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1340D Nastya and Time Machine相关的知识,希望对你有一定的参考价值。

题目

给你一棵大小为 (n) 的树,你可以从树上的一个点走到相邻的点,该过程需要一个时间单位。当你走到树上某一点时,你可以将当前时间改为一个更早的时间。你初始在 1 号点,初始时间为 0,你需要遍历整棵树上的所有点,使得遍历过程中时间的最大值最小。给出一种遍历方案。

数据范围

(n le 10^5)

限制

时间:2s

空间:256M

代码

# include <bits/stdc++.h>

using namespace std;
using pii = pair<int, int>;
const int MAX1 = 1e5 + 5;
const int MAX2 = 2e5 + 5;

struct Tree
{
    int n, m, mxdeg;
    int to[MAX2], next[MAX2];
    int head[MAX1], deg[MAX1];
    vector<pii> v;

    void add(int u, int v)
    {
        to[++m] = v;
        next[m] = head[u];
        head[u] = m;
        ++deg[u];
        mxdeg = max(mxdeg, deg[u]);
    }

    void dfs(int cur, int fa, int time)
    {
        v.push_back({cur, time});
        int mtime = time;
        for (int i = head[cur]; i; i = next[i])
        {
            if (to[i] != fa)
            {
                if (time == mxdeg)
                {
                    time = mxdeg - deg[cur];
                    v.push_back({cur, time});
                }
                dfs(to[i], cur, ++time);
                v.push_back({cur, time});
            }
        }
        if (mtime != 0 && time != mtime - 1)
        {
            v.push_back({cur, mtime - 1});
        }
    }
} tr;

int n;

int main()
{
    scanf("%d", &n);
    tr.n = n;
    int u, v;
    for (int i = 1; i < n; ++i)
    {
        scanf("%d %d", &u, &v);
        tr.add(u, v);
        tr.add(v, u);
    }
    
    tr.dfs(1, 0, 0);

    printf("%d
", tr.v.size());
    for (pii p : tr.v)
    {
        printf("%d %d
", p.first, p.second);
    }

    return 0;
}

以上是关于CF1340D Nastya and Time Machine的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces 1340D Nastya and Time Machine

CF1340C Nastya and Unexpected Guest

CF1340C Nastya and Unexpected Guest

CF1340F Nastya and CBS

CF1340B Nastya and Scoreboard

CF1340B Nastya and Scoreboard