제출 #1183704

#제출 시각아이디문제언어결과실행 시간메모리
1183704qwushaVillage (BOI20_village)C++20
25 / 100
1096 ms13424 KiB
#include <bits/stdc++.h> using namespace std; /* #pragma GCC optimize("O3") #include <bitset> #pragma GCC target("avx2")*/ #define fi first #define se second #define int long long typedef long long ll; typedef long double ld; mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count()); int inf = 1e15; vector<vector<int>> g; vector<int> used; vector<int> gto, cfrom; int res = 0; void dfs(int v, int p = -1) { vector<int> s; for (auto u : g[v]) { if (u == p) continue; dfs(u, v); if (!used[u]) s.push_back(u); } if (s.size() != 0) { res += s.size() * 2; used[v] = 1; gto[v] = s[0]; cfrom[v] = s[s.size() - 1]; gto[s[s.size() - 1]] = v; cfrom[s[0]] = v; for (int i = 0; i < s.size() - 1; i++) { gto[s[i]] = s[i + 1]; cfrom[s[i + 1]] = s[i]; } } else if (s.size() == 0 && p == -1) { res += 2; int u = g[v][0]; gto[v] = u; gto[cfrom[u]] = v; cfrom[v] = cfrom[u]; cfrom[u] = v; } } vector<int> sz; int n; int maxi_res = 0; void dfs_siz(int v, int p = -1) { sz[v] = 1; for (auto u : g[v]) { if (u != p) { dfs_siz(u, v); sz[v] += sz[u]; } } maxi_res += min((n - sz[v]),(sz[v])) * 2; } int find_centr(int v, int p = -1) { for (auto u : g[v]) { if (u != p) { if (sz[u] > n / 2) { return find_centr(u, v); } } } return v; } int blocked; vector<int> s; void dfs_comps(int v, int p = -1) { s.push_back(v); for (auto u : g[v]) { if (u != blocked && u != p) { dfs_comps(u, v); } } } signed main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; used.resize(n); g.resize(n); gto.resize(n); cfrom.resize(n); sz.resize(n); for (int i = 0; i < n - 1; i++) { int v, u; cin >> v >> u; g[v - 1].push_back(u - 1); g[u - 1].push_back(v - 1); } dfs(0); dfs_siz(0); int centr = find_centr(0); vector<vector<int>> cm; blocked = centr; int mini = inf; int indm = -1; for (auto u : g[centr]) { s.clear(); dfs_comps(u); cm.push_back(s); if (s.size() < mini) { mini = s.size(); indm = cm.size() - 1; } } if (cm.size() > 1) { cm[indm].push_back(centr); } else { cm.push_back({centr}); } vector<int> gbig(n); vector<int>us(n); int right = 1; int cr = 0; for (int i = 0; i < cm.size(); i++) { for (auto el : cm[i]) { if (right == i || cr == cm[right].size()) { right++; if (right == cm.size()) right = 0; cr = 0; } while (us[cm[right][cr]]) { cr++; if (cr == cm[right].size()) { cr = 0; right++; if (right == cm.size()) right = 0; } } us[cm[right][cr]] = 1; gbig[el] = cm[right][cr]; cr++; } } cout << res << ' ' << maxi_res << '\n'; for (int i = 0; i < n; i++) { cout << gto[i] + 1 << ' '; } cout << '\n'; for (int i = 0; i < n; i++) { cout << gbig[i] + 1 << ' '; } cout << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...