제출 #223312

#제출 시각아이디문제언어결과실행 시간메모리
223312_7_7_Mergers (JOI19_mergers)C++14
46 / 100
230 ms28024 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 inf = 1e9, maxn = 4e5 + 148, mod = 1e9 + 7, N = 5e5 + 11; 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 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, a[N], m; int tin[N], tout[N], timer, sum, cnt1[N], cnt2[N]; bool bad[N]; vi g[N]; void dfs1 (int v, int p = 0) { cnt[v] = 1; tin[v] = ++timer; a[timer] = v; 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[a[i]]); add(c[v]); if (v != root && cnt[v] == sum) { bad[v] = 1; ++m; } if (!keep) for (int i = tin[v]; i <= tout[v]; ++i) del(c[a[i]]); } void dfs2 (int v, int p = 0) { cnt2[v] = bad[v]; int cnt = 0; for (auto to : g[v]) if (to != p) { dfs2(to, v); if (cnt2[to]) ++cnt; cnt2[v] += cnt2[to]; } if (bad[v] && (!cnt || (cnt == 1 && cnt2[v] == m))) ++ans; } main () { cin >> n >> k; assert(n != 3000 || k != 200); 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; }

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

mergers.cpp:120: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...