Submission #722027

#TimeUsernameProblemLanguageResultExecution timeMemory
722027fdnfksdMergers (JOI19_mergers)C++14
100 / 100
1250 ms206200 KiB
#include<bits/stdc++.h> #define TASKNAME "codeforce" #define pb push_back #define pli pair<int,int> #define fi first #define se second #define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); using namespace std; using ll=long long; const ll maxN=5e5+10; const ll inf=1e18; const ll mod=1e9+7; ll P[maxN][21],h[maxN],in[maxN],out[maxN],tg=0; vector<ll>g[maxN]; void dfs(ll u=1,ll p=1) { P[u][0]=p; in[u]=++tg; for(int i=1;i<=20;i++) P[u][i]=P[P[u][i-1]][i-1]; for(int v:g[u]) { if(v!=p) { h[v]=h[u]+1; dfs(v,u); } } } ll cnt[maxN]; vector<ll>adj[maxN]; void dfs1(ll u=1,ll p=0) { for(int v:g[u]) { if(v!=p) { dfs1(v,u); cnt[u]+=cnt[v]; } } } void dfs2(ll u=1,ll p=0,ll last=-1) { if(cnt[u]==0&&last!=-1) { adj[u].pb(last); adj[last].pb(u); } if(cnt[u]==0) last=u; for(int v:g[u]) { if(v!=p) { dfs2(v,u,last); } } } ll n,k; vector<ll>vec[maxN]; bool cmp(ll x,ll y) { return in[x]<in[y]; } ll lca(ll u,ll v) { if(h[u]<h[v]) swap(u,v); for(int i=20;i>=0;i--) if(h[u]-(1<<i)>=h[v]) u=P[u][i]; if(u==v) return u; for(int i=20;i>=0;i--) if(P[u][i]!=P[v][i]) u=P[u][i],v=P[v][i]; return P[u][0]; } void solve() { cin >> n >> k; for(int i=1;i<n;i++) { ll u,v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } dfs(); for(int i=1;i<=n;i++) { ll x; cin >> x; vec[x].pb(i); } for(int i=1;i<=k;i++) { sort(vec[i].begin(),vec[i].end(),cmp); for(int j=0;j<vec[i].size();j++) { cnt[vec[i][j]]++; cnt[lca(vec[i][j],vec[i][(j+1)%vec[i].size()])]--; } } dfs1(); dfs2(); ll ct=0; for(int i=1;i<=n;i++) { if(adj[i].size()==1) ct++; } cout <<(ct+1)/2; } int main() { fastio //freopen(TASKNAME".INP","r",stdin); //freopen(TASKNAME".OUT","w",stdout); solve(); }

Compilation message (stderr)

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