题意:就是一颗树,找出深度最深哪那一层,字典序最小的节点,
题解: 开两个数组,一个标记是否使用,一个记录该节点的深度。
开个vector 记录该根下的所有点(删除该跟的时候,用dfs跑一边全部删完)
开个set 记录每个深度的节点号,输出对应深度的的第一个即为所求。
大神们用dfs序+线段树,,我不会,
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
int dep[maxn],f[maxn];
vector<int>vec[maxn];
set<int>se[maxn];
int T,n,x;
void init(){
for(int i=0;i<=n;i++){
f[i]=dep[i]=0;
vec[i].clear();
se[i].clear();
}
}
void dfs(int x){
se[dep[x]].erase(x);
for(int k=0;k<vec[x].size();k++){
int t=vec[x][k];
if(f[t]) dfs(t);
}
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
init();
int maxx=0,cnt=1,j;
for(int i=0;i<n;i++){
scanf("%d",&x);
if(x>0){
cnt++;
vec[x].push_back(cnt);
dep[cnt]=dep[x]+1;
f[cnt]=1;maxx=max(maxx,dep[cnt]);
se[dep[cnt]].insert(cnt);
}else{
x=-x;
dfs(x);
f[x]=1;
}
for(j=maxx;j>0;j--) if(se[j].size()) break;
maxx=j;
if(!j) printf("1\n");
else printf("%d\n",*se[j].begin());
}
}
return 0;
}