제출 #919122

#제출 시각아이디문제언어결과실행 시간메모리
919122ttamxMergers (JOI19_mergers)C++14
10 / 100
69 ms40688 KiB
#include<bits/stdc++.h> using namespace std; const int N=5e5+5; int n,k; vector<int> adj[N],comp[N]; int sz[N],hv[N],lv[N],hd[N],pa[N]; int a[N],dp[N]; void dfs(int u,int p=0){ pa[u]=p; sz[u]=1; for(auto v:adj[u])if(v!=p){ lv[v]=lv[u]+1; dfs(v,u); sz[u]+=sz[v]; if(sz[v]>sz[hv[u]])hv[u]=v; } } void hld(int u,int p=0){ if(!hd[u])hd[u]=u; if(hv[u])hd[hv[u]]=hd[u],hld(hv[u],u); for(auto v:adj[u])if(v!=p&&v!=hv[u])hld(v,u); } int lca(int u,int v){ while(hd[u]!=hd[v]){ if(lv[hd[u]]<lv[hd[v]])swap(u,v); u=pa[hd[u]]; } return lv[u]<lv[v]?u:v; } void dfs2(int u,int p=0){ dp[u]=0; for(auto v:adj[u])if(v!=p){ dfs2(v,u); a[u]+=a[v]; dp[u]+=max(dp[v],a[v]?0:1); } } int main(){ cin.tie(nullptr)->sync_with_stdio(false); cin >> n >> k; for(int i=1;i<n;i++){ int u,v; cin >> u >> v; adj[u].emplace_back(v); adj[v].emplace_back(u); } for(int i=1;i<=n;i++){ int x; cin >> x; comp[x].emplace_back(i); } if(n==1)cout << 0,exit(0); if(n==2)cout << (n==k),exit(0); int rt=1; for(int i=2;i<=n;i++)if(adj[i].size()>1)rt=i; dfs(rt); hld(rt); for(int i=1;i<=k;i++){ for(int j=1;j<comp[i].size();j++){ int u=comp[i][j-1],v=comp[i][j]; a[u]++,a[v]++,a[lca(u,v)]-=2; } } dfs2(rt); cout << (dp[rt]+1)/2; }

컴파일 시 표준 에러 (stderr) 메시지

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