Submission #320678

#TimeUsernameProblemLanguageResultExecution timeMemory
320678phathnvMousetrap (CEOI17_mousetrap)C++11
100 / 100
3202 ms159652 KiB
#include <bits/stdc++.h>

#define mp make_pair
#define X first
#define Y second

using namespace std;

typedef long long ll;
typedef pair <int, int> ii;

const int N = 1e6 + 1;

int n, t, m;
vector <int> adj[N];

int dp[N], par[N], h[N], b[N];
bool inPath[N];
vector <ii> d;

void readInput(){
    scanf("%d %d %d", &n, &t, &m);
    for(int i = 1; i < n; i++){
        int u, v;
        scanf("%d %d", &u, &v);
        adj[u].push_back(v);
        adj[v].push_back(u);
    }
}

void dfs(int u, int p){
    for(int v : adj[u])
        if (v != p){
            par[v] = u;
            h[v] = h[u] + 1;
            dfs(v, u);
            inPath[u] |= inPath[v];
        }
}

void calcDp(int u, int p){
    if (inPath[u]){
        dp[u] = -1;
        for(int v : adj[u])
            if (v != p)
                calcDp(v, u);
        return;
    }

    dp[u] = 0;
    int nChild = 0, max1 = 0, max2 = 0;
    for(int v : adj[u])
        if (v != p && !inPath[v]){
            nChild++;
            calcDp(v, u);
            max2 = max(max2, dp[v]);
            if (max1 < max2)
                swap(max1, max2);
        }
    dp[u] = max2 + nChild;
}

void prepare(){
    inPath[m] = 1;
    dfs(t, -1);
    inPath[m] = 0;
    calcDp(t, -1);
    inPath[m] = 1;

    int u = -1, cnt = 0;
    for(int v : adj[t])
        if (v != par[t] && inPath[v])
            u = v;
    while (u != -1){
        for(int v : adj[u])
            if (v != par[u] && !inPath[v])
                cnt++;
        for(int v : adj[u])
            if (v != par[u] && !inPath[v])
                d.push_back(mp(h[m] - h[u] + 1, dp[v] + cnt));
        int nxt = -1;
        for(int v : adj[u])
            if (v != par[u] && inPath[v])
                nxt = v;
        u = nxt;
    }

    sort(d.begin(), d.end(), [](const ii &a, const ii &b){
            if (a.X != b.X)
                return a.X < b.X;
            return a.Y > b.Y;
         });
}

bool check(int x){
    int blocked = 0, cnt = 0, cur = 0;
    for(ii p : d){
        if (p.X != cur){
            blocked += cnt;
            cur = p.X;
            cnt = 0;
        }
        if (p.Y + blocked > x){
            if (blocked + cnt < min(x, p.X))
                cnt++;
            else
                return 0;
        }
    }
    return 1;
}

void solve(){
    cerr << "d: " << endl;
    for(ii p : d)
        cerr << p.X << ' ' << p.Y << endl;
    int l = 0, r = n - 1, res = -1;
    while (l <= r){
        int mid = (l + r) >> 1;
        if (check(mid)){
            res = mid;
            r = mid - 1;
        } else {
            l = mid + 1;
        }
    }

    printf("%d", res);
}

int main(){
    readInput();
    prepare();
    solve();
    return 0;
}

Compilation message (stderr)

mousetrap.cpp: In function 'void readInput()':
mousetrap.cpp:22:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   22 |     scanf("%d %d %d", &n, &t, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
mousetrap.cpp:25:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   25 |         scanf("%d %d", &u, &v);
      |         ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...