Submission #1160698

#TimeUsernameProblemLanguageResultExecution timeMemory
1160698AlgorithmWarriorRailway (BOI17_railway)C++20
100 / 100
151 ms34760 KiB
#include <bits/stdc++.h> using namespace std; int const MAX=2e5+5; int const LOG=20; int n,m,k; vector<int>tree[MAX]; int euler[MAX]; int pos[MAX]; int h[MAX]; int rmq[MAX][LOG]; int logar[MAX]; int used[MAX]; int query[MAX]; struct edge{ int u,v; }edg[MAX]; void read(){ cin>>n>>m>>k; int i; for(i=1;i<n;++i){ int u,v; cin>>u>>v; tree[u].push_back(v); tree[v].push_back(u); edg[i]={u,v}; } } void dfs(int nod,int tata){ static int time=0; euler[++time]=nod; pos[nod]=time; for(auto fiu : tree[nod]) if(fiu!=tata){ h[fiu]=h[nod]+1; dfs(fiu,nod); euler[++time]=nod; } } void get_rmq(){ int i,j; for(i=1;i<2*n;++i) rmq[i][0]=euler[i]; for(j=1;j<LOG;++j) for(i=1;i<2*n;++i){ rmq[i][j]=rmq[i][j-1]; int urm=i+(1<<(j-1)); if(urm<2*n){ int rmq1=rmq[i][j]; int rmq2=rmq[urm][j-1]; if(h[rmq1]>h[rmq2]) rmq[i][j]=rmq2; } } for(i=2;i<MAX;++i) logar[i]=logar[i/2]+1; } int get_lca(int nod1,int nod2){ int pos1=pos[nod1]; int pos2=pos[nod2]; if(pos1>pos2) swap(pos1,pos2); int len=pos2-pos1+1; int loga=logar[len]; int rmq1=rmq[pos1][loga]; int rmq2=rmq[pos2-(1<<loga)+1][loga]; if(h[rmq1]<h[rmq2]) return rmq1; else return rmq2; } void add_path(int nod,int anc){ ++used[nod]; --used[anc]; } bool cmp(int nod1,int nod2){ return pos[nod1]<pos[nod2]; } void process_queries(){ int i; for(i=1;i<=m;++i){ int sz; cin>>sz; int j; for(j=1;j<=sz;++j) cin>>query[j]; sort(query+1,query+sz+1,cmp); for(j=2;j<=sz;++j) add_path(query[j],get_lca(query[j],query[j-1])); add_path(query[1],get_lca(query[1],query[sz])); } } int dfs_path(int nod,int tata){ for(auto fiu : tree[nod]) if(fiu!=tata) used[nod]+=dfs_path(fiu,nod); return used[nod]; } void get_answer(){ vector<int>ans; int i; for(i=1;i<n;++i){ auto [nod,par]=edg[i]; if(h[nod]<h[par]) swap(nod,par); if(used[nod]>=k) ans.push_back(i); } cout<<ans.size()<<'\n'; for(auto elem : ans) cout<<elem<<' '; } int main() { read(); dfs(1,0); get_rmq(); process_queries(); dfs_path(1,0); get_answer(); 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...
#Verdict Execution timeMemoryGrader output
Fetching results...