Submission #927922

#TimeUsernameProblemLanguageResultExecution timeMemory
927922TAhmed33Railway (BOI17_railway)C++98
100 / 100
364 ms56340 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 25;
int n, m, k;
vector <int> adj[MAXN];
int t = 0;
int in[MAXN], out[MAXN], dep[MAXN], p[MAXN];
void dfs (int pos, int par = 0) {
	in[pos] = ++t;
	p[pos] = par;
	for (auto j : adj[pos]) {
		if (j == par) continue;
		dep[j] = 1 + dep[pos];
		dfs(j, pos);
	}
	out[pos] = t;
}
int dp[18][MAXN];
int jump (int a, int b) {
	for (int i = 17; i >= 0; i--) {
		if (b & (1 << i)) {
			a = dp[i][a];
		}
	}
	return a;
}
int lca (int a, int b) {
	if (dep[a] > dep[b]) swap(a, b);
	b = jump(b, dep[b] - dep[a]);
	if (a == b) return a;
	for (int i = 17; i >= 0; i--) {
		int x = dp[i][a], y = dp[i][b];
		if (x && y && x != y) {
			a = x; b = y;
		}
	}
	return jump(a, 1);
}
map <int, int> vals[MAXN];
void insert (int a, int b, int c) {
	if (a == b) return;
	vals[a][c]++;
	vals[b][c]--;
}
vector <int> kk;
void dfs2 (int pos, int par) {
	for (auto j : adj[pos]) {
		if (j == par) continue;
		dfs2(j, pos);
		if (vals[j].size() > vals[pos].size()) vals[j].swap(vals[pos]);
		for (auto p : vals[j]) {
			vals[pos][p.first] += p.second;
			if (vals[pos][p.first] == 0) vals[pos].erase(p.first);
		}
		vals[j].clear();
	}
	if (vals[pos].size() >= k) {
		kk.push_back(pos);
	}
}
map <pair <int, int>, int> lll;
int main () {
	cin >> n >> m >> k;
	for (int i = 1; i < n; i++) {
		int a, b;
		cin >> a >> b;
		adj[a].push_back(b);
		adj[b].push_back(a);
		lll[{a, b}] = lll[{b, a}] = i;
	}
	dfs(1);
	for (int i = 1; i <= n; i++) dp[0][i] = p[i];
	for (int j = 1; j <= 17; j++) {
		for (int i = 1; i <= n; i++) {
			dp[j][i] = dp[j - 1][dp[j - 1][i]];
		}
	}
	while (m--) {
		int x;
		cin >> x;
		vector <int> dd(x);
		for (auto &i : dd) cin >> i;
		sort(dd.begin(), dd.end(), [&] (int a, int b) {
			return in[a] < in[b];
		});
		for (int i = 1; i < (int)dd.size(); i++) {
			int x = lca(dd[i], dd[i - 1]);
			insert(dd[i], x, m);
			insert(dd[i - 1], x, m);
		}
	}
	dfs2(1, -1);
	cout << (int)kk.size() << '\n';
	for (auto &i : kk) {
		i = lll[{i, p[i]}];
	}
	sort(kk.begin(), kk.end());
	for (auto i : kk) cout << i << " ";
}

Compilation message (stderr)

railway.cpp: In function 'void dfs2(int, int)':
railway.cpp:57:23: warning: comparison of integer expressions of different signedness: 'std::map<int, int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   57 |  if (vals[pos].size() >= k) {
      |      ~~~~~~~~~~~~~~~~~^~~~
#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...