#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define chmin(a, b) a = min(a, b)
#define chmax(a, b) a = max(a, b)
#define pb push_back
#define ALL(a) a.begin(), a.end()
const ll INF = 1ll << 30;
std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) {
int N = W.size();
int Q = E.size();
vector<int> ord(N);
iota(ALL(ord), 0);
sort(ALL(ord), [&](int i, int j) {
return W[i]<W[j];
});
auto f = [&](pair<int, int> a) {
auto [i, j] = a;
return W[ord[j]]-W[ord[i]];
};
vector<pair<int, int>> edges;
for (int i=0; i+1 < N; i++) edges.emplace_back(i, i+1);
for (int i=0; i+2 < N; i++) edges.emplace_back(i, i+2);
sort(ALL(edges), [&](auto a, auto b) {
if (f(a)==f(b)) return a.second-a.first < b.second-b.first;
else return f(a)<f(b);
});
vector<int> qry(Q);
iota(ALL(qry), 0);
sort(ALL(qry), [&](int i, int j) {
return E[i]<E[j];
});
ll sum_res = accumulate(ALL(A), 0ll);
vector<int> par(N), sz(N);
vector<ll> sum(N);
vector<array<ll, 2>> diff(N), esp(N);
vector<ll> res(N);
for (int i=0; i<N; i++) {
par[i]=i;
sz[i]=1;
sum[i] = B[ord[i]];
diff[i] = {A[ord[i]]-B[ord[i]], INF};
esp[i] = {INF, INF};
res[i] = A[ord[i]];
}
auto find = [&](auto self, int v) -> int {
return par[v]==v ? v : par[v] = self(self, par[v]);
};
auto merge = [&](int ii, int jj) -> void {
int i = find(find, ii);
int j = find(find, jj);
if (i != j) {
assert(i<j);
assert(jj-ii == 1);
sum_res -= res[i];
sum_res -= res[j];
par[j] = i;
sz[i] += sz[j];
sum[i] += sum[j];
{
int t = (i%2 != j%2);
chmin(diff[i][0], diff[j][0^t]);
chmin(diff[i][1], diff[j][1^t]);
chmin(esp[i][0], esp[j][0^t]);
chmin(esp[i][1], esp[j][1^t]);
}
res[i] = sum[i] + min(diff[i][0], esp[i][1]);
if (sz[i]%2 == 0) res[i] = sum[i];
sum_res += res[i];
}
else {
assert(jj-ii == 2);
sum_res -= res[i];
int k = ii+1;
int t = (i%2 != k%2);
chmin(esp[i][t], 0ll + A[ord[k]]-B[ord[k]]);
res[i] = sum[i] + min(diff[i][0], esp[i][1]);
if (sz[i]%2 == 0) res[i] = sum[i];
sum_res += res[i];
}
};
auto cur = edges.begin();
vector<ll> ans(Q);
for (int id : qry) {
while (cur != edges.end() && f(*cur) <= E[id]) {
merge(cur->first, cur->second);
cur++;
}
ans[id] = sum_res;
}
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... |