제출 #777655

#제출 시각아이디문제언어결과실행 시간메모리
777655NK_Railway (BOI17_railway)C++17
100 / 100
230 ms47548 KiB
#include <bits/stdc++.h>

using namespace std;

#define nl '\n'

template<class T> struct BIT {
	vector<int> data; int N; 
	void init(int n) { N = n; data = vector<int>(N, 0); }
	void add(int p, int x) { for(++p;p<=N;p+=p&-p) data[p-1] += x; }
	int sum(int l, int r) { return sum(r+1) - sum(l); }
	int sum(int r) { int s = 0; for(;r;r-=r&-r) s += data[r-1]; return s; }
};

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

	int N, M, K; cin >> N >> M >> K;

	vector<vector<int>> adj(N);

	map<pair<int, int>, int> idx;
	for(int i = 0; i < N-1; i++) {
		int u, v; cin >> u >> v; --u, --v;
		idx[{u, v}] = idx[{v, u}] = i;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}

	const int LG = 20;

	vector<vector<int>> up(N, vector<int>(LG));
	vector<int> dep(N), st(N), en(N);

	int t = 0;
	function<void(int, int)> gen = [&](int u, int p) {
		up[u][0] = (p == -1 ? u : p);
		for(int i = 1; i < LG; i++) up[u][i] = up[up[u][i-1]][i-1];

		dep[u] = (p == -1 ? 0 : dep[p]+1);
		st[u] = t++;
		for(auto v : adj[u]) if (v != p) gen(v, u);
		en[u] = t-1;
	};

	gen(0, -1);

	auto jmp = [&](int u, int d) {
		for(int i = 0; i < LG; i++) if ((d >> i) & 1) u = up[u][i];
		return u;
	};

	auto lca = [&](int u, int v) {
		if (dep[u] < dep[v]) swap(u, v);
		u = jmp(u, dep[u] - dep[v]);

		if (u == v) return u;
		for(int i = LG - 1; i >= 0; i--) {
			int U = up[u][i], V = up[v][i];
			if (U != V) u = U, v = V;
		}

		return up[u][0];
	};

	vector<int> C(N);

	BIT<int> B; B.init(N);
	for(int q = 0; q < M; q++) {
		int k; cin >> k;
		vector<int> A(k); for(auto &x : A) { cin >> x; --x; }

		sort(begin(A), end(A), [&](int x, int y) {
			if (en[x] == en[y]) return dep[x] > dep[y];
			return en[x] < en[y];
		});

		int all = A[0];
		// cout << q << " - " << k << nl;
		for(auto x : A) {
			all = lca(all, x);
			B.add(st[x], 1);
			C[x]++;
			// cout << x << " ";
		}
		// cout << nl;

		vector<int> L = A;
		for(int i = 0; i < k-1; i++) {
			L.push_back(lca(A[i], A[i+1]));
		}

		sort(begin(L), end(L));
		L.erase(unique(begin(L), end(L)), end(L));

		sort(begin(L), end(L), [&](int x, int y) {
			if (en[x] == en[y]) return dep[x] > dep[y];
			return en[x] < en[y];
		});

		// cout << "NODES: " << nl;
		for(auto x : L) {
			int amt = B.sum(st[x], en[x]) - 1;
			// cout << x << " => " << amt << nl;
			B.add(st[x], -amt);
			C[x] -= amt;
		}
		// cout << nl;

		C[all]--;
		// cout << "LCA: " << all << nl;

		for(auto x : L) B.add(st[x], -B.sum(st[x], st[x]));
	}

	vector<int> ans;
	function<void(int, int)> dfs = [&](int u, int p) {
		for(auto v : adj[u]) if (v != p) {
			dfs(v, u);
			C[u] += C[v];
		}
		// cout << u << " -> " << C[u] << nl;

		if (p != -1 && C[u] >= K) ans.push_back(idx[{u, p}]);
	};

	dfs(0, -1);

	sort(begin(ans), end(ans));

	cout << size(ans) << nl;
	for(auto x : ans) cout << x+1 << " ";
	cout << nl;



		

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