Submission #932305

#TimeUsernameProblemLanguageResultExecution timeMemory
932305amirhoseinfar1385Village (BOI20_village)C++17
100 / 100
76 ms27288 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100'000; int n; int resMin[N + 10], ansMin; int resMax[N + 10], root, cnt, sz[N + 10]; vector<int> base[N + 10], vec[N + 10], res[N + 10]; vector<int> adj[N + 10]; ll ansMax; void readInput() { cin >> n; for (int i = 1; i < n; i++) { int u, v; cin >> u >> v; adj[u].push_back(v); adj[v].push_back(u); } } void calcSz(int u = 1, int par = 0) { sz[u] = 1; for (auto v: adj[u]) if (v != par) { calcSz(v, u); sz[u] += sz[v]; } ansMax += (ll) min(sz[u], n - sz[u]) * 2ll; } int getCentroid() { int res = 1; while (true) { int ok = res; for (auto v: adj[res]) if (sz[v] < sz[res] && sz[v] > n / 2) ok = v; if (ok == res) return res; res = ok; } } void addBase(int u, int par) { base[cnt].push_back(u); for (auto v: adj[u]) if (v != par) addBase(v, u); } void calcBase(int root) { base[++cnt].push_back(root); vec[cnt] = base[cnt]; for (auto u: adj[root]) { cnt++; addBase(u, root); vec[cnt] = base[cnt]; } } void calcResVectors() { set<pair<int, int>> st; for (int i = 1; i <= cnt; i++) st.insert({base[i].size(), i}); while (st.size() >= 2) { int idx1 = st.rbegin() -> second; st.erase(*st.rbegin()); int idx2 = st.rbegin() -> second; st.erase(*st.rbegin()); int ver1 = vec[idx1].back(), ver2 = vec[idx2].back(); res[idx1].push_back(ver2); res[idx2].push_back(ver1); vec[idx1].pop_back(); vec[idx2].pop_back(); if (vec[idx1].size()) st.insert({vec[idx1].size(), idx1}); if (vec[idx2].size()) st.insert({vec[idx2].size(), idx2}); } if (st.size()) { res[1].push_back(base[1][0]); swap(res[2].back(), res[1].back()); } } void calcResMax() { for (int i = 1; i <= cnt; i++) for (int j = 0; j < base[i].size(); j++) resMax[base[i][j]] = res[i][j]; } void solveMax() { calcSz(); root = getCentroid(); calcBase(root); calcResVectors(); calcResMax(); } int dfs(int u = 1, int par = 0) { vector<int> vec; for (auto v: adj[u]) if (v != par) { int x = dfs(v, u); if (x) vec.push_back(x); } while (vec.size() > 2) { int ver1 = vec.back(); vec.pop_back(); int ver2 = vec.back(); vec.pop_back(); swap(resMin[ver1], resMin[ver2]); ansMin += 4; } if (vec.size() == 1) { swap(resMin[u], resMin[vec[0]]); ansMin += 2; return 0; } if (vec.size() == 0 && u != 1) return u; if (vec.size()) { int b1 = vec[0], b2 = vec[1]; swap(resMin[u], resMin[b1]); swap(resMin[u], resMin[b2]); ansMin += 4; } else { swap(resMin[1], resMin[adj[u][0]]); ansMin += 2; } return 0; } void solveMin() { for (int i = 1; i <= n; i++) resMin[i] = i; dfs(); } void writeOutput() { cout << ansMin << ' ' << ansMax << '\n'; for (int i = 1; i <= n; i++) cout << resMin[i] << ' '; cout << '\n'; for (int i = 1; i <= n; i++) cout << resMax[i] << ' '; cout.flush(); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); readInput(); if (n == 1) { cout << 0 << ' ' << 0 << '\n'; cout << 1 << '\n' << 1; cout.flush(); return 0; } solveMax(); solveMin(); writeOutput(); return 0; }

Compilation message (stderr)

Village.cpp: In function 'void calcResMax()':
Village.cpp:92:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   92 |         for (int j = 0; j < base[i].size(); j++)
      |                         ~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...