Submission #998748

#TimeUsernameProblemLanguageResultExecution timeMemory
998748mdn2002Closing Time (IOI23_closing)C++17
43 / 100
933 ms86100 KiB
/* Mayoeba Yabureru */ #include "closing.h" #include<bits/stdc++.h> using namespace std; int max_score(int n, int x, int y, long long k, vector<int> U, vector<int> V, vector<int> W) { x ++, y ++; vector dis(n + 1, vector<long long>(2)); vector<vector<pair<int, long long>>> gr(n + 1); for (int i = 0; i < n - 1; i ++) { int u = U[i] + 1, v = V[i] + 1, w = W[i]; gr[u].push_back({v, w}); gr[v].push_back({u, w}); } function<void(int, int, int)> dfs = [&] (int v, int p, int wt) { for (auto [u, w] : gr[v]) { if (u == p) continue; dis[u][wt] = dis[v][wt] + w; dfs(u, v, wt); } }; dfs(x, 0, 0), dfs(y, 0, 1); long long minstart = 0, min = 1e15; for (int i = 1; i <= n; i ++) { if (max(dis[i][0], dis[i][1]) < min) { minstart = i; min = max(dis[i][0], dis[i][1]); } } multiset<pair<long long, int>> ms; vector<int> did(n + 1); int ans = 0; function f = [&] { multiset<pair<long long, int>> s; for (int i = 1; i <= n; i ++) { if (did[i]) continue; s.insert({dis[i][0], i}); s.insert({dis[i][1], i}); } int cnt = 0; vector<int> v; function<void(int, int)> go = [&] (int xx, int p) { v.push_back(xx); if (xx == x) { for (auto u : v) { if (did[u] == 0) { did[u] = 1; k -= dis[u][0]; cnt ++; } } } if (xx == y) { for (auto u : v) { if (did[u] == 0) { did[u] = 1; k -= dis[u][1]; cnt ++; } } } for (auto [u, w] : gr[xx]) { if (u == p) continue; go(u, xx); } v.pop_back(); }; if (s.size() != 2 * n) go(minstart, 0); while (s.size()) { auto [x, y] = *s.begin(); s.erase(s.begin()); if (did[y]) continue; if (x > k) break; k -= x; did[y] = 1; cnt ++; } if (k >= 0) return cnt; return -100000000; }; long long kk = k; ans = f(); for (int i = 1; i <= n; i ++) did[i] = 0; int cnt = 0; k = kk; for (int i = 1; i <= n; i ++) ms.insert({max(dis[i][0], dis[i][1]), i}); while (ms.size()) { vector<int> odid = did; long long kk = k; ans = max(ans, cnt + f()); did = odid; k = kk; auto [x, y] = *ms.begin(); ms.erase(ms.begin()); if (x > k) break; k -= x; did[y] = 2; cnt += 2; } return ans; } /* 2 7 0 2 10 0 1 2 0 3 3 1 2 4 2 4 2 2 5 5 5 6 3 4 0 3 20 0 1 18 1 2 1 2 3 19 */

Compilation message (stderr)

closing.cpp: In lambda function:
closing.cpp:76:22: warning: comparison of integer expressions of different signedness: 'std::multiset<std::pair<long long int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   76 |         if (s.size() != 2 * n) go(minstart, 0);
      |             ~~~~~~~~~^~~~~~~~
#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...