제출 #1096227

#제출 시각아이디문제언어결과실행 시간메모리
1096227win_23Railway (BOI17_railway)C++17
0 / 100
66 ms29516 KiB

#include <bits/stdc++.h>
using namespace std;

#define TASK "SUADUONG"
#define fi first
#define se second 
#define pb push_back
#define ll long long 
#define ii pair< int,int >
#define endl '\n'

const int INF = 1e9;
const ll LINF = 1e18;
const int N = 1e5 +5;


int n, m;
vector<int> adj[N + 5];
int up[N][20], h[N], f[N];
// up[u][i] là tổ tiên thứ 2^i của u 
int k;
int x[N], y[N];
namespace sub{
	void dfs(int u, int par)
	{
		for(auto v : adj[u])
		{
			if(v == par) continue;
			up[v][0] = u;

			h[v] = h[u] + 1;
			for(int i = 1; i <= 18; ++i)
			{
				up[v][i] = up[up[v][i - 1]][i - 1];
			}
			dfs(v, u);
		}
	}
	int lca(int u, int v){
		if(h[v] != h[u]) // làm cho 2 cái nút ni // ( h[u] = h[v])
		{
			if(h[u] < h[v]) swap(u , v);
			int k = h[u] - h[v]; // cần nhảy mấy bước
			for(int i = 0; (1 << i) <= k; i ++)
			{
				if(k >> i & 1)
				{
					u = up[u][i];
				}
			}
		}
		if(u == v) return u; //  khi này xét trường hợp u là tổ tiên của v
		int lg =  log2(h[u]);
		for(int i = lg ; i >= 0 ; i --)
		{
			if(up[u][0] != up[v][0])
			{
				u = up[u][i], v = up[v][i]; // timf 2 đỉnh xa nhất mà có h[u] != h[v]
			}
		}
		return up[u][0];// kq là tổ tiên của nó
	}
	void dfs2(int u, int par)
	{
		for(auto v : adj[u])
		{
			if(v == par) continue;
			dfs2(v, u);
			f[u] += f[v]; 
		}
	}
	void solve(){
		dfs(1 , 0);
		for(int i = 1; i <= m ; i++)
		{
			int u = 0, pre_u = 0, x;
			cin>>x;
			for(int i = 1; i <= x ; i++)
			{
				cin>>u;
				int cm = lca(u , pre_u);
				if(u == cm)
				{
					pre_u = u;
					f[u] --;
					continue;
				}
				f[u] ++, f[cm]--;
				pre_u = u;
			}

		}
		dfs2(1, 0);
		set<int>v;
		for(int i = 1; i < n ; i++)
		{
			if((f[x[i]] >= k and y[i] == up[x[i]][0]) or (f[y[i]] >= k and x[i] == up[y[i]][0]) )
			{
				v.insert(i);
			}
		}
		cout<<v.size()<<endl;
		for(auto x: v) cout<<x<<' ';
	}
}
int q;
signed main() {
    ios::sync_with_stdio(0);  
    cin.tie(0);
    //freopen(TASK".inp","r",stdin);
    //freopen(TASK".out","w",stdout);
    cin>>n>>m>>k;
    for(int i = 1; i < n ; i++)
    {
    	cin>>x[i]>>y[i];
    	adj[x[i]].pb(y[i]);
    	adj[y[i]].pb(x[i]);
    }

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