답안 #597076

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
597076 2022-07-15T13:15:57 Z OttoTheDino Mousetrap (CEOI17_mousetrap) C++17
25 / 100
599 ms 56200 KB
#include <bits/stdc++.h>
using namespace std;
 
#define rep(i,s,e)                  for (int i = s; i <= e; ++i)
#define rrep(i,s,e)                 for (int i = s; i >= e; --i)
#define pb                          push_back
#define all(a)                      a.begin(), a.end()
#define len(a)                      (int)a.size()
typedef vector<int> vi;
 
const int mx = 1e6;
vi adj[mx+1], road;
int n, t, m;
 
bool dfs (int u, int p) {
    if (u==t) return 1;
    for (int v : adj[u]) {
        if (v==p) continue;
        if (dfs (v, u)) {
            road.pb(u);
            return 1;
        }
    }
    return 0;
}
 
int dfs2 (int u, int p) {
    if (len(adj[u])<=2) return len(adj[u])-1;
 
    vi nxt;
    for (int v : adj[u]) {
        if (v==p) continue;
        nxt.pb(dfs2 (v, u));
    }
 
    sort(all(nxt),greater<int>());
 
    return nxt[1]+len(adj[u])-1;
}
 
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
 
    cin >> n >> t >> m;
 
    rep (i,1,n-1) {
        int u, v; cin >> u >> v;
        adj[u].pb(v);
        adj[v].pb(u);
    }
 
    dfs (m,-1);
 
    int l = len(road), s = 0, lo = 0, hi = mx;
    vi dp[l];
 
    reverse(all(road));
    road.pb(t);
 
    rrep (i,l-1,0) {
        s += max(len(adj[road[i]])-3+(i==0),0);
        for (int v : adj[road[i]]) {
            if ((i>0 && v==road[i-1]) || v==road[i+1]) continue;
            dp[i].pb(dfs2(v,road[i])+s+1);
        }
        sort(all(dp[i]), greater<int>());
    }
    
    while (lo<hi) {
        int mid = (lo+hi)/2, x = 0, suc = 1, cnt = 0;
        rep (i,0,l-1) {
            x++;
            int nc = cnt;
            for (int j : dp[i]) {
                if (j+cnt>mid) {
                    x--;
                    nc++;
                }
            }
            suc &= (x>=0);
            cnt = nc;
        }
        if (suc && cnt<=mid) hi = mid;
        else lo = mid+1;
    }
 
    cout << lo << "\n";
 
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 23764 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 297 ms 55100 KB Output is correct
2 Correct 260 ms 51976 KB Output is correct
3 Correct 599 ms 56200 KB Output is correct
4 Correct 256 ms 39992 KB Output is correct
5 Correct 589 ms 56124 KB Output is correct
6 Correct 582 ms 56188 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 23764 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 23764 KB Output isn't correct
2 Halted 0 ms 0 KB -