# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1138159 | repmann | 나일강 (IOI24_nile) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int N, Q;
struct NODE
{
int parent, ranking, minimum;
ll sum;
bool odd;
}DSU[100096];
struct EDGE
{
int u, v, w;
}E[100096];
inline bool comp(EDGE e1, EDGE e2) {return e1.w < e2.w;}
inline int Find(int i)
{
if(DSU[i].parent != i) return Find(DSU[i].parent);
return i;
}
inline int Union(int u, int v)
{
u = Find(u);
v = Find(v);
if(u == v) return 0;
int RET = DSU[u].sum + DSU[u].minimum * DSU[u].odd + DSU[v].sum + DSU[v].minimum * DSU[v].odd;
if(DSU[u].ranking < DSU[v].ranking) swap(DSU[u], DSU[v]);
DSU[u].ranking += DSU[u].ranking == DSU[v].ranking;
DSU[v].parent = u;
DSU[u].minimum = min(DSU[v].minimum, DSU[u].minimum);
DSU[u].sum += DSU[v].sum;
DSU[u].odd ^= DSU[v].odd;
RET -= DSU[u].sum + DSU[u].minimum * DSU[u].odd;
return RET;
}
vector <ll> calculate_costs(vector <int>& W, vector <int>& A, vector <int>& B, vector <int>& D)
{
N = W.size();
Q = D.size();
vector <ll> O(Q);
vector <pair <int, int>> MO(Q), V(N);
for(int i = 0; i < Q; i++) MO[i] = {D[i], i};
sort(MO.begin(), MO.end());
for(int i = 0; i < N; i++) V[i] = {W[i], i};
sort(V.begin(), V.end());
for(int i = 1; i < N; i++) E[i] = {V[i - 1].second, V[i].second, V[i].first - V[i - 1].first};
sort(E + 1, E + N, comp);
for(int i = 0; i < N; i++) DSU[i] = {i, 0, A[i] - B[i], B[i], true};
ll temp = 0;
for(int i = 0; i < N; i++) temp += DSU[i].sum + DSU[i].minimum * DSU[i].odd;
E[N].w = INT_MAX;
int i = 1;
for(pair <int, int> p : MO)
{
// while(E[i].w <= p.first)
// {
// temp -= Union(E[i].u, E[i].v);
// i++;
// }
O[p.second] = temp;
}
return O;
}