Submission #118848

#TimeUsernameProblemLanguageResultExecution timeMemory
118848tmwilliamlin168Mergers (JOI19_mergers)C++14
100 / 100
1211 ms104676 KiB
#include <bits/stdc++.h> using namespace std; const int mxN=5e5; int n, k, tin[mxN], low[mxN], dt, ci, d[mxN], ans, who[mxN], st[2*mxN], sth; vector<array<int, 2>> adj[mxN]; vector<int> bs[mxN]; void dfs1(int u=0, int p=-1) { tin[u]=dt++; for(array<int, 2> v : adj[u]) if(v[1]^p) dfs1(v[0], v[1]); } void dfs2(int u=0, int p=-1) { tin[u]=low[u]=dt++; st[sth++]=u; for(array<int, 2> v : adj[u]) { if(v[1]==p) continue; if(!tin[v[0]]) { dfs2(v[0], v[1]); low[u]=min(low[v[0]], low[u]); } else low[u]=min(tin[v[0]], low[u]); } if(low[u]==tin[u]) { do who[st[sth-1]]=ci; while(st[--sth]^u); ++ci; } } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> k; for(int i=1, u, v; i<n; ++i) { cin >> u >> v, --u, --v; adj[u].push_back({v, i}); adj[v].push_back({u, i}); } for(int i=0, si; i<n; ++i) cin >> si, bs[si-1].push_back(i); dfs1(); for(int i=0; i<k; ++i) { sort(bs[i].begin(), bs[i].end(), [](int i, int j) { return tin[i]<tin[j]; }); for(int j=0; j+1<bs[i].size(); ++j) { adj[bs[i][j]].push_back({bs[i][j+1], dt}); adj[bs[i][j+1]].push_back({bs[i][j], dt++}); } } memset(tin, 0, 4*n); dfs2(); for(int i=0; i<n; ++i) for(array<int, 2> j : adj[i]) if(who[i]^who[j[0]]) ++d[who[i]]; for(int i=0; i<ci; ++i) ans+=d[i]==1; cout << (ans+1)/2; }

Compilation message (stderr)

mergers.cpp: In function 'int main()':
mergers.cpp:53:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0; j+1<bs[i].size(); ++j) {
                ~~~^~~~~~~~~~~~~
#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...