Submission #1023320

#TimeUsernameProblemLanguageResultExecution timeMemory
1023320MarwenElarbiPastiri (COI20_pastiri)C++17
100 / 100
493 ms115352 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #pragma GCC optimize("Ofast,no-stack-protector") #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native") #define ll long long #define fi first #define se second #define pb push_back mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int nax=5e5+5; vector<int> adj[nax]; bool sheep[nax]; bool removed[nax]; bool ans[nax]; int sz[nax]; int dep[nax]; int dp[20][nax]; vector<pair<int,int>> parent[nax]; int dis[nax]; queue<pair<int,int>> q; void bfs(){ while(!q.empty()){ auto cur=q.front(); q.pop(); for(auto u:adj[cur.se]){ if(dis[u]>cur.fi+1){ dis[u]=cur.fi+1; q.push({cur.fi+1,u}); } } } } void dfs(int x,int p){ for (int i = 1; i < 20; ++i) { dp[i][x]=dp[i-1][dp[i-1][x]]; } for(auto u:adj[x]){ if(u==p) continue; dep[u]=dep[x]+1; dp[0][u]=x; dfs(u,x); } return; } int jump(int x,int d){ for (int i = 19; i >= 0; --i) { if(d&(1<<i)) x=dp[i][x]; } return x; } bool compare(int x,int y){ return dep[x]<dep[y]; } bool vis[nax]; void dfs2(int x){ vis[x]=true; for(auto u:adj[x]){ if(vis[u]) continue; if(dis[x]==dis[u]+1) dfs2(u); } } signed main(){ iostream::sync_with_stdio(false); int n,k; cin>>n>>k; vector<int> tab(k); for (int i = 0; i < n; ++i) { dis[i]=1e9; } for (int i = 0; i < n-1; ++i) { int x,y; cin>>x>>y; x--;y--; adj[x].pb(y); adj[y].pb(x); } for (int i = 0; i < k; ++i) { int x; cin>>x; tab[i]=x-1; sheep[--x]=true; dis[x]=0; q.push({0,x}); } bfs(); for (int i = 0; i < n; ++i) { for(auto u:parent[i]){ dis[i]=min(dis[i],u.se+dis[u.fi]); } } dfs(0,-1); sort(tab.rbegin(),tab.rend(),compare); for (int i = 0; i < k; ++i) { if(vis[tab[i]]) continue; int cur=0; for (int j = 19; j >= 0; --j) { cur+=(1<<j); if(dis[dp[j][tab[i]]]==cur) tab[i]=dp[j][tab[i]]; else cur-=(1<<j); } ans[tab[i]]=1; dfs2(tab[i]); } vector<int> cnt; for (int i = 0; i < n; ++i) { if(ans[i]==1) cnt.pb(i); } cout <<cnt.size()<<endl; for (int i = 0; i < cnt.size(); ++i) { cout <<cnt[i]+1<<" "; }cout <<endl; }

Compilation message (stderr)

pastiri.cpp: In function 'int main()':
pastiri.cpp:120:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  120 |     for (int i = 0; i < cnt.size(); ++i)
      |                     ~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...