Submission #1239176

#TimeUsernameProblemLanguageResultExecution timeMemory
1239176lambd47Railway (BOI17_railway)C++20
100 / 100
60 ms20928 KiB
#include <bits/stdc++.h>

using namespace std;

#define sz(v) ((int)(v).size())
#define all(v) (v).begin(), (v).end()
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i >= (k); --i)

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());

const int lg=20;
const int MX=1e5+7;
int dp[lg][MX];
void solve() {
    int n,m,k;cin>>n>>m>>k;
    vector<int> tin(n);
    vector<int> val(n,0);
    vector<int> resp(n,0);
    vector<int> dep(n,0);
    vector<int> edpai(n,-1);
    vector<int> edgs(n);
    vector<vector<int>> adj(n);
    L(i,0,n-2){
        int a,b;cin>>a>>b;a--;b--;
        adj[a].push_back(i);
        adj[b].push_back(i);
        edgs[i]=a^b;
    }
    int tmp=0;
    edpai[0]=n-1;
    auto dfs=[&](auto&& self, int node,int p)->void{
        tin[node]=tmp++;
        dp[0][node]=p;
        dep[node]=dep[p]+1;
        L(i,1,lg-1){
            dp[i][node]=dp[i-1][dp[i-1][node]];
        }
        for(auto e:adj[node]){
            int a=edgs[e]^node;
            if(a==p)continue;
            edpai[a]=e;
            self(self,a,node);
        }
    };
    dfs(dfs,0,0);

    auto lca=[&](int a, int b)->int{
        if(dep[a]<dep[b])swap(a,b);
        int d=dep[a]-dep[b];
        L(i,0,lg-1){
            if(d&(1<<i))a=dp[i][a];
        }
        if(a==b)return a;
        R(i,lg-1,0){
            if(dp[i][a]!=dp[i][b]){
                a=dp[i][a];
                b=dp[i][b];
            }
        }
        return dp[0][a];
    };


        
    auto solv=[&](vector<int>& vec){
        for(auto a:vec)val[a]++;
        sort(vec.begin(),vec.end(),[&](int a, int b){
                return tin[a]<tin[b];
        });
        int lcgoat=vec[0];
        L(i,1,sz(vec)-1){
            int at=lca(vec[i],vec[i-1]);
            val[at]--;
            lcgoat=lca(at,lcgoat);
        }
        val[lcgoat]--;
    };

    L(i,0,m-1){
        int k;cin>>k;
        vector<int> aux(k);
        L(i,0,k-1){
            cin>>aux[i];aux[i]--;
        }
        solv(aux);
    }


    auto dfsfind=[&](auto&& self, int node, int pai)->int{
        resp[edpai[node]]=val[node];
        for(auto e:adj[node]){
            int a=edgs[e]^node;
            if(a==pai)continue;
            resp[edpai[node]]+=self(self,a,node);
        }
        return resp[edpai[node]];
    };
    dfsfind(dfsfind, 0,0);
    vector<int> fina;
    L(i,0,n-2){
        if(resp[i]>=k)fina.push_back(i+1);
    }
    cout<<sz(fina)<<"\n";
    for(auto a:fina)cout<<a<<" ";



}
 
int32_t main() {
    std::cin.tie(0)->sync_with_stdio(0); 
    std::cin.exceptions(std::cin.failbit);

    int T = 1;
//    std::cin >> T;
    while(T--) {
        solve();
    }

	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...