Submission #1004081

#TimeUsernameProblemLanguageResultExecution timeMemory
1004081overwatch9Traffic (IOI10_traffic)C++17
100 / 100
722 ms171092 KiB
#include "traffic.h"
#include <bits/stdc++.h>
using namespace std;
vector <vector <int>> adj;
vector <int> st_sz;
vector <int> depth;
int ans = 0;
void dfs(int s, int p, int d) {
	depth[s] = d;
   	for (auto i : adj[s]) {
		if (i == p)
			continue;
		dfs(i, s, d+1);
		st_sz[s] += st_sz[i];
		if (s == 1)
			ans = max(ans, st_sz[i]);
	}
}
int LocateCentre(int N, int pp[], int S[], int D[]) {
   adj.resize(N+1);
   depth = st_sz = vector <int> (N+1);
   for (int i = 0; i < N-1; i++) {
      S[i]++;
      D[i]++;
      adj[S[i]].push_back(D[i]);
      adj[D[i]].push_back(S[i]);
   }
	for (int i = 1; i <= N; i++)
		st_sz[i] = pp[i-1];
	dfs(1, 1, 0);
	int node = 1;
	for (int i = 2; i <= N; i++) {
		int tp = 0;
		for (auto j : adj[i]) {
			if (depth[j] > depth[i])
				tp = max(tp, st_sz[j]);
			else
				tp = max(tp, st_sz[1] - st_sz[i]);
		}
		if (ans > tp) {
			ans = tp;
			node = i;
		}
	}
	return node-1;
}
// int main() {
// 	int n;
// 	int pp[n], s[n], d[n];
// 	cin >> n;
// 	for (int i = 0; i < n; i++)
// 		cin >> pp[i];
// 	for (int i = 0; i < n-1; i++)
// 		cin >> s[i] >> d[i];
// 	cout << LocateCentre(n, pp, s, d) << '\n';
// }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...