Military Problem CodeForces 1006E (dfs序)
J - Military Problem
就是一道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; }