Submission #630819

#TimeUsernameProblemLanguageResultExecution timeMemory
630819codr0Mergers (JOI19_mergers)C++14
34 / 100
48 ms35936 KiB
#include <bits/stdc++.h> #define ll long long #define pll pair<ll,ll> #define pii pair<int,int> #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 F first #define S second #define err(x) cerr<<#x<<" : "<<x<<'\n'; #define dmid int mid=(r+l)/2 #define lc 2*id #define rc 2*id+1 #define pb push_back #define all(x) x.begin(),x.end() #define SZ(x) (int)x.size() #define maxm(a,b) a=max(a,b) #define minm(a,b) a=min(a,b) using namespace std; const int N=3000+4; vector<int> adj[N]; int cnt[N]; int t[N][N],dp[N]; int n,k; void dfs(int v,int p){ for(int u:adj[v]) if(u!=p){ dfs(u,v); dp[v]+=dp[u]; FOR(j,1,k) t[v][j]+=t[u][j]; } if(dp[v]==0&&v!=p){ dp[v]=1; FOR(j,1,k) if(t[v][j]!=cnt[j]&&t[v][j]!=0) dp[v]=0; } } int main(){ iostream::sync_with_stdio(0); cin.tie(0); cin>>n>>k; FOR(_,1,n-1){ int u,v; cin>>u>>v; adj[u].pb(v); adj[v].pb(u); } if(n<=2){ int w0,w1; cin>>w0; if(n==1){ cout<<"0\n"; return 0; } if(n==2){ cin>>w1; cout<<(w0!=w1)<<'\n'; return 0; } assert(1==2); } FOR(i,1,n){ int w; cin>>w; t[i][w]++; cnt[w]++; } int root=1; FOR(i,1,n) if(SZ(adj[i])>1) root=i; dfs(root,root); FOR(i,1,n) if(i!=root){ bool ok=1; FOR(j,1,k) if(t[i][j]!=cnt[j]&&t[i][j]!=0) ok=0; if(ok==0) continue; if(dp[i]==dp[root]) dp[root]++; } cout<<(dp[root]/2+(dp[root]&1))<<'\n'; return 0; }
#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...