Submission #856607

#TimeUsernameProblemLanguageResultExecution timeMemory
856607vjudge1Untitled (POI11_dyn)C++17
30 / 100
433 ms21964 KiB
#include <iostream> #include <vector> #include <algorithm> #include <deque> #include <set> #include <utility> #include <numeric> #include <array> #include <cstring> using namespace std; #define ALL(x) x.begin(), x.end() using ll = long long; #define N 300050 int n, m, d[N], f[N], h[N]; vector<int> g[N], dfn; vector<int> rev_dfn(int src) { vector<int> st = {src}, V(n); for (int i = 0; i < n; ++i) { auto u = st.back(); st.pop_back(); V[i] = u; for (auto v : g[u]) { g[v].erase(find(ALL(g[v]), u)); st.push_back(v); } } reverse(ALL(V)); return V; } int ok(int y) { memset(f, -1, sizeof f); memset(h, 63, sizeof h); int k = m; for (auto u : dfn) { for (auto v : g[u]) { if (f[v] != -1) f[u] = max(f[u], f[v] + 1); h[u] = min(h[u], h[v] + 1); } if (f[u] == -1 && d[u]) f[u] = 0; if (f[u] == y) { if (!k--) return 0; f[u] = -1; h[u] = 0; } else if (f[u] + h[u] <= y) f[u] = -1; } return k || f[0] == -1; } int main() { cin.tie(nullptr)->sync_with_stdio(false); scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) scanf("%d", d+i); if (accumulate(d, d+n+1, 0) <= m) return 0 * puts("0"); for (int u, v, i = 1; i < n; ++i) scanf("%d%d", &u, &v), g[u].push_back(v), g[v].push_back(u); dfn = rev_dfn(1); int l = 1, r = 2*n-1, z = -1; while (l < r) { int y = (l+r)/2; ok(y) ? r = y : l = y + 1; } printf("%d", l); return 0; }

Compilation message (stderr)

dyn.cpp: In function 'int main()':
dyn.cpp:71:27: warning: unused variable 'z' [-Wunused-variable]
   71 |     int l = 1, r = 2*n-1, z = -1;
      |                           ^
dyn.cpp:64:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   64 |     scanf("%d%d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~
dyn.cpp:65:39: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   65 |     for (int i = 1; i <= n; ++i) scanf("%d", d+i);
      |                                  ~~~~~^~~~~~~~~~~
dyn.cpp:68:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |         scanf("%d%d", &u, &v), g[u].push_back(v), g[v].push_back(u);
      |         ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...