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;
}

浙公网安备 33010602011771号