CF1738D
[[This is a tag]]
建图,然后在图上使用一种遍历策略来输出一种遍历顺序,构造出了答案序列
虽然链表似乎也可以,但是建图简单得多
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,T,a,b[N],ans[N],s,k,cn;
vector<int>g[N];
void dfs(int u){
for(auto v:g[u])if(g[v].empty())ans[++cn]=v;
for(auto v:g[u])if(g[v].size())ans[++cn]=v,dfs(v);
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",b+i);
k=-1;cn=0;
for(int i=1;i<=n;i++)if(b[i]<i){
k=i-1;
break;
}
if(!~k)k=n;
for(int i=1;i<=k;i++){
if(b[i]==n+1)s=0;
else s=b[i];
g[s].push_back(i);
}
for(int i=k+1;i<=n;i++){
s=b[i];
g[s].push_back(i);
}
dfs(0);
printf("%d\n",k);
for(int i=1;i<=n;i++)printf("%d ",ans[i]);printf("\n");
for(int i=0;i<=n;i++)g[i].clear();
}
}

浙公网安备 33010602011771号