大致题意:给出每个点的父亲节点编号以及dist排序,问是否能够存在dist值使得上述编号及排序成立
解析:1.由于题目里并没保证这样的树一定存在(可能是多根树),此外还有无解情况就是dist的排序情况,如果根节点排序不是最小的就无解,第二种情况是不只有一个根
2. 对于赋值问题,由于dist[
p
i
p_i
pi]
#includeusing namespace std; int main() { ios::sync_with_stdio(false); int t; cin >> t; while(t --) { int n; cin >> n; vector fa(n + 1) , p(n + 1) , dist(n + 1 , -1); for (int i = 1; i <= n; ++ i) cin >> fa[i]; for (int i = 1; i <= n; ++ i) cin >> p[i]; if (fa[p[1]] != p[1]) { cout << -1 << endl; continue; } else { int ok = 0; dist[p[1]] = 0; for (int i = 2; i <= n; ++ i) { if (dist[fa[p[i]]] == -1) { ok = 1; break; } dist[p[i]] = dist[p[i - 1]] + 1; } if (ok) { cout << -1 << endl; continue; } else { for (int i = 1; i <= n; ++ i) cout << dist[i] - dist[fa[i]] << " "; cout << endl; } } } return 0; }



