Submission #1123601

#TimeUsernameProblemLanguageResultExecution timeMemory
1123601Rainmaker2627Railway (BOI17_railway)C++20
36 / 100
118 ms37972 KiB
#include<bits/stdc++.h>
using namespace std;

vector<int> dep, pos, par, val, eul;
vector<vector<int>> adj;

struct sparse {
	int n, m;
	vector<vector<int>> sp;

	int high(int a, int b) {
		return (dep[a]<=dep[b]?a:b);
	}

	void build() {
		m=0; n=eul.size();
		while ((1<<m)<n) m++;
		sp.assign(m, vector<int>(n, 0));
		for (int i = 0; i < n; ++i) sp[0][i]=eul[i];
		for (int i = 1; i < m; ++i) {
			for (int j = 0; j < n-(1<<i)+1; ++j) {
				sp[i][j]=high(sp[i-1][j], sp[i-1][j+(1<<i-1)]);
			}
		}
	}

	int query(int a, int b) {
		if (a==b) return a;
		a=pos[a], b=pos[b];
		if (a>b) swap(a, b);
		int d=b-a, t=0;
		while ((1<<t)<=d) t++; t--;
		return high(sp[t][a], sp[t][b-(1<<t)+1]);
	}
} sp;

bool pcomp(int a, int b) { return pos[a]<pos[b]; }
void dvts(vector<int>& ic) {
	int n=ic.size();
	sort(ic.begin(), ic.end(), pcomp);
	val[ic[0]]++; val[sp.query(ic[0], ic[n-1])]--;
	for (int i = 1; i < n; ++i) {
		val[ic[i]]++;
		val[sp.query(ic[i], ic[i-1])]--;
	}
}

void tour(int u, int p) {
	par[u]=p;
	dep[u]=dep[p]+1;
	pos[u]=eul.size();
	eul.push_back(u);
	for (auto v : adj[u]) {
		if (v==p) continue;
		tour(v, u);
		eul.push_back(u);
	}
}

void fill(int u, int p) {
	for (auto v : adj[u]) {
		if (v==p) continue;
		fill(v, u);
		val[u]+=val[v];
	}
}

int main() {
	cin.tie(0)->sync_with_stdio(false);

	int n, m, k;
	cin >> n >> m >> k;
	map<pair<int, int>, int> eord;
	adj.assign(n+1, vector<int>());
	for (int i = 0; i < n-1; ++i) {
		int a, b;
		cin >> a >> b;
		adj[a].push_back(b);
		adj[b].push_back(a);
		if (a<b) swap(a, b);
		eord[{a, b}]=i+1;
	}

	pos.assign(n+1, 0);
	dep.assign(n+1, 0);
	par.assign(n+1, 0);
	tour(1, 1);
	sp.build();

	val.assign(n+1, 0);
	for (int i = 0, s; i < m; ++i) {
		cin >> s;
		vector<int> c(s);
		for (int i = 0; i < s; ++i) {
			cin >> c[i];
		} dvts(c);
	} fill(1, 1);

	vector<int> ans;
	for (int i = 1; i <= n; ++i) {
		if (val[i]<k) continue;
		int a=i, b=par[i];
		if (a<b) swap(a, b);
		ans.push_back(eord[{a, b}]);
	}

	cout << ans.size() << '\n';
	for (auto i : ans) {
		cout << i << ' ';
	} cout << '\n';

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