Submission #1037948

#TimeUsernameProblemLanguageResultExecution timeMemory
1037948erray봉쇄 시간 (IOI23_closing)C++17
83 / 100
1083 ms33812 KiB
#include "closing.h" #include <vector> #include <bits/stdc++.h> using namespace std; #ifdef DEBUG #include "/home/ioi/egoi2024/d2/debug.h" #else #define debug(...) void(37) #endif template<typename T> using min_pq = priority_queue<T, vector<T>, greater<T>>; int max_score(int N, int X, int Y, long long K, std::vector<int> U, std::vector<int> V, std::vector<int> W) { vector<vector<array<int, 2>>> g(N); for (int i = 0; i < N - 1; ++i) { g[U[i]].push_back({V[i], W[i]}); g[V[i]].push_back({U[i], W[i]}); } constexpr int64_t inf = int64_t(1E16); auto Sp = [&](int source) { vector<int64_t> dist(N, inf); min_pq<pair<int64_t, int>> pq; auto Add = [&](int v, int64_t d) { if (dist[v] > d) { dist[v] = d; pq.emplace(d, v); } }; Add(source, 0); while (!pq.empty()) { auto[d, v] = pq.top(); pq.pop(); if (dist[v] < d) continue; for (auto[u, w] : g[v]) { Add(u, d + w); } } return dist; }; auto dx = Sp(X); auto dy = Sp(Y); int ans = 0; { //disjoint case auto all = dx; all.insert(all.end(), dy.begin(), dy.end()); sort(all.begin(), all.end()); int64_t tot = 0; for (auto x : all) { tot += x; if (tot <= K) ans++; } } if (dx[Y] > 2 * K) return ans; debug(ans); map<int64_t, vector<int64_t>> groups; for (int i = 0; i < N; ++i) { groups[dx[i] - dy[i]].push_back(min(dx[i], dy[i])); } debug(groups); int64_t start_cost = 0, chain_s = 0; for (auto&[x, v] : groups) { sort(v.begin(), v.end()); chain_s++; start_cost += v[0]; } vector<int64_t> best(1, 0); for (auto[x, v] : groups) { int64_t diff = abs(x); int s = int(v.size()); int bs = int(best.size()); auto new_best = best; new_best.resize(bs + 2 * s, inf); int seconds = 0, p = 0; int64_t cost = 0; debug(x, v); for (int t = 1; t <= 2 * s; ++t) { if (t == 1) { seconds++; p++; } else if (p == s || (seconds > 0 && v[p] > diff)) { seconds--; cost += diff; } else { cost += v[p++]; seconds++; } debug(t, cost); for (int i = 0; i < bs; ++i) { new_best[i + t] = min(new_best[i + t], best[i] + cost); } } swap(best, new_best); } debug(best, start_cost); for (int i = 0; i < int(best.size()); ++i) { if (best[i] + start_cost <= K) { ans = max(ans, i); } } return ans; }
#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...