TLE 求助
查看原帖
TLE 求助
487120
Domyoji_Haruto楼主2023/5/12 17:46

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;
}
2023/5/12 17:46
加载中...