Submission #47084

#TimeUsernameProblemLanguageResultExecution timeMemory
47084qoo2p5Mousetrap (CEOI17_mousetrap)C++17
100 / 100
1190 ms230704 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; const int INF = (int) 1e9 + 1e6; const ll LINF = (ll) 1e18 + 1e9; const ll MOD = (ll) 1e9 + 7; #define sz(x) (int) (x).size() #define mp(x, y) make_pair(x, y) #define pb push_back #define all(x) (x).begin(), (x).end() #define lb(s, t, x) (int) (lower_bound(s, t, x) - s) #define ub(s, t, x) (int) (upper_bound(s, t, x) - s) #define rep(i, f, t) for (auto i = f; i < t; ++(i)) #define per(i, f, t) for (auto i = (f); i >= (t); --(i)) ll power(ll x, ll y, ll mod = MOD) { if (y == 0) { return 1; } if (y & 1) { return power(x, y - 1, mod) * x % mod; } else { ll tmp = power(x, y / 2, mod); return tmp * tmp % mod; } } template<typename A, typename B> bool mini(A &x, const B &y) { if (y < x) { x = y; return true; } return false; } template<typename A, typename B> bool maxi(A &x, const B &y) { if (x < y) { x = y; return true; } return false; } void add(ll &x, ll y) { x += y; if (x >= MOD) x -= MOD; if (x < 0) x += MOD; } void run(); #define TASK "" int main() { #ifdef LOCAL if (strlen(TASK) > 0) { cerr << "Reminder: you are using file i/o, filename: " TASK "!" << endl << endl; } #endif #ifndef LOCAL if (strlen(TASK)) { freopen(TASK ".in", "r", stdin); freopen(TASK ".out", "w", stdout); } ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); #endif cout << fixed << setprecision(12); run(); return 0; } // == SOLUTION == // const int N = (int) 1e6 + 123; int n, t, m; vector<int> g[N]; int p[N]; int cost[N]; int up[N]; void calc(int v, int p = -1) { ::p[v] = p; int ptr = 0; int pos = -1; for (int u : g[v]) { if (u == p) { pos = ptr; continue; } up[u] = up[v]; if (v != t) { up[u] += sz(g[v]) - 2; } calc(u, v); ptr++; } if (pos != -1) { g[v].erase(g[v].begin() + pos); } if (sz(g[v]) == 0) { cost[v] = 0; } else if (sz(g[v]) == 1) { cost[v] = 1; } else { vector<int> q; for (int u : g[v]) { q.push_back(cost[u]); } sort(all(q)); cost[v] = sz(g[v]) + q[sz(q) - 2]; } } void run() { cin >> n >> t >> m; rep(i, 0, n - 1) { int u, v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } calc(t); vector<pair<int, int>> wow; int prv = -1; int w = m; int dist = 0; while (w != t) { for (int u : g[w]) { if (u == prv) { continue; } wow.pb({dist + 1, cost[u] + up[u] + (dist == 0)}); } prv = w; w = p[w]; dist++; } sort(all(wow)); int left = -1; int right = n; while (right - left > 1) { int mid = (left + right) / 2; bool ok = 1; int cnt = 0; rep(i, 0, sz(wow)) { int j = i; while (j + 1 < sz(wow) && wow[j + 1].first == wow[j].first) { j++; } int ncnt = cnt; rep(k, i, j + 1) { auto it = wow[k]; if (it.second + cnt <= mid) { continue; } if (ncnt >= it.first) { ok = 0; break; } ncnt++; } cnt = ncnt; i = j; } ok &= (cnt <= mid); if (ok) { right = mid; } else { left = mid; } } cout << right << "\n"; }

Compilation message (stderr)

mousetrap.cpp: In function 'int main()':
mousetrap.cpp:67:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(TASK ".in", "r", stdin);
         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
mousetrap.cpp:68:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)', declared with attribute warn_unused_result [-Wunused-result]
         freopen(TASK ".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...