1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include <bits/stdc++.h>
const int kMaxN = 2e5 + 5;
int n, rt1, rt2, cnt; int fa1[kMaxN], fa2[kMaxN], deg1[kMaxN], deg2[kMaxN], cur[kMaxN], res[kMaxN]; bool vis[kMaxN * 2]; std::vector<std::pair<int, int>> G[kMaxN];
void dfs(int u) { for (int i = cur[u]; i < G[u].size(); i = cur[u]) { cur[u] = i + 1; auto [v, id] = G[u][i]; if (vis[id]) continue; vis[id] = 1; dfs(v); if (v && u == v + n) res[v] = 1; else if (u && v == u + n) res[u] = -1; } }
void dickdreamer() { std::cin >> n; for (int i = 1; i <= n; ++i) { std::cin >> fa1[i]; if (~fa1[i]) { deg1[fa1[i]] ^= 1, deg1[i] ^= 1; G[fa1[i]].emplace_back(i, ++cnt), G[i].emplace_back(fa1[i], cnt); } else { rt1 = i; } } for (int i = 1; i <= n; ++i) { std::cin >> fa2[i]; if (~fa2[i]) { deg2[fa2[i]] ^= 1, deg2[i] ^= 1; G[fa2[i] + n].emplace_back(i + n, ++cnt), G[i + n].emplace_back(fa2[i] + n, cnt); } else { rt2 = i; } } deg1[rt1] ^= 1, deg2[rt2] ^= 1; for (int i = 1; i <= n; ++i) { if (deg1[i] != deg2[i]) return void(std::cout << "IMPOSSIBLE\n"); } G[0].emplace_back(rt1, ++cnt), G[rt1].emplace_back(0, cnt); G[0].emplace_back(rt2 + n, ++cnt), G[rt2 + n].emplace_back(0, cnt); for (int i = 1; i <= n; ++i) { if (deg1[i]) { G[i].emplace_back(i + n, ++cnt), G[i + n].emplace_back(i, cnt); } } dfs(0); std::cout << "POSSIBLE\n"; for (int i = 1; i <= n; ++i) std::cout << res[i] << ' '; }
int32_t main() { #ifdef ORZXKR freopen("in.txt", "r", stdin); freopen("out.txt", "w", stdout); #endif std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0); int T = 1; while (T--) dickdreamer(); return 0; }
|