제출 #1282395

#제출 시각아이디문제언어결과실행 시간메모리
1282395hanguyendanghuyRailway (BOI17_railway)C++20
0 / 100
1104 ms589824 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll int
#define pb push_back
#define fi first
#define se second
const ll MAXN=1e5+5,INF=1e9,MOD=1e9+7;
ll n,m,i,j,k,p,dem,ans,needcnt,pref[MAXN],en[MAXN],cnt[MAXN],par[MAXN],chain[MAXN],headchain[MAXN],pos[MAXN],cntchain=1,de[MAXN],sz[MAXN];
pair<ll,ll> mark[MAXN];
vector<pair<ll,ll>> adj[MAXN];
void dfs(ll st){
    sz[st]=1;
    for(auto x:adj[st]){
        if(de[x.fi]) continue;
        de[x.fi]=de[st]+1;
        par[x.fi]=st;
        dfs(x.fi);
        sz[st]+=sz[x.fi];
    }
}
void HLD(ll u){
    if(!headchain[cntchain])
        headchain[cntchain]=u;
    chain[u]=cntchain;
    pos[u]=++dem;
    en[cntchain]=dem;
    ll v=-1;
    for(auto x:adj[u])
        if(!chain[x.fi]&&(u==-1||sz[x.fi]>sz[v])) v=x.fi;
    if(v>0) HLD(v);
    for(auto x:adj[u]){
        if(!chain[x.fi]){
            cntchain++;
            HLD(x.fi);
        }
    } 
}
pair<ll,ll> merge(pair<ll,ll> a,pair<ll,ll> b){
  return {min(a.fi,b.fi),max(a.se,b.se)};
}
void lca(ll u,ll v){
  while(chain[u]!=chain[v]){
      if(chain[u]<chain[v]) swap(u,v);
      mark[chain[u]]=merge(mark[chain[u]],{pos[headchain[chain[u]]],pos[u]});
      u=par[headchain[chain[u]]];
  }
  if(de[u]>de[v]) swap(u,v);
  mark[chain[u]]=merge(mark[chain[u]],{pos[u]+1,pos[v]});
}
void solve(ll u,ll countedge,ll id){
	countedge+=pref[pos[u]];
  cnt[id]=countedge;
  for(auto x:adj[u]){
    if(cnt[x.se]) continue;
    if(chain[x.fi]!=chain[u]) solve(x.fi,0,x.se);
    else solve(x.fi,countedge,x.se);
  }
}
int main(){
  ios::sync_with_stdio(0);
  cin.tie(0);cout.tie(0);
  cin>>n>>m>>needcnt;
  for(i=1;i<n;i++){
      ll u,v;
      cin>>u>>v;
      adj[u].pb({v,i});
      adj[v].pb({u,i});
  }
  de[1]=1;
  dfs(1);
  HLD(1);
  for(i=1;i<=cntchain;i++)
    mark[i]={INF,0};
  for(i=1;i<=m;i++){
    cin>>k;
    ll u;
    cin>>u;
    for(j=2;j<=k;j++){
      ll v;
      cin>>v;
      lca(u,v);
    } 
    for(ll j=1;j<=cntchain;j++)
      if(mark[j]!=make_pair(INF,0)){
      	pref[mark[j].fi]++;
      	if(mark[j].se<en[j])
      		pref[mark[j].se+1]--;
        mark[j]={INF,0};
      }
  }
  solve(1,0,0);
  vector<ll> b;
  for(i=1;i<n;i++){
    if(cnt[i]>=needcnt)
      b.pb(i);
  }
  cout<<b.size()<<'\n';
  for(ll x:b) cout<<x<<" ";
}
#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...