Submission #986001

#TimeUsernameProblemLanguageResultExecution timeMemory
986001andrei_boacaMergers (JOI19_mergers)C++17
100 / 100
1694 ms210528 KiB
#include <bits/stdc++.h> using namespace std; typedef pair<int,int> pii; int n,K,par[500005]; int nr[500005],dp[21][500005],niv[500005],in[500005],out[500005],timp; vector<int> muchii[500005]; vector<int> culs[500005]; int grad[500005]; map<pii,int> ban; bool isancestor(int a,int b) { return in[a]<=in[b]&&out[a]>=out[b]; } int LCA(int a,int b) { if(niv[a]>niv[b]) swap(a,b); if(isancestor(a,b)) return a; for(int i=20;i>=0;i--) if(dp[i][a]!=0&&!isancestor(dp[i][a],b)) a=dp[i][a]; return par[a]; } void initdfs(int nod) { timp++; in[nod]=timp; dp[0][nod]=par[nod]; for(int i=1;i<=20;i++) dp[i][nod]=dp[i-1][dp[i-1][nod]]; for(int i:muchii[nod]) if(i!=par[nod]) { par[i]=nod; niv[i]=niv[nod]+1; initdfs(i); } out[nod]=timp; } void calc(int nod) { for(int i:muchii[nod]) if(i!=par[nod]) { calc(i); nr[nod]+=nr[i]; } if(nr[nod]==0&&nod!=1) { ban[{nod,par[nod]}]=1; ban[{par[nod],nod}]=1; } } int comp[500005],nrcomp; void dfs(int nod) { comp[nod]=nrcomp; for(int i:muchii[nod]) if(!comp[i]) if(ban.count({nod,i})==0) dfs(i); } int main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n>>K; for(int i=1;i<n;i++) { int a,b; cin>>a>>b; muchii[a].push_back(b); muchii[b].push_back(a); } for(int i=1;i<=n;i++) { int x; cin>>x; culs[x].push_back(i); } initdfs(1); for(int i=1;i<=K;i++) { for(int j=1;j<culs[i].size();j++) { int a=culs[i][0]; int b=culs[i][j]; int lca=LCA(a,b); nr[a]++; nr[b]++; nr[lca]-=2; } } calc(1); if(ban.empty()) { cout<<0; return 0; } for(int i=1;i<=n;i++) if(!comp[i]) { nrcomp++; dfs(i); } for(auto z:ban) { pii p=z.first; if(p.first>p.second) continue; int a=comp[p.first]; int b=comp[p.second]; grad[a]++; grad[b]++; } int ans=0; for(int i=1;i<=nrcomp;i++) if(grad[i]==1) ans++; cout<<ans/2+ans%2; return 0; }

Compilation message (stderr)

mergers.cpp: In function 'int main()':
mergers.cpp:86:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |         for(int j=1;j<culs[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...