i64 sum = 0; vector<i64> a(n + 1); for (i64 i = 1; i <= n; i++) { a[i] = i; } for (i64 i = 1; i <= n; i++) { sum += a[i]; i64 g = sqrt(sum); if (g * g == sum) { if (i + 1 > n) { cout << "-1" << '\n'; return; } sum -= a[i]; swap(a[i], a[i + 1]); sum += a[i]; } }
for (i64 i = 1; i <= n; i++) { cout << a[i] << " \n"[i == n]; } } intmain(){ ios::sync_with_stdio(false); cin.tie(nullptr);
i64 t; cin >> t;
while(t--) { solve(); }
return0; }
C. Trapmigiano Reggiano
以en为根, 对树进行分层,每次取深度较大的节点,之后取深度较小的节点,走最深的情况是一条链,这时候会走 n / 2个点,之后n / 2个操作又会回到根,其他情况会在某条最长链的某个节点来后跳(因为有别的树链),如果最后回到原点直接输出,否则-1
using i64 = longlong; constint inf = 1e9 + 7; voidsolve(){ int n, st, en; cin >> n >> st >> en;
vector<vector<int>> e(n + 1); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; e[u].push_back(v); e[v].push_back(u); } vector<int> dis(n + 1, -1); dis[en] = 0;
auto dfs = [&](auto self, int u, int fa) -> void { for (int v : e[u]) { if (v != fa) { dis[v] = dis[u] + 1; self(self, v, u); } } }; dfs(dfs, en, -1); vector<int> ans(n + 1); for (int i = 1; i <= n; i++) { ans[i] = i; }
sort(ans.begin() + 1, ans.end(), [&](int a, int b) { return dis[a] > dis[b]; }); //cerr << "dis:" << dis[st] << '\n'; if (dis[st] == -1) { cout << "-1\n"; } else { for (int i = 1; i <= n; i++) { cout << ans[i] << " \n"[i == n]; } } }