比赛 2026郑轻校赛 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 保卫萝卜 最终得分 100
用户昵称 xuyuqing 运行时间 4.027 s
代码语言 C++ 内存使用 38.16 MiB
提交时间 2026-04-07 19:59:30
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

const int N = 233233;
const int Log = 20;

int n;
int m;
vector<int> graph[N];
vector<int> another[N];
vector<int> tree[N];
int pre[Log][N];
int in[N];
int dep[N];
vector<int> topos;
int que;

int lca (int u, int v) {
	if (dep[u] < dep[v]) {
		swap (u, v);
	}
	
	for (int i = Log - 1; i >= 0; i--) {
		if (dep[pre[i][u]] >= dep[v]) {
			u = pre[i][u];
		}
	}
	
	if (u == v) {
		return u;
	}
	
	for (int i = Log - 1; i >= 0; i--) {
		if (pre[i][u] != pre[i][v]) {
			u = pre[i][u];
			v = pre[i][v];
		}
	}
	
	return pre[0][u];
}

int main () {
	
	freopen ("carrot.in", "r", stdin);
	freopen ("carrot.out", "w", stdout);
	
	cin >> n >> m;
	for (int i = 1; i <= m; i++) {
		int u, v;
		cin >> u >> v;
		graph[u].push_back(v);
		another[v].push_back(u);
		in[v]++;
	}
	
	queue<int> q;
	q.push(1);
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		topos.push_back(u);
		for (auto v : graph[u]) {
			in[v]--;
			if (!in[v]) {
				q.push(v);
			}
		}
	}
	
	for (int i = 1; i <= n; i++) {
		for (int j = 0; j < Log; j++) {
			pre[j][i] = 1;
		}
	}
	for (auto u : topos) {
		if (another[u].size()) {
			int v = another[u][0];
			for (int i = 1; i < another[u].size(); i++) {
				v = lca (v, another[u][i]);
			}
			tree[v].push_back(u);
			dep[u] = dep[v] + 1;
			pre[0][u] = v;
			for (int i = 1; i < Log; i++) {
				pre[i][u] = pre[i - 1][pre[i - 1][u]];
			}
		}
	}
	
	cin >> que;
	for (int i = 1; i <= que; i++) {
		int k;
		vector<int> nums;
		cin >> k;
		for (int j = 1; j <= k; j++) {
			int u;
			cin >> u;
			nums.push_back(u);
		}
		int now = nums[0];
		for (int j = 1; j < nums.size(); j++) {
			now = lca (now, nums[j]);
		}
		int maxn = now;
		while (true) {
			now = pre[0][now];
			maxn = max (maxn, now);
			if (now == 1) {
				break;
			}
		}
		cout << maxn << endl;
	}
		
	return 0;
}