제출 #242097

#제출 시각아이디문제언어결과실행 시간메모리
242097ZwariowanyMarcin수도 (JOI20_capital_city)C++14
100 / 100
963 ms39660 KiB
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define pb push_back
#define mp make_pair
#define ss(x) (int) x.size()
#define fi first
#define se second
#define cat(x) cerr << #x << " = " << x << endl
#define rep(i, j, n) for (int i = j; i <= n; ++i)
#define per(i, j, n) for (int i = n; j <= i; --i)
#define all(x) x.begin(), x.end()
 
using namespace std;

const int N = 2e5 + 101;

int n, k, a, b, res = 1e9;
vector <int> g[N], x;
bool dead[N], vis[N];
int siz[N], color[N], total[N], par[N], last[N], id;
vector <int> q[N];

void licz(int v, int p) {
	siz[v] = 1;
	for (auto it : g[v])
		if (!dead[it] && it != p) {
			licz(it, v);
			siz[v] += siz[it];
		}
}

int daj(int v, int p, int all) {
	for (auto it : g[v])
		if (!dead[it] && it != p && all < 2 * siz[it])
			return daj(it, v, all);
	return v;
}

void dfs(int v, int p) {
	x.pb(v);
	q[color[v]].pb(v);
	par[v] = p;
	for (auto it : g[v])
		if (!dead[it] && it != p)
			dfs(it, v);
}

vector <int> stos;
bool bad;
int now;

void add(int c) {
	if (last[c] == id) return;
	if (total[c] != ss(q[c])) bad = true;
	last[c] = id;
	now++;
	stos.pb(c);
}

void dek(int v) {
	licz(v, 0);
	int cen = daj(v, 0, siz[v]);
	// process cen
	dfs(cen, 0);
	++id;
	bad = false;
	now = 0;
	add(color[cen]);
	while (!stos.empty()) {
		int k = stos.back();
		stos.pop_back();
		for (auto it : q[k]) {
			int s = it;
			while (s != 0 && !vis[s]) {
				vis[s] = true;
				add(color[s]);
				s = par[s];
			}
		}
	}
	if (!bad) res = min(res, now);
	for (auto it : x) {
		q[color[it]].clear();
		vis[it] = false;
	}
	x.clear();
	dead[cen] = true;
	for (auto it : g[cen])
		if (!dead[it])
			dek(it);
	
}

int main() {
	scanf ("%d%d", &n, &k);
	rep(i, 2, n) {
		scanf ("%d%d", &a, &b);
		g[a].pb(b);
		g[b].pb(a);
	}
	rep(i, 1, n) {
		scanf ("%d", color + i);
		total[color[i]]++;
	}
	dek(1);
	printf ("%d\n", res - 1);
	return 0;
}	

컴파일 시 표준 에러 (stderr) 메시지

capital_city.cpp: In function 'int main()':
capital_city.cpp:96:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf ("%d%d", &n, &k);
  ~~~~~~^~~~~~~~~~~~~~~~
capital_city.cpp:98:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf ("%d%d", &a, &b);
   ~~~~~~^~~~~~~~~~~~~~~~
capital_city.cpp:103:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf ("%d", color + i);
   ~~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...