Submission #1310139

#TimeUsernameProblemLanguageResultExecution timeMemory
1310139muhammad-ahmadRailway (BOI17_railway)C++20
100 / 100
201 ms50988 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 1e5 + 5;
const int L = 20;
vector<int> adj[N];
int cur, dist[N], par[N], sp[N][L], val[N], intime[N];

void sp_table(int u){
	sp[u][0] = par[u];
	int power = 1;
	for (int i = 1; i < L; i++){
		power *= 2;
		if (dist[u] < power) sp[u][i] = 0;
		else sp[u][i] = sp[sp[u][i - 1]][i - 1];
	}
}
 
void dfs(int u){
    intime[u] = ++cur;
	sp_table(u);
	for (auto i : adj[u]){
		if (par[u] != i){
			dist[i] = dist[u] + 1;
			par[i] = u;
			dfs(i);
		}
	}
}

int kth_ancestor(int u, int k){
	if (k == 0) return u;
	int power = 1;
	int ans = u;
	for (int i = 0; i < L; i++){
		if (k & power){
			ans = sp[ans][i]; 
		}
		power *= 2;
	}
	return ans;
}

int LCA(int u, int v){
	if (dist[u] > dist[v]) swap(u, v);
	v = kth_ancestor(v, dist[v] - dist[u]);
	if (u == v) return u;
	for (int i = L - 1; i >= 0; i--){
		if (sp[u][i] != sp[v][i]){
			u = sp[u][i];
			v = sp[v][i];
		}
	}
	return par[v];
}

int ans, k;
map<pair<int, int>, int> E;
vector<int> op;

void dfs1(int u = 1){
    for (auto v : adj[u]){
        if (v == par[u]) continue;
        dfs1(v);
        val[u] += val[v];
    }
    if (val[u] >= k) {ans++;
        op.push_back(E[{par[u], u}]);
    }
}

signed main(){
    int n, m; cin >> n >> m >> k;
    for (int i = 1; i < n; i++){
        int u, v; cin >> u >> v;
        adj[u].push_back(v);
        adj[v].push_back(u);
        E[{u, v}] = i;
        E[{v, u}] = i;
    }
    
    dfs(1);
    
    for (int i = 1; i <= m; i++){
        int s; cin >> s;
        vector<pair<int, int>> p;
        for (int j = 1; j <= s; j++){
            int x; cin >> x;
            val[x]++;
            p.push_back({intime[x], x});
        }
        sort(p.begin(), p.end());
        for (int j = 1; j < s; j++){
            int x = LCA(p[j].second, p[j - 1].second);
            val[x]--;
        }
        val[LCA(p[0].second,p.back().second)]--;
    }
    
    dfs1();
    cout << ans << endl;
    sort(begin(op), end(op));
    for (auto i : op) cout << i << ' ';
    cout << endl;
}
#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...