#include "nile.h"
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> pii;
#define vi vector<int>
#define vii vector<ii>
#define vpii vector<pii>
#define whole(x) x.begin(), x.end()
#define fi first
#define se second
#define pb push_back
int fat[100005], sz[100005], le[100005], ri[100005];
const int inf = 1000000;
struct segtree{
int n;
vi t;
segtree(vi &x){
n = (int)x.size();
t.assign(4 * n, 0);
build(0, n-1, 1, x);
}
void build(int l, int r, int no, vi &x){
//cout << l << " " << r << endl;
if(l == r){
t[no] = x[l];
return;
}
int mid = l + (r - l) / 2;
build(l, mid, 2*no, x);
build(mid+1, r, 2*no+1, x);
t[no] = min(t[2*no], t[2*no+1]);
return;
}
void update(int l, int r, int no, int i, int val){
if(l == r){
t[no] = val;
return;
}
int mid = l + (r - l) / 2;
if(i <= mid){
update(l, mid, 2*no, i, val);
}else{
update(mid+1, r, 2*no+1, i, val);
}
t[no] = min(t[2*no], t[2*no+1]);
}
int query(int l, int r, int no, int lq, int rq){
if(lq > r || rq < l){
return inf;
}
lq = max(lq, l);
rq = min(rq, r);
if(l == lq && r == rq){
return t[no];
}
int mid = l + (r - l) / 2;
int lef = query(l, mid, 2*no, lq, rq);
int rig = query(mid+1, r, 2*no+1, lq, rq);
return min(lef, rig);
}
};
int ffather(int no){
if(fat[no] == no){
return no;
}
return fat[no] = ffather(fat[no]);
}
void join(int u, int v){
u = ffather(u);
v = ffather(v);
if(u == v){
return;
}
if(sz[u] < sz[v]){
swap(u, v);
}
fat[v] = u;
sz[u] += sz[v];
le[u] = min(le[u], le[v]);
ri[u] = max(ri[u], ri[v]);
}
std::vector<long long> calculate_costs(std::vector<int> w, std::vector<int> a, std::vector<int> b, std::vector<int> E) {
for(int i = 0; i < 100005; ++i){
fat[i] = i;
sz[i] = 1;
le[i] = i;
ri[i] = i;
}
int n = int(a.size());
vpii x;
int sum = 0;
for(int i = 0; i < int(w.size()); ++i){
sum += a[i];
x.pb({w[i], {a[i], b[i]}});
}
vi even;
vi odd;
sort(whole(x));
vii op;
vii sop;
even.pb(x[0].se.fi - x[0].se.se);
odd.pb(inf);
for(int i = 1; i < (int)x.size(); ++i){
if(i % 2 == 0){
even.pb(x[i].se.fi - x[i].se.se);
odd.pb(inf);
}else{
odd.pb(x[i].se.fi - x[i].se.se);
even.pb(inf);
}
if(i == (int)x.size()-1){
op.pb({x[i].fi - x[i-1].fi, i});
continue;
}
op.pb({x[i].fi - x[i-1].fi, i});
sop.pb({x[i+1].fi - x[i-1].fi, i});
}
segtree oddtree(odd), eventree(even);
sort(whole(op));
sort(whole(sop));
vii q;
for(int i = 0; i < (int)E.size(); ++i){
q.pb({E[i], i});
}
sort(whole(q));
std::vector<long long> ans((int)q.size(), 0);
int i = 0;
int j = 0;
for(auto e:q){
int val = e.fi;
//cout << val << " ." << endl;
unordered_set<int> tocheck;
while(i < (int)op.size() && op[i].fi < val){
int v = op[i].se;
int u = v-1;
v = ffather(v);
u = ffather(u);
if(sz[v] % 2 == 1 && tocheck.find(v) == tocheck.end()){
if(le[v] % 2 == 0){
sum -= eventree.query(0, n-1, 1, le[v], ri[v]);
}else{
sum -= oddtree.query(0, n-1, 1, le[v], ri[v]);
}
}
//cout << u << " " << v << " " << sum << endl;
if(sz[u] % 2 == 1 && tocheck.find(u) == tocheck.end()){
//cout << "atleast" << endl;
if(le[u] % 2 == 0){
sum -= eventree.query(0, n-1, 1, le[u], ri[u]);
}else{
sum -= oddtree.query(0, n-1, 1, le[u], ri[u]);
}
}
//cout << u << " " << v << " " << sum << endl;
join(u, v);
tocheck.insert(ffather(u));
i++;
}
while(j < (int)sop.size() && sop[j].fi <= val){
int u = sop[j].se;
//cout << u << endl;
if(u % 2 == 0){
oddtree.update(0, n-1, 1, u, x[u].se.fi - x[u].se.se);
}else{
eventree.update(0, n-1, 1, u, a[u] - b[u]);
}
j++;
}
//cout << oddtree.query(0, n-1, 1, 2, 2) << endl;
for(auto e:tocheck){
if(sz[e] % 2 == 1){
if(le[e] % 2 == 0){
sum += eventree.query(0, n-1, 1, le[e], ri[e]);
}else{
sum += oddtree.query(0, n-1, 1, le[e], ri[e]);
}
}
}
ans[e.se] = sum;
}
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... |