题意: 有一棵树,找到从一个结点开始DFS到第K个的节点编号是多少,其中N,Q<=2*10^5,(N-节点数,Q-询问数)
思路1:直接DFS查到每一个节点到以及其子结点的总结点数。然后搜索的时候按节点总数可以加快搜索的速度,但是这样的思路如果是线性的直接就TLE,抱着侥幸的想法结果到第三个测试例子的时候果然就TLE
思路2: DFS得到每结点的cnt数,每个cnt数的节点号,每个节点以及下面的总节点数。结果就是得到
当前结点+当前结点的子cnt ==> 总的cnt ==> 哪个结点号(结果)
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
const int N = 200001;
struct node
{
int cnt;
int sonIndex;
node(int _cnt, int _sonIndex) :cnt(_cnt), sonIndex(_sonIndex)
{
}
};
vector<int> tree[N];
int sonSum[N];
int cntIndex[N];
int indexCnt[N];
int temp = 1;
int dfs(int cur)
{
int sum = 1;
cntIndex[temp] = cur;
indexCnt[cur] = temp++;
for (auto son:tree[cur])
{
sum+=dfs(son);
}
sonSum[cur] = sum;
return sum;
}
int find_node(int cur, int cnt)
{
if (sonSum[cur] < cnt) return -1;
return cntIndex[cnt + indexCnt[cur] - 1];
}
int main()
{
int n;
int q;
cin >> n>>q;
for (int i = 2; i <= n; i++)
{
int parent;
scanf("%d", &parent);
tree[parent].push_back(i);
}
dfs(1);
while (q--)
{
int cur, cnt;
scanf("%d%d", &cur, &cnt);
//cout<<find_node(cur, cnt) << endl;
printf("%d\n", find_node(cur, cnt));
}
}