Submission #1213365

#TimeUsernameProblemLanguageResultExecution timeMemory
1213365minhpkRailway (BOI17_railway)C++20
100 / 100
87 ms83388 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int a,b,k;
vector <int> z[1000005];
int d[1000005];
int sta1[1000005];
int fin1[1000005];
int tour1;
int high[1000005];
vector <int> res;


int logarit[1000005];
int sta[1000005];
int fin[1000005];
int euler[1000005];
int tour;
pair<int,int> edge[1000005];
int val[1000005];
int st[300001][21];

vector <int> v;


void dfs(int i,int parent){
     tour++;
     sta[i]=tour;
     euler[tour]=i;

     tour1++;
     sta1[i]=tour1;

     for (auto p:z[i]){
         if (p==parent){
            continue;
         }
         high[p]=high[i]+1;
         dfs(p,i);
         tour++;
         euler[tour]=i;
     }


    fin1[i]=tour1;

}

bool isanc(int x,int y){
    return sta1[x]>=sta1[y] && fin1[x]<=fin1[y];
}

bool cmp(int a,int b){
    return sta1[a]<sta1[b];
}

void buildst(){
    for (int i=1;i<=tour;i++){
         st[i][0]=euler[i];
    }

    for (int j=1;j<=20;j++){
         for (int i=1;i+(1<<j)-1<=tour;i++){
              int l=st[i][j-1];
              int r=st[i+(1<<(j-1))][j-1];

              if (high[l]<high[r]){
                  st[i][j]=l;
              }else{
                  st[i][j]=r;
              }
         }
    }
}

int lca(int x,int y){
    int l=min(sta[x],sta[y]);
    int r=max(sta[x],sta[y]);

    int j=logarit[r-l+1];
    int idx1=st[l][j];
    int idx2=st[r-(1<<j)+1][j];

    if (high[idx1]<high[idx2]){
        return idx1;
    }else{
        return idx2;
    }
}

void auxiliary(){
    sort(v.begin(),v.end(),cmp);

    int sz=v.size();
    for (int i=0;i<sz-1;i++){
         int pre= lca(v[i],v[i+1]);
         v.push_back(pre);
    }

    sort(v.begin(),v.end(),cmp);
    v.erase(unique(v.begin(),v.end()),v.end());
    int auxroot=v[0];
    stack<int> st;
    st.push(auxroot);

    for (int i=1;i<v.size();i++){
         int u=v[i];
         while (st.size() && !isanc(u,st.top())){
               st.pop();
         }
         int g=st.top();
         d[u]++;
         d[g]--;
       //  cout << u << " " << g << "\n";
         st.push(u);
    }
}

void dfs1(int i,int par){
    val[i]=d[i];
    for (auto p:z[i]){
         if (p==par){
            continue;
         }
         dfs1(p,i);
         val[i]+=val[p];
    }
}


signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a >> b >> k;
    logarit[1]=0;
    for (int i=2;i<=1e6;i++){
         logarit[i]=logarit[i/2]+1;
    }
    for (int i=1;i<a;i++){
         int x,y;
         cin >> x >> y;
         z[x].push_back(y);
         z[y].push_back(x);
         edge[i]={x,y};
    }
    dfs(1,0);
    buildst();

    while (b--){
         int c;
         cin >> c;
         for (int i=1;i<=c;i++){
              int x;
              cin >> x;
              v.push_back(x);
         }
         auxiliary();
         v.clear();
    }
    dfs1(1,0);
    for (int i=1;i<a;i++){
         auto [x,y]=edge[i];
         if (high[x]<high[y]){
            swap(x,y);
         }
         if (val[x]>=k){
            // cout << val[x] << " " << x  << "\n";
             res.push_back(i);
         }
    }
    cout << res.size() << "\n";
    for (auto p:res){
         cout << p << " ";
    }
    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...