제출 #1323675

#제출 시각아이디문제언어결과실행 시간메모리
1323675nanaseyuzuki수도 (JOI20_capital_city)C++20
100 / 100
625 ms38812 KiB
#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pii pair<int, int> #define all(a) a.begin(), a.end() using namespace std; #ifdef LOCAL #include "C:\Users\Dell\Downloads\template\template\icpc-notebook\Utilities\debug.h" #else #define debug(...) 42 #endif const int mn = 5e5 + 5, mod = 1e9 + 7, inf = 2e9; int n, k, c[mn], up[mn][20], d[mn], st[mn], ft[mn], euler[mn], timer_dfs = 0, lg2[mn], Megumi[mn]; vector <int> a[mn], col[mn]; namespace sub2000 { int on[2005], vis[2005], par[2005], d[2005]; void dfs(int u, int p){ for(auto v : a[u]){ if(v == p) continue; par[v] = u; d[v] = d[u] + 1; dfs(v, u); } } void sol(){ for(int i = 1; i <= n; i++){ col[c[i]].push_back(i); } int min_val = inf; for(int i = 1; i <= n; i++){ queue <int> q; memset(on, 0, sizeof(on)); memset(vis, 0, sizeof(vis)); memset(par, 0, sizeof(par)); on[c[i]] = 1, vis[i] = 1; for(auto u : col[c[i]]) q.push(u); dfs(i, 0); debug(i, col[c[i]]); int res = 0; while(q.size()){ int u = q.front(); q.pop(); while(d[u] > d[i]){ if(vis[u]) break; vis[u] = 1; u = par[u]; debug(u, i); if(!on[c[u]]){ on[c[u]] = 1; res ++; for(auto v : col[c[u]]) q.push(v); } } } debug(min_val, res); min_val = min(min_val, res); } cout << min_val << '\n'; } } namespace full{ int ans = inf, d[mn], vis[mn], par[mn], on[mn], sz[mn], cc[mn]; void pre_dfs(int u, int p){ sz[u] = 1; for(auto v : a[u]){ if(v == p || on[v]) continue; par[v] = u, d[v] = d[u] + 1; pre_dfs(v, u); sz[u] += sz[v]; } } int find(int u, int p, int ovr_sz){ for(auto v : a[u]){ if(v == p || on[v]) continue; if(sz[v] * 2 > ovr_sz) return find(v, u, ovr_sz); } return u; } vector <int> all; void collect(int u, int p){ all.push_back(u); d[u] = d[p] + 1; par[u] = p; for(auto v : a[u]){ if(v == p || on[v]) continue; collect(v, u); } } void decompose(int cen){ pre_dfs(cen, 0); cen = find(cen, 0, sz[cen]); on[cen] = 1, par[cen] = 0, d[cen] = 0; collect(cen, 0); for(auto v : all){ col[c[v]].push_back(v); } queue <int> q; cc[c[cen]] = 1, vis[cen] = 1; for(auto u : col[c[cen]]) q.push(u); // cerr << "Centroid " << cen << '\n'; debug(col[c[cen]]); debug(all); int res = 0; while(q.size()){ int u = q.front(); q.pop(); debug(u, cen); if((int) col[c[u]].size() < Megumi[c[u]]){ res = inf; break; } while(d[u] > d[cen]){ if(vis[u]) break; vis[u] = 1, u = par[u]; if(!cc[c[u]]){ cc[c[u]] = 1; res ++; for(auto v : col[c[u]]) q.push(v); } } } ans = min(ans, res); debug(cen, ans); for(auto v : all){ col[c[v]].clear(); cc[c[v]] = vis[v] = 0; } all.clear(); for(auto v : a[cen]){ if(on[v]) continue; decompose(v); } } void sol(){ decompose(1); cout << ans << '\n'; } } void solve() { cin >> n >> k; for(int i = 1; i < n; i++) { int u, v; cin >> u >> v; a[u].push_back(v); a[v].push_back(u); } for(int i = 1; i <= n; i++){ cin >> c[i]; Megumi[c[i]] ++; } full::sol(); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); #define task "Kawabata" if (fopen(task".INP", "r")) { freopen(task".INP", "r", stdin); freopen(task".OUT", "w", stdout); } int t = 1; // cin >> t; while (t--) solve(); return 0; } // Don't wanna lose anymore T_T // Never let me go - Kazuo Ishiguro

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

capital_city.cpp: In function 'int main()':
capital_city.cpp:179:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  179 |         freopen(task".INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
capital_city.cpp:180:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  180 |         freopen(task".OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...