Submission #696645

#TimeUsernameProblemLanguageResultExecution timeMemory
696645vjudge1Torrent (COI16_torrent)C++17
100 / 100
423 ms28152 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef double db;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
#define fir first
#define sec second
typedef vector <int> vi;
typedef vector <ll> vl;
template <typename __Tp> void read(__Tp &x) {
    int f = 0; x = 0; char ch = getchar();
    for (; !isdigit(ch); ch = getchar()) if (ch == '-') f = 1;
    for (; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + (ch ^ 48);
    if (f) x = -x;
}
template <typename __Tp1, typename ...__Tp2> void read(__Tp1 &x, __Tp2 &...y) { read(x), read(y...); }
template <typename __Tp> void write(__Tp x) {
    if (x < 0) putchar('-'), x = -x;
    if (x > 9) write(x / 10);
    putchar(x % 10 + 48);
}
void write(char ch) { putchar(ch); }
template <typename __Tp1, typename ...__Tp2> void write(__Tp1 x, __Tp2 ...y) { write(x), write(y...); }

const int maxn = 3e5 + 10;
int n, s, t;
vi e[maxn];

int vis[maxn], a[maxn], tot;
int dfs(int u) {
    vis[u] = 1, a[++tot] = u;
    if (u == t) return 1;
    for (int v : e[u]) if (!vis[v] && dfs(v)) return 1;
    vis[u] = 0, --tot;
    return 0;
}

int f[maxn];
void dfs2(int u) {
    vis[u] = 1; vi vec;
    for (int v : e[u]) if (!vis[v]) dfs2(v), vec.push_back(f[v]);
    sort(begin(vec), end(vec), greater <int> ());
    f[u] = 0;
    for (int i = 1; i <= (int) vec.size(); ++i) f[u] = max(f[u], vec[i - 1] + i);
}
pii query(int x) {
    fill(vis, vis + n + 1, 0);
    vis[a[x + 1]] = 1, dfs2(s);
    vis[a[x + 1]] = 0, dfs2(t);
    return pii(f[s], f[t]);
}
int ask(int x) {
    if (x >= tot) return 1e9;
    pii p = query(x);
    return max(p.fir, p.sec);
}

int main() {
    read(n, s, t);
    for (int i = 1; i < n; ++i) {
        int u, v; read(u, v);
        e[u].push_back(v), e[v].push_back(u);
    }
    dfs(s);
    int l = 1, r = tot - 1, mid, res = 1;
    while (l <= r) {
        mid = (l + r) >> 1;
        pii p = query(mid);
        if (p.fir <= p.sec) res = mid, l = mid + 1;
        else r = mid - 1;
    }
    write(min(ask(res), ask(res + 1)), '\n');
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...