Submission #378269

#TimeUsernameProblemLanguageResultExecution timeMemory
378269negar_aRailway (BOI17_railway)C++14
100 / 100
307 ms45460 KiB
//!yrt tsuj uoy srettam gnihton no emoc
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
#define pb push_back
#define mp make_pair
#define pii pair <int, int>
#define fast_io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define F first
#define S second

const int maxn = 1e5 + 5, lg = 19;
vector <pii> adj[maxn];
vector <int> del[maxn];
vector <int> ans;
set <int> st[maxn];

int par[maxn][lg + 5], h[maxn];
int n, m, k;

void dfs(int v){
	for(auto x : adj[v]){
		int u = x.F;
		if(u != par[v][0]){
			h[u] = h[v] + 1;
			par[u][0] = v;
			for(int i = 1; i < lg; i ++){
				par[u][i] = par[par[u][i - 1]][i - 1];
			}
			dfs(u);
		}
	}
}

int get_par(int x, int p){
	for(int i = 0; i < lg; i ++){
		if(p & (1 << i)){
			x = par[x][i];
		}
	}
	return x;
}

int lca(int x, int y){
	if(h[x] < h[y]){
		swap(x, y);
	}
	x = get_par(x, h[x] - h[y]);
	for(int i = lg; i >= 0; i --){
		if(par[x][i] != par[y][i]){
			x = par[x][i];
			y = par[y][i];
		}
	}
	if(x == y)
		return x;
	return par[x][0];
}

inline void merge(int u, int v){
	if(st[u].size() < st[v].size()){
		swap(st[u], st[v]);
	}
	for(int x : st[v]){
		st[u].insert(x);
	}
}

void sfd(int v){
	for(auto u : adj[v]){
		if(u.F != par[v][0]){
			sfd(u.F);
			if(st[u.F].size() >= k){
				ans.pb(u.S + 1);
			}
			merge(v, u.F);
		}
	}
	for(int x : del[v]){
		st[v].erase(x);
	}
}

int main(){
	fast_io;
	
	cin >> n >> m >> k;
	for(int i = 0; i < n - 1; i ++){
		int x, y;
		cin >> x >> y;
		x --; y --;
		adj[x].pb({y, i});
		adj[y].pb({x, i});
	}
	dfs(0);
	for(int i = 0; i < m; i ++){
		int s;
		cin >> s;
		int x; cin >> x; x --;
		st[x].insert(i);
		int lc = x;
		for(int j = 0; j < s - 1; j ++){
			cin >> x;
			x --;
			lc = lca(lc, x);
			st[x].insert(i);
		}
		del[lc].pb(i);
	}
	sfd(0);
	
	cout << ans.size() << endl;
	sort(ans.begin(), ans.end());
	for(int u : ans){
		cout << u << " ";
	}
	
	return 0;
}

Compilation message (stderr)

railway.cpp: In function 'void sfd(int)':
railway.cpp:75:22: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   75 |    if(st[u.F].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...