像这种要求节点有序化,把邻接表的vector换成set就好啦。虽然这道题按照默认顺序造邻接表就可以有序了
#include<bits/stdc++.h> using namespace std; int size[200010]; int a[200010]; int vis[200010]; int tot; set<int> G[200010]; void dfs(int node) { set<int>::iterator it; int cnt=1; for(it=G[node].begin();it!=G[node].end();it++) { int to=*it; //printf("%d ",to); a[++tot]=to; vis[to]=tot; dfs(to); cnt+=size[to]; } size[node]=cnt; } int main() { int n,q; scanf("%d%d",&n,&q); for(int i=2;i<=n;i++) { int tmp; scanf("%d",&tmp); G[tmp].insert(i); } a[++tot]=1; vis[1]=tot; dfs(1); for(int i=1;i<=q;i++) { int u,k; scanf("%d%d",&u,&k); if(k>size[u]) printf("-1 "); else printf("%d ",a[vis[u]+k-1]); } }