Codeforces Round #498 (Div. 3) E. Military Problem (DFS)
Posted lr599909928
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #498 (Div. 3) E. Military Problem (DFS)相关的知识,希望对你有一定的参考价值。
-
题意:建一颗以(1)为根结点的树,询问(q)次,每次询问一个结点,问该结点的第(k)个子结点,如果不存在则输出(-1).
-
题解:该题数据范围较大,需要采用dfs预处理的方法,我们从结点(1)开始向下找,(ans)数组记录的是,第(x)次查找时的结点,(path)表示某个结点所需的查找次数,(siz)数组表示某个结点的子结点个数.之后每次询问时,判断一下情况是否成立,如果成立,先找出该结点所对应的查找次数((path[u])),向下找第(k)个子结点即可.
-
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <stack> #include <queue> #include <vector> #include <map> #include <set> #include <unordered_set> #include <unordered_map> #define ll long long #define fi first #define se second #define pb push_back #define me memset const int N = 1e6 + 10; const int mod = 1e9 + 7; const int INF = 0x3f3f3f3f; using namespace std; typedef pair<int,int> PII; typedef pair<ll,ll> PLL; int n,q; int x; int u,k; vector<int> v[N]; int cnt=1; int ans[N]; int path[N]; int siz[N]; void dfs(int node){ ans[cnt]=node; path[node]=cnt++; siz[node]=1; for(auto w:v[node]){ dfs(w); siz[node]+=siz[w]; } } int main() { ios::sync_with_stdio(false);cin.tie(0); cin>>n>>q; for(int i=2;i<=n;++i){ cin>>x; v[x].pb(i); } dfs(1); for(int i=1;i<=q;++i){ cin>>u>>k; if(siz[u]<k) puts("-1"); else printf("%d ",ans[path[u]+k-1]); } return 0; }
以上是关于Codeforces Round #498 (Div. 3) E. Military Problem (DFS)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #498 (Div. 3) 简要题解
Codeforces Round #498 (Div. 3)
Codeforces Round #498 (Div. 3)