# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1259691 | vietbachleonkroos2326 | 나일강 (IOI24_nile) | C++20 | 0 ms | 0 KiB |
#include<bits/stdc++.h>
#define TIME (1.0* clock()/CLOCKS_PER_SEC)
#define pb push_back
#define eb emplace_back
#define id1 (id<<1)
#define id2 (id<<1)|1
#define ll long long
#define ii pair<int,int>
#define vi vector<int>
#define vii vector<pair<int,int>>
#define vl vector<long long>
#define vll vector <pair<ll,ll>>
#define li pair<long long,int>
#define vil vector <pair<int,ll>>
#define db double
#define ff first
#define ss second
#define lb lower_bound
#define ub upper_bound
#define FOR(i, a, b) for (int i = (a); i <=(b); i++)
#define F0R(i, a) FOR(i, 0, a-1)
#define ROF(i, a, b) for (int i = (b); i >= (a); i--)
#define R0F(i, a) ROF(i, 0, a-1)
#define rep(a) F0R(_, a)
#define each(a, x) for (auto &a : x)
#define ALL(x) (x).begin(),(x).end()
#define pq priority_queue <li, vector <li>, greater <li>>
using namespace std;
struct DSU {
vector<int> p;
DSU(int n) : p(n) { iota(p.begin(), p.end(), 0); }
int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }
void unite(int a, int b) { p[find(b)] = find(a); }
};
vector<ll> calc(vector<int> W, vector<int> A, vector<int> B, vector<int> E) {
int n = W.size(), q = E.size();
vector<ll> res(q);
vector<int> idx(n);
iota(idx.begin(), idx.end(), 0);
sort(idx.begin(), idx.end(), [&](int i, int j) { return W[i] < W[j]; });
for (int qi = 0; qi < q; qi++) {
int D = E[qi];
DSU dsu(n);
ll cost = 0;
vector<bool> used(n);
for (int i = 0; i < n; i++) {
if (used[idx[i]]) continue;
used[idx[i]] = true;
cost += A[idx[i]];
for (int j = i+1; j < n && W[idx[j]] - W[idx[i]] <= D; j++) {
if (!used[idx[j]] && dsu.find(idx[i]) != dsu.find(idx[j])) {
used[idx[j]] = true;
cost += B[idx[i]] + B[idx[j]] - A[idx[i]];
dsu.unite(idx[i], idx[j]);
break;
}
}
}
res[qi] = cost;
}
return res;
}