Submission #463933

#TimeUsernameProblemLanguageResultExecution timeMemory
463933bonopoRailway (BOI17_railway)C++14
100 / 100
111 ms23824 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> using namespace std; using namespace __gnu_pbds; #define pb push_back #define rc (i<<1)|1 #define lc (i<<1) #define el "\n" #define f first #define s second typedef long long ll; const int MM=1e5+5, MOD=1e9+7, LOG=19; int N, M, K, psa[MM], dep[MM], son[MM], top[MM], fa[MM], sz[MM], in[MM], ot[MM], cnt; vector<pair<int,int>> adj[MM]; vector<int> vdj[MM], ans; void df1(int u, int pa=0) { dep[u]=dep[pa]+1; fa[u]=pa; sz[u]=1; in[u]=++cnt; for(auto &e:adj[u]) if(e.f!=pa) { int v=e.f; df1(v, u); sz[u]+=sz[v]; if(sz[v]>sz[son[u]]) son[u]=v; } ot[u]=++cnt; } void df2(int u, int pa=0) { if(son[u]) { top[son[u]]=top[u]; df2(son[u], u); } for(auto &e:adj[u]) if(e.f!=pa&&e.f!=son[u]) { df2(top[e.f]=e.f, u); } } bool above(int u, int v) { return in[u]<in[v]&&ot[v]<ot[u]; } bool cmp(int u, int v) { return in[u]<in[v]; } int lca(int u, int v) { for(; top[u]!=top[v]; u=fa[top[u]]) { if(dep[top[u]]<dep[top[v]]) swap(u, v); } return (dep[u]<dep[v]?u:v); } int buildvrt(vector<int> &vrt, int k) { sort(begin(vrt), end(vrt), cmp); for(int i=1; i<k; ++i) { vrt.pb(lca(vrt[i-1], vrt[i])); } sort(begin(vrt), end(vrt), cmp); vrt.erase(unique(begin(vrt), end(vrt)), end(vrt)); vector<int> stk={vrt[0]}; for(int i=1; i<vrt.size(); ++i) { int u=vrt[i]; while(stk.size()>=2&&!above(stk.back(), u)) { vdj[stk[stk.size()-2]].pb(stk.back()); stk.pop_back(); } stk.pb(u); } while(stk.size()>=2) { vdj[stk[stk.size()-2]].pb(stk.back()); stk.pop_back(); } return stk[0]; } void df3(int u, int pa=0) { for(int &v:vdj[u]) if(v!=pa) ++psa[v], --psa[u], df3(v, u); vdj[u].clear(); } void df4(int u, int pa=0) { for(auto &e:adj[u]) if(e.f!=pa) { df4(e.f, u); psa[u]+=psa[e.f]; } for(auto &e:adj[u]) if(e.f!=pa) { if(psa[e.f]>=K) ans.pb(e.s); } } int32_t main() { cin.tie(nullptr)->sync_with_stdio(false); cin>>N>>M>>K; for(int i=1, u, v; i<N; ++i) { cin>>u>>v; adj[u].pb({v,i}); adj[v].pb({u,i}); } df1(1); df2(top[1]=1); for(int i=1, k; i<=M; ++i) { cin>>k; vector<int> vrt; for(int j=1, x; j<=k; ++j) cin>>x, vrt.pb(x); df3( buildvrt(vrt, k)); } df4(1); sort(begin(ans), end(ans)); cout<<ans.size()<<el; for(int i=0; i<ans.size(); ++i) cout<<ans[i]<<" \n"[i==ans.size()-1]; } // MM

Compilation message (stderr)

railway.cpp: In function 'int buildvrt(std::vector<int>&, int)':
railway.cpp:56:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |     for(int i=1; i<vrt.size(); ++i) {
      |                  ~^~~~~~~~~~~
railway.cpp: In function 'int32_t main()':
railway.cpp:95:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     for(int i=0; i<ans.size(); ++i) cout<<ans[i]<<" \n"[i==ans.size()-1];
      |                  ~^~~~~~~~~~~
railway.cpp:95:58: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   95 |     for(int i=0; i<ans.size(); ++i) cout<<ans[i]<<" \n"[i==ans.size()-1];
      |                                                         ~^~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...