2025CSP-S模拟赛42 比赛总结

2025CSP-S模拟赛42

T1 T2 T3 T4
100 AC 40 RE 0 WA 0 TLE

总分:40;排名:13/20。

T1 签,T2 是暴力,后面不会。

T1 追逐游戏

签到题,随意做。

#include <bits/stdc++.h>
#define il inline

using namespace std;

const int bufsz = 1 << 20;
char ibuf[bufsz], *p1 = ibuf, *p2 = ibuf;
#define getchar() (p1 == p2 && (p2 = (p1 = ibuf) + fread(ibuf, 1, bufsz, stdin), p1 == p2) ? EOF : *p1++)
il int read() {
	int x = 0; char ch = getchar(); bool t = 0;
	while (ch < '0' || ch > '9') {t ^= ch == '-'; ch = getchar();}
	while (ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar();}
	return t ? -x : x;
}
bool Beg;
const int N = 2e5 + 10;
int n, qq;
vector<int> G[N];
int fa[N][22], dep[N];
il void dfs(int x, int father) {
	fa[x][0] = father;
	dep[x] = dep[father] + 1;
	for (int i = 1; i <= 19; i++) {
		fa[x][i] = fa[fa[x][i - 1]][i - 1];
	}
	for (int y : G[x]) {
		if (y == father) continue;
		dfs(y, x);
	}
}
il int getlca(int x, int y) {
	if (dep[x] < dep[y]) swap(x, y);
	for (int i = 19; i >= 0; i--) {
		if (dep[fa[x][i]] >= dep[y]) x = fa[x][i];
	}
	if (x == y) return x;
	for (int i = 19; i >= 0; i--) {
		if (fa[x][i] != fa[y][i]) {
			x = fa[x][i], y = fa[y][i];
		}
	}
	return fa[x][0];
}
il int getdis(int x, int y) {
	return dep[x] + dep[y] - 2 * dep[getlca(x, y)];
}
il int kfa(int x, int k) {
	for (int i = 0; i <= 19; i++) {
		if ((k >> i) & 1) x = fa[x][i];
	}
	return x;
}
bool End;
il void Used() { cerr << "Use: " << (&Beg - &End) / 1024.0 / 1024.0 << "MB " << (double)clock() * 1000.0 / CLOCKS_PER_SEC << "ms\n";}
int main() {
	freopen("chase.in", "r", stdin);
	freopen("chase.out", "w", stdout);
	n = read(), qq = read();
	for (int i = 1; i < n; i++) {
		int x = read(), y = read();
		G[x].push_back(y);
		G[y].push_back(x);
	}
	dfs(1, 0);
	while (qq--) {
		int s = read(), t = read(), u = read();
		int l = getlca(s, t);
		int p = getlca(l, u);
		if (p == l) {
			p = getlca(u, s);
			if (p == l) {
				p = getlca(u, t);
			}
		} else {
			p = l;
		}
		int len1 = getdis(s, p), len2 = getdis(u, p);
		if (len1 < len2) {
			printf("%d %d\n", getdis(u, t), t);
		} else {
			int lca = getlca(s, u);
			int len = (len1 + len2) / 2;
			if (len <= getdis(u, lca)) {
				int met = kfa(u, len);
				printf("%d %d\n", getdis(met, s), met);
			} else {
				int met = kfa(s, len1 + len2 - len);
				printf("%d %d\n", getdis(met, s), met);
			}
		}
	}
	Used();
	
	return 0;
}

T2 统计

T3 软件工程

T4 命运的X

posted @ 2025-08-26 14:17  Zctf1088  阅读(42)  评论(0)    收藏  举报