TLE on #21,求调啊qwq
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 2e5 + 5;
int n, fa[N][20], d[N], l, r, dep[N], ld[N], pld[N];
vector <int> G[N];
bool cvis[N], vis[N];
int LCA(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];
}
void dfs(int u, int ff) {
for (int v : G[u]) {
if(v == ff) continue;
fa[v][0] = u, dep[v] = dep[u] + 1;
dfs(v, u);
}
return ;
}
void df5(int u, int ff) { //由于 df5 求直径端点的时候起点不一定为 1,所以不能直接拿以 1 为根时的 fa 来判
for (int v : G[u]) {
if(v == ff) continue;
d[v] = d[u] + 1;
if(d[v] > d[l]) l = v;
df5(v, u);
}
return ;
}
void df3(int u, int ff) {
vis[u] = 1, pld[u] = u;
for (int v : G[u]) {
if(v == ff) continue;
df3(v, u);
if(!cvis[v] && ld[v] + 1 > ld[u]) {
ld[u] = ld[v] + 1;
pld[u] = pld[v];
}
}
return ;
}
int main() {
scanf("%d", &n);
for (int i = 1; i < n; ++i) {
int x, y; scanf("%d%d", &x, &y);
G[x].emplace_back(y), G[y].emplace_back(x);
}
dfs(1, 0);
df5(1, 0);
r = l, d[l] = 0;
df5(r, 0);
int dd = LCA(l, r);
int cur = l;
while(cur != dd) {
cvis[cur] = 1;
int ruc = fa[cur][0];
cur = ruc;
}
cur = r;
while(cur != dd) {
cvis[cur] = 1;
int ruc = fa[cur][0];
cur = ruc;
}
cvis[dd] = 1;
for (int i = 1; i <= n; ++i) {
if(!vis[i]) df3(i, 0);
}
int ans = 0, qwq = n + 2, pans, pqwq;
for (int i = 1; i <= n; ++i) {
if(cvis[i]) {
if(ld[i] >= ans) {
ans = ld[i];
pans = pld[i];
}
if(dep[i] <= qwq) {
qwq = dep[i];
pqwq = 1;
}
}
}
if(ans > qwq) {
printf("%d\n%d %d %d\n", d[l] + ans, l, r, pans);
}
else {
printf("%d\n%d %d %d\n", d[l] + qwq, l, r, pqwq);
}
return 0;
}