#include "nile.h"
#include <algorithm>
#include <numeric>
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
int findp(vector<int>& par, int x) {
return par[x] == x ? x : par[x] = findp(par, par[x]);
}
vector<long long> calculate_costs(vector<int> w, vector<int> A, vector<int> B, vector<int> E) {
int n = A.size();
int q = E.size();
vector<int> par(n);
vector<int> sz(n, 1);
vector<ll> mn(n), sm(n);
for (int i = 0; i < n; i++) {
par[i] = i;
sm[i] = (ll)A[i] - B[i]; // saving for artifact i.
mn[i] = sm[i]; // for a singleton, the min saving equals its saving.
}
ll tre = 0;
for (int i = 0; i < n; i++) {
tre += A[i];
}
vector<int> ixsw(n);
iota(ixsw.begin(), ixsw.end(), 0);
sort(ixsw.begin(), ixsw.end(), [&w](int i, int j) {
return w[i] < w[j];
});
vector<pair<int,int>> queries(q);
for (int i = 0; i < q; i++) {
queries[i] = { E[i], i };
}
sort(queries.begin(), queries.end());
vector<pair<int,int>> edges;
for (int i = 0; i + 1 < n; i++) {
edges.push_back({ ixsw[i], ixsw[i+1] });
}
sort(edges.begin(), edges.end(), [&w](pair<int,int> p1, pair<int,int> p2) {
return abs(w[p1.first] - w[p1.second]) < abs(w[p2.first] - w[p2.second]);
});
vector<ll> rez(q);
int edgeIndex = 0;
for (int i = 0; i < q; i++) {
int d = queries[i].first;
int qIdx = queries[i].second;
while (edgeIndex < edges.size() &&
abs(w[edges[edgeIndex].first] - w[edges[edgeIndex].second]) <= d) {
int u = edges[edgeIndex].first;
int v = edges[edgeIndex].second;
int ru = findp(par, u);
int rv = findp(par, v);
if (ru == rv) {
edgeIndex++;
continue;
}
ll disc_ru = (sz[ru] % 2 == 1) ? (sm[ru] - mn[ru]) : sm[ru];
ll disc_rv = (sz[rv] % 2 == 1) ? (sm[rv] - mn[rv]) : sm[rv];
ll oldDiscount = disc_ru + disc_rv;
if (sz[ru] < sz[rv]) {
swap(ru, rv);
}
par[rv] = ru;
sz[ru] += sz[rv];
sm[ru] += sm[rv];
mn[ru] = min(mn[ru], mn[rv]);
ll newDiscount = (sz[ru] % 2 == 1) ? (sm[ru] - mn[ru]) : sm[ru];
tre -= (newDiscount - oldDiscount);
edgeIndex++;
}
rez[qIdx] = tre;
}
return rez;
}
# | 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... |