Submission #1279641

#TimeUsernameProblemLanguageResultExecution timeMemory
1279641icebear수도 (JOI20_capital_city)C++20
100 / 100
501 ms33352 KiB
// ~~ icebear ~~ #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> ii; typedef pair<int, ii> iii; template<class T> bool minimize(T &a, const T &b) { if (a > b) return a = b, true; return false; } template<class T> bool maximize(T &a, const T &b) { if (a < b) return a = b, true; return false; } #define FOR(i,a,b) for(int i=(a); i<=(b); ++i) #define FORR(i,a,b) for(int i=(a); i>=(b); --i) #define REP(i, n) for(int i=0; i<(n); ++i) #define RED(i, n) for(int i=(n)-1; i>=0; --i) #define MASK(i) (1LL << (i)) #define BIT(S, i) (((S) >> (i)) & 1) #define mp make_pair #define pb push_back #define fi first #define se second #define all(x) x.begin(), x.end() #define task "gen" /*END OF TEMPLATE. ICEBEAR AND THE CAT WILL WIN VOI26 */ const int MOD = 1e9 + 7; const int inf = 1e9 + 27092008; const ll INF = 1e18 + 27092008; const int N = 2e5 + 5; int numNode, numCity; vector<int> G[N], belong[N]; int sz[N], city[N], ans = inf; bool isCentroid[N]; int get_sz(int u, int par) { sz[u] = 1; for(int v : G[u]) if (v != par && !isCentroid[v]) sz[u] += get_sz(v, u); return sz[u]; } int findCentroid(int u, int par, const int &subtree) { for(int v : G[u]) if (v != par && !isCentroid[v] && sz[v] * 2 > subtree) return findCentroid(v, u, subtree); return u; } vector<int> nodes; int cnt[N], par[N]; bool vis[N]; void dfs(int u) { nodes.pb(u); cnt[city[u]]++; vis[u] = false; for(int v : G[u]) if (v != par[u] && !isCentroid[v]) { par[v] = u; dfs(v); } } bool haveAll(int city) { return cnt[city] == (int)belong[city].size(); } void buildCentroid(int u) { int centroid = findCentroid(u, -1, get_sz(u, -1)); isCentroid[centroid] = true; par[centroid] = -1; dfs(centroid); if (haveAll(city[centroid])) { queue<int> q; int unite = 0; for(int v : belong[city[centroid]]) { q.push(v); vis[v] = true; } while(!q.empty()) { int x = q.front(); q.pop(); x = par[x]; if (x <= 0) continue; while(!vis[x]) { if (haveAll(city[x]) == false) { unite = inf; break; } vis[x] = true; for(int v : belong[city[x]]) { vis[v] = true; q.push(v); } x = par[x]; unite++; } if (unite == inf) break; } minimize(ans, unite); } for(int x : nodes) { vis[x] = true; cnt[city[x]]--; } nodes.clear(); for(int v : G[centroid]) if (!isCentroid[v]) buildCentroid(v); } void init(void) { cin >> numNode >> numCity; FOR(i, 2, numNode) { int u, v; cin >> u >> v; G[u].pb(v); G[v].pb(u); } FOR(i, 1, numNode) cin >> city[i], belong[city[i]].push_back(i); } void process(void) { buildCentroid(1); cout << ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen(task".inp", "r")) { freopen(task".inp", "r", stdin); freopen(task".out", "w", stdout); } int tc = 1; // cin >> tc; while(tc--) { init(); process(); } return 0; }

Compilation message (stderr)

capital_city.cpp: In function 'int main()':
capital_city.cpp:139:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  139 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
capital_city.cpp:140:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  140 |         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...