Submission #223183

#TimeUsernameProblemLanguageResultExecution timeMemory
223183_7_7_Mergers (JOI19_mergers)C++14
0 / 100
151 ms10224 KiB
#include <bits/stdc++.h> //#define int long long //#pragma GCC optimize("Ofast") //#pragma comment(linker, "/stack:200000000") //#pragma GCC target("sse,sse2,sse3,ssse3,sse4") #define file(s) freopen(s".in","r",stdin); freopen(s".out","w",stdout); #define forev(i, b, a) for(int i = (b); i >= (a); --i) #define forn(i, a, b) for(int i = (a); i <= (b); ++i) #define all(x) x.begin(), x.end() #define sz(s) (int)s.size() #define pb push_back #define ppb pop_back #define mp make_pair #define s second #define f first using namespace std; typedef pair < long long, long long > pll; typedef pair < int, int > pii; typedef unsigned long long ull; typedef vector < pii > vpii; typedef vector < int > vi; typedef long double ldb; typedef long long ll; typedef double db; const int dx[] = {1, -1, 0, 0}, dy[] = {0, 0, 1, -1}, block = 333; const pii base = mp(1171, 3307), Mod = mp(1e9 + 7, 1e9 + 9); const int inf = 1e9, maxn = 4e5 + 148, mod = 1e9 + 7, N = 1e5 + 11; const db eps = 1e-12, pi = 3.14159265359; const ll INF = 1e18; int n, k, v, u, cnt[N], c[N], tmp, cntC[N], ans, root; int tin[N], tout[N], timer, sum, cnt1[N]; bool bad[N]; vi g[N]; void dfs1 (int v, int p = 0) { cnt[v] = 1; tin[v] = ++timer; for (auto to : g[v]) if (to != p) { dfs1(to, v); cnt[v] += cnt[to]; } tout[v] = timer; } void add (int x) { ++cnt1[x]; if (cnt1[x] == 1) sum += cntC[x]; } void del (int x) { --cnt1[x]; if (!cnt1[x]) sum -= cntC[x]; } void dfs (int v, int p = 0, bool keep = 0) { int u = -1; for (auto to : g[v]) if (to != p && (u == -1 || cnt[to] > cnt[u])) u = to; for (auto to : g[v]) if (to != p && to != u) dfs(to, v, 0); if (u != -1) dfs(u, v, 1); for (auto to : g[v]) if (to != p && to != u) for (int i = tin[to]; i <= tout[to]; ++i) add(c[i]); add(c[v]); if (v != root && cnt[v] == sum) bad[v] = 1; if (!keep) for (int i = tin[v]; i <= tout[v]; ++i) del(c[i]); } bool dfs2 (int v, int p = 0) { bool was = 0; for (auto to : g[v]) if (to != p && dfs2(to, v)) was = 1; if (!was && bad[v]) ++ans; bad[v] |= was; } main () { cin >> n >> k; if (n == 2) { cout << k - 1 << endl; return 0; } for (int i = 1; i < n; ++i) { cin >> v >> u; g[v].pb(u); g[u].pb(v); } for (int i = 1; i <= n; ++i) { cin >> c[i]; ++cntC[c[i]]; } root = 1; while (sz(g[root]) == 1) ++root; dfs1(root); dfs(root); dfs2(root); cout << (ans + 1) / 2 << endl; }

Compilation message (stderr)

mergers.cpp: In function 'bool dfs2(int, int)':
mergers.cpp:105:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
mergers.cpp: At global scope:
mergers.cpp:108:7: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main () {
       ^
#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...