Submission #1354094

#TimeUsernameProblemLanguageResultExecution timeMemory
1354094goulthenMousetrap (CEOI17_mousetrap)C++20
45 / 100
381 ms108292 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define rep(i,a,b) for (int i = a; i <= b; i++)
#define per(i,a,b) for (int i = a; i >= b; i--)
#define pii pair<int,int>
#define fi first
#define se second
#define endl '\n'
#define pb push_back
#define all(v) (v).begin(), (v).end()

const int MAXN = 1e6+10;
const int INF = 1e18+10;
const int MOD = 1e9+7;
vector<int> g[MAXN];
int dp[MAXN], par[MAXN], dep[MAXN], w[MAXN], tin[MAXN], tout[MAXN], tempo;

bool isch(int x, int y) { return tin[x] >= tin[y] && tout[x] <= tout[y]; }

void dfs(int u, int p = 0) {
    vector<int> ls={0};
    tin[u] = ++tempo;
    for(int &v : g[u])if(v!=p) {
        if(p!=0) w[v] = g[u].size()+w[u]-2;
        dep[v] = dep[u] + 1;
        dfs(v,u);
        ls.pb(dp[v]);
    }
    tout[u] = ++tempo;
    par[u] = p;
    sort(ls.rbegin(), ls.rend());
    if(ls.size()>1)dp[u] = ls[1]+ls.size()-1;
}

void solve() {
    int n,m,t; cin >> n >> t >> m;
    if(m==t) {
        cout << "0" << endl;
        return;
    }
    rep(i,1,n-1) {
        int u,v; cin >> u >> v;
        g[u].pb(v);
        g[v].pb(u);
    }
    dfs(t);
    rep(i,1,n) w[i] += dp[i];
    int lo = w[m], hi = 2*n, res = 2*n;

    vector<pii> side;
    rep(i,1,n) {
        if(isch(m,i) || par[i] == m || i == t || par[i] == t) continue;
        if(isch(m,par[i])) {
            side.pb({dep[m] - dep[par[i]], -w[i]});
        }
    }
    sort(all(side));

    while (lo <= hi) {
        int mid = (lo+hi)>>1;
        int lst = -1, cur = 0, cl=1, bl = 0;
        bool ok = 1;
        for(auto &[dist, w_] : side) {
            int W = -w_;
            if(dist!=lst) {
                lst = dist;
                cur += cl-1;
                cl=1;
                bl++;
            }

            if(W+cur-1 > mid) {
                if(bl==0) {
                    ok = 0;
                    break;
                }
                bl--;
                cl++;
            }
        }

        if(ok) {
            res = mid;
            hi = mid-1;
        } else {
            lo = mid+1;
        }
    }

    cout << res << endl;
}

int32_t main() {
    ios_base::sync_with_stdio(0);cin.tie(nullptr);
	int tt = 1;
    //cin >> tt;
    
    while(tt--) solve();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...