# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1217486 | dosts | Nile (IOI24_nile) | C++20 | 0 ms | 0 KiB |
#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 = 4e9;
struct DSU {
vi dad;
vi sz;
int ans = 0;
DSU(int nn) {
dad.resize(nn);
iota(all(dad),0ll);
sz.assign(n,1);
}
int find(int x) {
if (x == dad[x]) return x;
return dad[x] = find(dad[x]);
}
void unite(int a,int b) {
int x = find(a),y = find(b);
if (x == y) return;
dad[x] = y;
ans-=sz[x]/2;
ans-=sz[y]/2;
sz[y]+=sz[x];
ans+=sz[y]/2;
}
}dsu(LIM);
std::vector<long long> calculate_costs(std::vector<signed> W, std::vector<signed> A,
std::vector<signed> B, std::vector<signed> E) {
int Q = big(E);
int N = big(W);
vi inds(N);
iota(all(inds),0ll);
sort(all(inds),[&](int x,int y) {return W[x] < W[y];});
vi benefit(N);
int sm = 0;
vector<pii> diffs;
for (int i = 0;i<N;i++) {
sm+=A[inds[i]];
benefit[i] = A[inds[i]]-B[inds[i]];
if (i) diffs.push_back({W[inds[i]]-W[inds[i-1]],i});
}
sort(all(diffs));
vi R(Q);
vector<pii> qs(Q);
for (int i = 0;i<Q;i++) qs[i] = {E[i],i};
sort(all(qs));
int cur = 0;
for (int i = 0;i<Q;i++) {
while (!diffs.empty() && diffs.back().ff <= qs[i].ff) {
int p = diffs.back().ss;
dsu.unite(p-1,p);
}
R[qs[i].ss] = dsu.ans;
}
return R;
}