Submission #723092

#TimeUsernameProblemLanguageResultExecution timeMemory
723092gagik_2007Village (BOI20_village)C++17
56 / 100
81 ms22604 KiB
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <cmath>
#include <chrono>
#include <ctime>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <limits>
#include <iomanip>
#include <unordered_set>
#include <unordered_map>
#include <fstream>
#include <functional>
#include <random>
#include <cassert>
using namespace std;

typedef long long ll;
typedef long double ld;

#define ff first
#define ss second

ll ttt;
const ll INF = 1e18;
const ll MOD = 1e9 + 7;
const ll N = 200007;
const ll M = 307;
const ll LG = 31;
ll n, m, k;
vector<int>g[N];
vector<int>res_mn;
ll ans_mn = 0;
bool used[N];
int dist[LG][LG];

void dfs(int v, int par = -1) {
	for (int to : g[v]) {
		if (to != par) {
			dfs(to, v);
		}
	}
	vector<int>leaves;
	for (int to : g[v]) {
		if (to != par) {
			if (!used[to]) {
				leaves.push_back(to);
			}
		}
	}
	if (leaves.size() != 0) {
		ans_mn += leaves.size() * 2;
		res_mn[v] = leaves[0];
		for (int i = 0; i < leaves.size() - 1; i++) {
			res_mn[leaves[i]] = leaves[i + 1];
		}
		res_mn[leaves[leaves.size() - 1]] = v;
		for (int to : leaves) {
			used[to] = true;
		}
		used[v] = true;
	}
}

void calc_dist(int v, int par, int cur, int u) {
	dist[u][v] = cur;
	for (int to : g[v]) {
		if (to != par) {
			calc_dist(to, v, cur + 1, u);
		}
	}
}

int main() {
	//freopen("in.txt", "r", stdin);
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	for (int i = 0; i < n - 1; i++) {
		int x, y;
		cin >> x >> y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	if (n <= 10) {
		vector<int>p;
		for (int v = 1; v <= n; v++) {
			p.push_back(v);
			calc_dist(v, v, 0, v);
		}
		vector<int>mx, mn;
		int mxv = 0, mnv = MOD;
		do {
			int cur_sz = 0;
			bool ok = true;
			for (int v = 1; v <= n; v++) {
				cur_sz += dist[v][p[v - 1]];
				if (p[v - 1] == v) {
					ok = false;
				}
			}
			if (ok) {
				if (cur_sz > mxv) {
					mxv = cur_sz;
					mx = p;
				}
				if (cur_sz < mnv) {
					mnv = cur_sz;
					mn = p;
				}
			}
		} while (next_permutation(p.begin(), p.end()));
		cout << mnv << " " << mxv << endl;
		for (int x : mn) {
			cout << x << " ";
		}
		cout << endl;
		for (int x : mx) {
			cout << x << " ";
		}
		cout << endl;
		return 0;
	}
	int leaf = 0;
	for (int v = 1; v <= n; v++) {
		if (g[v].size() == 1) {
			leaf = v;
			break;
		}
	}
	int root = g[leaf][0];
	res_mn.resize(n + 1, 0);
	dfs(root);
	cout << ans_mn << " ";
	cout << ans_mn << endl;
	for (int v = 1; v <= n; v++) {
		cout << res_mn[v] << " ";
	}
	cout << endl;
	for (int v = 1; v <= n; v++) {
		cout << res_mn[v] << " ";
	}
	cout << endl;
}

/// ---- - --------  ------ -------- -- - - -
/// Just a reminder. Ubuntu password is I O I
/// ---- - --------  ------ -------- -- - - -

Compilation message (stderr)

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