제출 #1333537

#제출 시각아이디문제언어결과실행 시간메모리
1333537crispxxRailway (BOI17_railway)C++20
44 / 100
69 ms37036 KiB
#include <bits/stdc++.h>

using namespace std;

using ll = long long;

void solve() {
	int n, m, k; cin >> n >> m >> k;
	
	vector<array<int, 2>> edges(n - 1);
	
	vector<vector<int>> adj(n);
	
	for(auto &[u, v] : edges) {
		cin >> u >> v;
		
		u--, v--;
		
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	
	vector jmp(n, vector(20, 0));
	
	vector<int> tin(n), tout(n);
	
	{
		int timer = 0;
		
		auto dfs = [&](auto &&self, int v, int p) -> void {
			jmp[v][0] = p;
			
			for(int i = 1; i < 20; i++) {
				jmp[v][i] = jmp[ jmp[v][i - 1] ][i - 1];
			}
			
			tin[v] = ++timer;
			
			for(auto to : adj[v]) {
				if(to == p) continue;
				self(self, to, v);
			}
			
			tout[v] = timer;
		};
		
		dfs(dfs, 0, 0);
	}
	
	auto upper = [&](int u, int v) {
		return tin[v] >= tin[u] && tout[v] <= tout[u];
	};
	
	auto lca = [&](int u, int v) {
		if( upper(u, v) ) return u;
		
		for(int i = 19; i >= 0; i--) {
			if( !upper(jmp[u][i], v) ) {
				u = jmp[u][i];
			}
		}
		
		return jmp[u][0];
	};
	
	auto cmp = [&](int u, int v) {
		return tin[u] <= tin[v];
	};
	
	vector<int> d(n);
	
	while(m--) {
		int S; cin >> S;
		
		vector<int> s(S);
		
		for(auto &v : s) {
			cin >> v;
			
			v--;
		}
		
		vector<int> t = s;
		
		sort(t.begin(), t.end(), cmp);
		
		for(int i = 0; i + 1 < S; i++) {
			t.push_back( lca(t[i], t[i + 1]) );
		}
		
		sort(t.begin(), t.end(), cmp);
		t.erase(unique(t.begin(), t.end()), t.end());
		
		for(auto v : t) {
			adj[v].clear();
		}
		
		stack<int> st;
		
		// cout << '\n' << "cur: " << '\n';
		
		for(auto v : t) {
			while(!st.empty() && !upper(st.top(), v)) {
				st.pop();
			}
			
			if(!st.empty()) {
				adj[st.top()].push_back(v);
				// cout << st.top() + 1 << ' ' << v + 1 << '\n';
			}
			
			st.push(v);
		}
		
		{
			d[t[0]]--;
			
			auto dfs = [&](auto &&self, int v) -> void {
				d[v]++;
				
				d[v] -= (int)adj[v].size();
				
				for(auto to : adj[v]) {
					self(self, to);
				}
			};
			
			dfs(dfs, t[0]);
		}
	}
	
	vector<vector< array<int, 2> >> adj2(n);
	
	for(int i = 0; i < n - 1; i++) {
		auto [u, v] = edges[i];
		
		adj2[u].push_back({v, i});
		adj2[v].push_back({u, i});
	}
	
	vector<int> ans;
	
	{
		auto dfs = [&](auto &&self, int v, int p) -> void {
			for(auto [to, i] : adj2[v]) {
				if(to == p) continue;
				
				self(self, to, v);
				
				d[v] += d[to];
				
				if(d[to] >= k) {
					ans.push_back(i);
				}
			}
		};
		
		dfs(dfs, 0, 0);
	}
	
	// for(auto &x : d) cout << x << ' ';
	// cout << '\n';
	
	sort(ans.begin(), ans.end());
	
	cout << ans.size() << '\n';
	
	for(auto &x : ans) cout << x + 1 << ' ';
	cout << '\n';
}

signed main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	solve();
}
#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...