Military Problem CodeForces 1006E (dfs序)

 

J - Military Problem

 CodeForces - 1006E 

就是一道dfs序的问题

给定一个树, 然后有q次询问。 每次给出u,k, 求以u为根的子树经过深搜的第k个儿子,如果一个节点有多个儿子,按照儿子从小到大的顺序,依次访问,不存在则输出-1。

预处理记录一下每个节点的出入时间 最后每次query直接判断就好了

#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

const int maxn = 1e6 + 10;
vector<int> G[maxn];
int ans;
int n, q;
int id[maxn], idx[maxn], en[maxn];

void dfs(int u) {
    id[ans] = u;
    idx[u] = ans;
    for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i];
        ans++;
        dfs(v);
    }
    en[u] = ans;
}

int main() {
    scanf("%d%d", &n, &q);
    ans = 1;
    for (int i = 2, temp; i <= n; i++) {
        scanf("%d", &temp);
        G[temp].push_back(i);
    }
    dfs(1);
    for (int i = 0, u, k; i < q; i++) {
        scanf("%d%d", &u, &k);
        int temp = idx[u];
        if (id[temp + k -1] == 0 || idx[id[temp + k - 1]] > en[u]) puts("-1");
        else printf("%d\n", id[temp + k - 1]);
    }
    return 0;
}
View Code

 

posted @ 2019-03-12 08:26  Mrzdtz220  阅读(164)  评论(0编辑  收藏  举报