#include "nile.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e18;
struct Data {
int len = 0,oddmn = inf,evenmn = inf,cool = inf,sm =0 ;
};
Data merge(Data d1,Data d2) {
Data ret;
ret.len = d1.len+d2.len;
ret.sm = d1.sm+d2.sm;
ret.oddmn = min(d1.oddmn,(d1.len%2)?(d2.evenmn):(d2.oddmn));
ret.evenmn = min(d1.evenmn,(d1.len%2 == 0)?(d2.evenmn):(d2.oddmn));
ret.cool = min(d1.cool,d2.cool);
return ret;
}
struct DSU {
vector<Data> data;
vi dad;
int ans = 0;
DSU(int nn) {
dad.resize(nn);
data.resize(nn);
iota(all(dad),0ll);
}
int find(int x) {
if (x == dad[x]) return x;
return dad[x] = find(dad[x]);
}
int wonder(int x) {
int a = find(x);
if (data[a].len%2) return data[a].sm-min(data[a].oddmn,data[a].cool);
else return data[a].sm;
}
void unite(int x,int y) {
int a = find(x),b = find(y);
assert(a!=b);
ans-=wonder(a),ans-=wonder(b);
dad[a] = b;
data[b] = merge(data[a],data[b]);
ans+=wonder(b);
}
void upd(int x,int y) {
ans-=wonder(x);
int a = find(x);
data[a].cool = min(data[a].cool,y);
ans+=wonder(x);
}
};
struct Query {
int d, id;
};
std::vector<long long> calculate_costs(std::vector<signed> W, std::vector<signed> A,
std::vector<signed> B, std::vector<signed> E) {
int N = big(W),Q = big(E);
vi ord(N);
iota(all(ord),0ll);
sort(all(ord),[&](int x,int y) {
return W[x] < W[y];
});
vi ww = vi(all(W)),aa = vi(all(A)),bb = vi(all(B));
int smm = 0;
for (int i = 0;i<N;i++) {
W[i] = ww[ord[i]];
A[i] = aa[ord[i]];
B[i] = bb[ord[i]];
smm+=A[i];
}
vi ans(Q);
vi v(N);
for (int i = 0;i<N;i++) {
v[i] = A[i]-B[i];
}
DSU dsu(N);
for (int i = 0;i<N;i++) dsu.data[i] = {1,v[i],inf,inf,v[i]};
for (int i = 0;i<N;i++) dsu.upd(i,inf);
vector<pii> pqish,merges;
for (int i=1;i<N-1;i++) {
pqish.push_back({W[i+1]-W[i-1],i});
}
for (int i=0;i<N-1;i++) {
merges.push_back({W[i+1]-W[i],i});
}
vector<Query> queries;
for (int i = 0;i<Q;i++) {
queries.push_back({E[i],i});
}
sort(all(merges));
sort(all(pqish));
sort(all(queries),[&](Query& q1,Query& q2) {
return pii{q1.d,q1.id} < pii{q2.d,q2.id};
});
int ptr = 0,ptr2 = 0;
for (auto& Q : queries) {
int D = Q.d;
while (ptr < N-1 && merges[ptr].ff <= D) {
dsu.unite(merges[ptr].ss,merges[ptr].ss+1);
ptr++;
}
while (ptr2 < N-2 && pqish[ptr2].ff <= D) {
dsu.upd(pqish[ptr2].ss,v[pqish[ptr2].ss]);
ptr2++;
}
ans[Q.id] = smm-dsu.ans;
}
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... |