Submission #541796

#TimeUsernameProblemLanguageResultExecution timeMemory
541796adespawnMousetrap (CEOI17_mousetrap)C++14
100 / 100
1831 ms288512 KiB
#include <bits/stdc++.h> using namespace std; vector<int> sc[1000006]; bool isS[1000006]; int n, m, k; int solve(int w, int f, int a = 1) { priority_queue<int> k; if (w == m) return 0; for (auto i : sc[w]) { if (i == f || isS[i]) continue; k.push(solve(i, w)); } while (k.size() < a + 1) k.push(0); for (int i = 0; (i < a) && (k.size() > 1); i++) k.pop(); return sc[w].size() - 1 + k.top(); } int nw; vector<vector<int>> v; vector<int> sp; int dfs(int w, int f = 0, int g = 1, int z = 0) { if (w == m) { v.push_back(sp); sp.push_back(0); return 1; } for (auto i : sc[w]) { if (i == f) continue; int x = dfs(i, w, g + 1, z + sc[w].size() - 2 + (f == 0)); if (x == 0) continue; isS[i] = 1; vector<int> tv; for (auto j : sc[w]) { if (j == f || i == j) continue; tv.push_back(solve(j, w) + 1); } tv.push_back(0); sort(tv.begin(), tv.end()); reverse(tv.begin(), tv.end()); int z = sp.back() + tv.size() - 1; sp.push_back(z); v.push_back(tv); return 1; } return 0; } int illR; unordered_map<long long, int> mp; int solve2(int w, int a, int miip = 0) { if (w == 0) return 0; int mnw = 100000000; long long k = (long long)w + (long long)a * (long long)1000000 + (long long)miip * (long long)1000000000000; if (mp[k] != 0) return mp[k]; int csp = 0; for (int i = min(a + 1, (int)v[w].size()) - 1; i >= 0; i--) { csp = v[w][i] + sp[w - 1] + max((int)(v[w].size() - i - 2), 0) + i; int cll = solve2(w - 1, a - i + 1, max(miip - i, csp - i)); mnw = min(max(csp - i, cll) + i, mnw); if (mnw < miip) break; } if (mnw == 100000000) mnw = 0; mp[k] = mnw; return mnw; } int main() { ios_base::sync_with_stdio(0); cin >> n >> m >> k; for (int i = 1; i < n; i++) { int a, b; cin >> a >> b; sc[a].push_back(b); sc[b].push_back(a); } dfs(k); for (int i = 1; i <= n; i++) sc[i].clear(); cout << solve2(sp.size() - 1, 1); }

Compilation message (stderr)

mousetrap.cpp: In function 'int solve(int, int, int)':
mousetrap.cpp:20:21: warning: comparison of integer expressions of different signedness: 'std::priority_queue<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   20 |     while (k.size() < a + 1)
      |            ~~~~~~~~~^~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...