Submission #616917

#TimeUsernameProblemLanguageResultExecution timeMemory
616917nghiass001Mousetrap (CEOI17_mousetrap)C++17
100 / 100
1114 ms217292 KiB
#include <bits/stdc++.h>
#define FOR(i, l, r) for(int i=(l); i<=(r); ++i)
#define REP(i, l, r) for(int i=(l); i<(r); ++i)
#define FORD(i, r, l) for(int i=(r); i>=(l); --i)
#define REPD(i, r, l)  for(int i=(r)-1; i>=(l); --i)
using namespace std;
const int N = 1e6 + 5;
int n, trap, mouse, cstep[N], deg[N], sdeg[N], p[N], avail[N];
vector<int> S[N], Q[N];
 
void Enter() {
    cin >> n >> trap >> mouse;
    REP(i, 1, n) {
        int u, v;
        cin >> u >> v;
        S[u].push_back(v);
        S[v].push_back(u);
    }
}
 
void DFS(int u, int pa) {
    if (u == mouse) avail[u] = 1;
    p[u] = pa;
    for(int v : S[u]) if (v != pa) {
        DFS(v, u);
        if (avail[v]) avail[u] = 1;
        else {
            Q[u].push_back(v);
            ++deg[u];
        }
    }
    sort(Q[u].begin(), Q[u].end(), [] (int x, int y) { return cstep[x] > cstep[y]; });
    if (deg[u] <= 1) cstep[u] = deg[u];
    if (deg[u] > 1) cstep[u] = cstep[Q[u][1]] + deg[u];
}
 
void DFS2(int u) {
    cstep[u] += sdeg[u];
    for(int v : S[u]) if (v != p[u]) {
        sdeg[v] = deg[u] + sdeg[u];
        DFS2(v);
    }
}
 
bool check(int x) {
    int sl = 0, timer = 0;
    for(int i = mouse; i != trap; i = p[i]) {
        ++timer;
        int c_now = 0;
        for(int v : Q[i]) if (cstep[v] + sl - c_now > x) ++sl, ++c_now;
        if (sl > timer || sl > x) return false;
    }
    return true;
}
 
void Process() {
    DFS(trap, 0);
    deg[trap] = 0;
    DFS2(trap);
    int l = 0, r = n, mid;
    while (l < r) {
        mid = (l + r) / 2;
        if (check(mid)) r = mid;
        else l = mid + 1;
    }
    cout << l;
}
 
int main()
{
    #define file "mousetrap"
    if (fopen(file".inp", "r")) {
        freopen(file".inp", "r", stdin);
        freopen(file".out", "w", stdout);
    }
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    Enter();
    Process();
}

Compilation message (stderr)

mousetrap.cpp: In function 'int main()':
mousetrap.cpp:73:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |         freopen(file".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
mousetrap.cpp:74:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   74 |         freopen(file".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...