This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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++;
}
}
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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |