Submission #406523

#TimeUsernameProblemLanguageResultExecution timeMemory
406523benkTraffic (IOI10_traffic)C++14
50 / 100
569 ms158976 KiB
#include "traffic.h"
#include <bits/stdc++.h>
using namespace std;

#define all(x)      x.begin(), x.end()
#define pb          push_back
#define sz(x)       (int)(x.size())
#define ll          long long
#define fi          first
#define se          second
#define lbd         lower_bound
#define ubd         upper_bound

const int MOD = 1e9 + 7;
const double eps = 1e-10;
const long long INF = 1e18;
const int N = 1e6 + 10;

int tot;
vector<int> adj[N], ch(N), peop(N), curr(N);
vector<bool> vis(N);
void dfs(int x) {
	vis[x] = 1;
	for (auto it : adj[x]) {
		if (vis[it]) continue;
		dfs(it);
		ch[x] += ch[it];
		peop[x] = max(peop[x], ch[x]); // max of all ch
	}
	ch[x] += curr[x];
	peop[x] = max(peop[x], tot - ch[x]); // either from ancestors or ch
}

int LocateCentre(int n, int p[], int s[], int d[]) {
	for (int i = 0; i < n - 1; i++) {
		adj[s[i]].pb(d[i]);
		adj[d[i]].pb(s[i]);
	}

	for (int i = 0; i < n; i++) {
		tot += p[i];
		curr[i] = p[i];
	}
	dfs(0);
	ll ans = INT_MAX, res = -1;
	for (int i = 0; i < n; i++) {
		if (ans > peop[i]) {
			ans = peop[i];
			res = i;
		}
	}
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...