Submission #128855

#TimeUsernameProblemLanguageResultExecution timeMemory
128855AbelyanRailway (BOI17_railway)C++17
52 / 100
384 ms30088 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; #define FOR(i,a) for (int i=0;i<(a);++i) #define FORD(i,a) for (int i=(a)-1;i>=0;i--) #define FORT(i,a,b) for (int i=(a);i<=(b);++i) #define FORTD(i,b,a) for (int i=(b);i>=(a);--i) #define trav(i,v) for (auto i : v) #define all(v) v.begin(),v.end() #define ad push_back #define fr first #define sc second #define mpr(a,b) make_pair(a,b) #define pir pair<int,int> #define all(v) v.begin(),v.end() #define make_unique(v) v.erase(unique(all(v)),v.end()) #define fastio ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); #define srng mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()) #define y1 EsiHancagorcRepa const int N=1e5+10; const ll MOD=1e9+7; int n,m,k,lg,timer,tin[N],tout[N],anc[N][20],qan[N],subsz[N],tin2[N],timer2,ver[N],comp[N],deep[N],ttt,hakatin2[N]; bool all[4*N]; vector<pir> g[N]; vector<int> ans,poxel; void dfs(int v,int par=0){ tin[v]=timer++; anc[v][0]=par; FORT(i,1,lg) anc[v][i]=anc[anc[v][i-1]][i-1]; deep[v]=deep[par]+1; trav(tv,g[v]){ int to=tv.fr; if (to==par){ continue; } dfs(to,v); } tout[v]=timer++; } bool upper(int a,int b){ return tin[a]<=tin[b] && tout[b]<=tout[a]; } int lca(int a,int b){ if (upper(a,b))return a; if (upper(b,a))return b; FORD(i,lg+1){ if (!upper(anc[a][i],b)){ a=anc[a][i]; } } return anc[a][0]; } int dfs2(int v,int par=0){ int tiv=qan[v]; //cout<<v<<" "<<tiv<<endl; trav(tv,g[v]){ int to=tv.fr; if (to==par)continue; int cur=dfs2(to,v); if (cur>=k){ ans.ad(tv.sc); } tiv+=cur; } return tiv; } int dfssz(int v,int par=0){ subsz[v]=1; trav(tv,g[v]){ int to=tv.fr; if (to==par)continue; subsz[v]+=dfssz(to,v); } return subsz[v]; } int cnt=1; pir sg[4*N]; void update(int v,int tl,int tr,int ind,pir val){ poxel.ad(v); if (tl==tr){ sg[v]=val; return; } int tm=(tl+tr)/2; if (ind<=tm)update(v+v,tl,tm,ind,val); else update(v+v+1,tm+1,tr,ind,val); if (sg[v+v+1].fr==1)sg[v]=sg[v+v+1]; else sg[v]=sg[v+v]; //if (sg[v].sc==1){cout<<"stex el ka "<<tl<<" "<<tr<<" "<<ind<<endl;} //if (tl==0 && tr==2)cout<<"stex piti urish lini "<<sg[v].fr<<" "<<sg[v].sc<<endl; } pir query(int v,int tl,int tr,int l,int r){ poxel.ad(v); if (l>r)return {0,0}; //cout<<tl<<" "<<tr<<" "<<l<<" "<<r<<endl; if (all[v]==ttt){ //cout<<"heeey "<<hakatin2[r]<<endl; return {1,hakatin2[r]}; } if (tl==l && tr==r){ //if (sg[v].sc==1) cout<<"arraaaa stexa "<<v<<" "<<tl<<" "<<tr<<endl; all[v]=ttt; pir nax=sg[v]; sg[v]={1,hakatin2[tr]}; return nax; } int tm=(tl+tr)/2; pir q1=query(v+v+1,tm+1,tr,max(tm+1,l),r); if (sg[v+v+1].fr==1)sg[v]=sg[v+v+1]; else sg[v]=sg[v+v]; if (q1.fr==1){ return q1; } q1 = query(v+v,tl,tm,l,min(r,tm)); if (sg[v+v+1].fr==1)sg[v]=sg[v+v+1]; else sg[v]=sg[v+v]; return q1; } int get(int a){ //cout<<"heeeeeeey "<<a<<" "<<tin2[1]<<" "<<tin2[a]<<endl; while(true){ int ca=comp[a]; //cout<<ca<<endl; //cout<<ca<<" "<<ver[ca]<<" "<<tin2[ver[ca]]<<endl;; pir cur=query(1,0,n-1,tin2[ver[ca]],tin2[a]); if (cur.fr==1){ return cur.sc; } a=anc[ver[ca]][0]; } //cout<<"byeeeeee "<<endl; return 0; } void decomp(int v,int par,int ham){ comp[v]=ham; tin2[v]=timer2++; //cout<<"haka "<<timer2-1<<" "<<v<<endl; hakatin2[timer2-1]=v; pir mx={INT_MIN,INT_MIN}; FOR(i,g[v].size()){ int to=g[v][i].fr; if (to==par)continue; mx=max(mx,{subsz[to],i}); } if (mx.fr==INT_MIN)return; swap(g[v][0],g[v][mx.sc]); trav(tv,g[v]){ int to=tv.fr; if (to==par)continue; if (to==g[v][0].fr){ decomp(to,v,ham); } else{ ver[cnt]=to; decomp(to,v,cnt++); } } } int main(){ fastio; srng; cin>>n>>m>>k; FOR(i,n-1){ int a,b; cin>>a>>b; a--; b--; g[a].ad({b,i+1}); g[b].ad({a,i+1}); } dfssz(0); ver[0]=0; deep[0]=-1; decomp(0,0,0); while((1<<lg)<=n)lg++; dfs(0); for(ttt=1;ttt<=m;ttt++){ int s; cin>>s; vector<pir> vec; FOR(i,s){ int a; cin>>a; a--; vec.ad({deep[a],a}); } sort(all(vec)); int lc=vec[0].sc; FORT(i,1,s-1){ lc=lca(lc,vec[i].sc); } update(1,0,n-1,tin2[lc],{1,lc}); FOR(i,s){ qan[vec[i].sc]++; int verevin=get(vec[i].sc); qan[verevin]--; //cout<<vec[i].sc<<" "<<verevin<<endl; //update(1,0,n-1,tin2[vec[i].sc],{1,vec[i].sc}); } trav(tv,poxel){ sg[tv]={0,0}; } poxel.clear(); } assert(dfs2(0)==0); cout<<ans.size()<<endl; sort(all(ans)); FOR(i,ans.size()){ cout<<ans[i]<<" "; } return 0; } /* 10 3 2 1 2 1 5 1 8 2 3 2 4 5 6 5 7 8 9 8 10 6 2 4 8 1 10 9 3 2 4 3 3 9 5 10 9 4 3 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 3 4 2 6 4 1 5 2 3 3 5 7 9 2 6 8 */

Compilation message (stderr)

railway.cpp: In function 'void decomp(int, int, int)':
railway.cpp:8:32: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a) for (int i=0;i<(a);++i)
                                ^
railway.cpp:156:5: note: in expansion of macro 'FOR'
     FOR(i,g[v].size()){
     ^~~
railway.cpp: In function 'int main()':
railway.cpp:8:32: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,a) for (int i=0;i<(a);++i)
                                ^
railway.cpp:229:5: note: in expansion of macro 'FOR'
     FOR(i,ans.size()){
     ^~~
#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...