Submission #1320600

#TimeUsernameProblemLanguageResultExecution timeMemory
1320600wangzhiyi33Mergers (JOI19_mergers)C++20
100 / 100
733 ms113076 KiB
#include<bits/stdc++.h> using namespace std; #define int long long const int maxn=5e5; int n,k; vector<int>adj[maxn+2],grup[maxn+2]; int dep[maxn+2],par[maxn+2]; void dfs(int cur,int p){ dep[cur]=dep[p]+1; par[cur]=p; for(auto x : adj[cur]){ if(x==p)continue; dfs(x,cur); } } int dsu[maxn+2]; int fin(int a){ if(dsu[a]==a)return a; return dsu[a]=fin(dsu[a]); } void merg(int a,int b){ a=fin(a),b=fin(b); if(a==b)return; dsu[a]=b; } void comb(int a,int b){ a=fin(a),b=fin(b); while(a!=b){ if(dep[a]<dep[b])swap(a,b); merg(a,par[a]); a=fin(a); } } signed main(){ cin>>n>>k; for(int q=1;q<n;q++){ int u,v; cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } for(int q=1;q<=n;q++){ int x;cin>>x; grup[x].push_back(q); dsu[q]=q; } dfs(1,0); for(int q=1;q<=k;q++){ for(auto y : grup[q]){ comb(grup[q].back(),y); } } vector<int>baru[n+2]; for(int q=1;q<=n;q++){ for(auto x : adj[q]){ if(fin(x)!=fin(q)){ baru[fin(q)].push_back(fin(x)); baru[fin(x)].push_back(fin(q)); } } } int tot=0; for(int q=1;q<=n;q++){ if(baru[q].size()==2)tot++; } cout<<(tot+1)/2<<endl; }
#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...