#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define ll long long
#define pb push_back
#define all(x) x.begin(), x.end()
const int mxN = 1e5 + 1000;
const ll INF = 2e18;
ll parent[mxN], sz[mxN], bsum[mxN], c1[mxN], c2[mxN], c3[mxN], c[mxN], mn[mxN]; // c1 even
vector<vector<int>> nvec;
vector<pair<int, int>> qry;
vector<pair<ll, pair<bool, int>>> diff;
int find_par(int u)
{
if (parent[u] == u)
return u;
return parent[u] = find_par(parent[u]);
}
ll get_answer(int u)
{
int par = find_par(u);
if (sz[par] & 1 ^ 1)
return bsum[par];
else
{
if (mn[par] & 1)
return bsum[par] + min(c2[par], c3[par]);
else
return bsum[par] + min(c1[par], c3[par]);
}
}
void unite(int u, int v)
{
int ulp = find_par(u);
int vlp = find_par(v);
if (ulp == vlp)
return;
parent[ulp] = vlp;
sz[vlp] += sz[ulp];
bsum[vlp] += bsum[ulp];
mn[vlp] = min(mn[vlp], mn[ulp]);
c1[vlp] = min(c1[vlp], c1[ulp]);
c2[vlp] = min(c2[vlp], c2[ulp]);
c3[vlp] = min(c3[vlp], c3[ulp]);
}
void upd(int u, ll x)
{
int ulp = find_par(u);
c3[ulp] = min(c3[ulp], x);
}
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(), Q = E.size();
int idx = 0;
ll ans = 0;
vector<ll> res(Q);
for (int i = 0; i < N; ++i)
{
nvec.pb({W[i], A[i], B[i]});
ans += A[i];
}
for (int i = 0; i < Q; ++i)
{
qry.pb({E[i], i});
}
sort(all(qry));
sort(all(nvec));
for (int i = 0; i < N; ++i)
{
parent[i] = i;
bsum[i] = nvec[i][2];
sz[i] = 1;
c1[i] = c2[i] = c3[i] = INF;
mn[i] = i;
c[i] = nvec[i][1] - nvec[i][2];
if (i & 1 ^ 1)
c1[i] = c[i];
else
c2[i] = c[i];
}
for (int i = 0; i < N - 1; ++i)
{
diff.pb({nvec[i + 1][0] - nvec[i][0], {0, i}});
if (i + 2 < N)
{
diff.pb({nvec[i + 2][0] - nvec[i][0], {1, i}});
}
}
sort(all(diff), [&](pair<int, pair<bool, int>> v1, pair<int, pair<bool, int>> v2)
{
if(v1.fi==v2.fi){
return (int)v1.se.fi<(int)v2.se.fi;
}
return v1.fi<v2.fi; });
for (auto it : qry)
{
while (idx < (int)diff.size() && diff[idx].fi <= it.fi)
{
ans -= get_answer(diff[idx].se.se);
if (find_par(diff[idx].se.se) != find_par(diff[idx].se.se + 1))
{
ans -= get_answer(diff[idx].se.se + 1);
}
if (diff[idx].se.fi)
{
upd(diff[idx].se.se, c[diff[idx].se.se + 1]);
}
// cout << ans << " ";
unite(diff[idx].se.se, diff[idx].se.se + 1);
ans += get_answer(diff[idx].se.se);
// cout << ans << " " << get_answer(diff[idx].se.se) << endl;
++idx;
}
res[it.se] = ans;
}
return res;
}
# | 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... |