Submission #1199429

#TimeUsernameProblemLanguageResultExecution timeMemory
1199429ChuanChenRailway (BOI17_railway)C++20
100 / 100
64 ms22408 KiB
#include<bits/stdc++.h>
using namespace std;

const int MAXN = 1e5+5, MAXK = 18;
typedef pair<int, int> pii;

int n, m, threshold;

/////////////////
vector<pii> adj[MAXN];
int pre[MAXN], pos[MAXN], dp[MAXN][MAXK], prof[MAXN], tempo, p_edge[MAXN];
void dfs(int no, int anc){
	pre[no] = ++tempo;
	prof[no] = prof[anc]+1;
	dp[no][0] = anc;
	for(int k = 1; k < MAXK; k++)
		dp[no][k] = dp[dp[no][k-1]][k-1];
	for(auto &[v, id] : adj[no]) if(pre[v] == 0){
		p_edge[v] = id;
		dfs(v, no);
	}
	pos[no] = tempo;
}

int lca(int a, int b){
	if(prof[a] < prof[b]) swap(a, b);
	int d = prof[a]-prof[b];
	for(int k = 0; k < MAXK; k++) if((1<<k)&d)a = dp[a][k];
	if(b == a) return b;

	for(int k = MAXK-1; k >= 0; k--){
		if(dp[a][k] != dp[b][k]){
			a = dp[a][k];
			b = dp[b][k];
		}
	}
	return dp[a][0];
}
/////////////////
bool cmp(int a, int b){
	return pre[a] < pre[b];
}
/////////////////
int bit[MAXN];
void update(int i, int val){
	for(; i <= n; i += (-i)&i) bit[i] += val;
}
int query(int l, int r){
	int ans = 0;
	for(;r > 0; r -= (-r)&r) ans += bit[r];
	for(l--; l > 0; l -= (-l)&l) ans -= bit[l];
	return ans;
}
/////////////////
int main(){
    cin.tie(0)->sync_with_stdio(0);
	cin >> n >> m >> threshold;

	for(int i = 1; i < n; i++){
		int a, b; cin >> a >> b;
		adj[a].push_back({b, i});
		adj[b].push_back({a, i});
	} 
	dfs(1, 1);
	while(m--){
		int s; cin >> s;
		vector<int> nb(s);
		for(int &v : nb) cin >> v;
		sort(nb.begin(), nb.end(), cmp);
		for(int i = 0; i < s; i++){
			int a = nb[i], b = nb[(i+1)%s];
			update(pre[a], 1);
			update(pre[b], 1);
			update(pre[lca(a, b)], -2);
		}
	}
	vector<int> ans;
	for(int i = 2; i <= n; i++)
		if(query(pre[i], pos[i]) >= 2*threshold)
			ans.push_back(p_edge[i]);
	sort(ans.begin(), ans.end());
	cout << ans.size() << '\n';
	for(int a : ans) cout << a << ' ';
	cout << "\n";
}
#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...