제출 #471703

#제출 시각아이디문제언어결과실행 시간메모리
471703shrimbMergers (JOI19_mergers)C++17
0 / 100
225 ms190872 KiB
#include"bits/stdc++.h" #define int long long #define endl '\n' #define USACO(x) ifstream cin ((string)#x + ".in"); ofstream cout((string)#x + ".out") using namespace std; const int maxN = 1000001; int n, k; vector<int> adj[maxN]; int s[maxN]; int tot[maxN]; int subtree[maxN]; map<int,int>* s2b[maxN]; int cnt[maxN]; bool bad[maxN]; void inc (int a, int b, int v) { (*s2b[a])[b] += v; if ((*s2b[a])[b] == tot[b]) cnt[a]++; } int cunt = 0; void dfs (int cur, int par) { subtree[cur] = 1; if (adj[cur].size() == 1 and cur != 1) { inc(cur, s[cur], 1); bad[cur] = (cnt[cur] == (int)((*s2b[cur]).size())); return; } int best = -1; for (int i : adj[cur]) { if (i != par) { dfs(i, cur); subtree[cur] += subtree[i]; if (best == -1 or subtree[i] > subtree[best]) best = i; } } s2b[cur] = s2b[best]; cnt[cur] = cnt[best]; for (int i : adj[cur]) { if (i != par and i != best) { for (auto j : (*s2b[i])) { inc(cur, j.first, j.second); } (*s2b[i]).clear(); } } inc(cur, s[cur], 1); bad[cur] = (cnt[cur] == (int)((*s2b[cur]).size())); } int calc_ans (int cur, int par) { int ret = 0; for (int i : adj[cur]) { if (i != par) { int x = calc_ans(i, cur); if (bad[cur] == 0 or cur == 1) { cunt += min(ret, x); // cerr << cunt << endl; ret = abs(ret - x); } else ret += x; } } if (ret == 0 and cur != 1) ret += bad[cur]; return ret; } signed main() { for (auto& i : s2b) i = new map<int,int>(); ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> k; for (int i = 1 ; i < n ; i++) { int a, b; cin >> a >> b; adj[a].push_back(b); adj[b].push_back(a); } for (int i = 1 ; i <= n ; i++) { cin >> s[i]; tot[s[i]]++; } dfs(1, 0); // for (int i = 1 ; i <= n ; i++) cout << bad[i] << " "; cout << endl; int x = calc_ans(1, 0); cout << cunt + (x ? 1 + ((x-1)/2) : 0); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...