# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1231281 | bangan | 나일강 (IOI24_nile) | C++20 | 0 ms | 0 KiB |
#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ALL(a) a.begin(), a.end()
std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) {
int N = W.size();
int Q = E.size();
vector<int> ord(N);
iota(ALL(ord), 0);
sort(ALL(ord), [&](int i, int j) {
return W[i]<W[j];
});
auto f = [&](int i) {
return W[ord[i+1]]-W[ord[i]];
};
vector<int> edges(N-1);
iota(ALL(edges), 0);
sort(ALL(edges), [&](int i, int j) {
return f(i) < f(j);
});
vector<int> qry(Q);
iota(ALL(qry), 0);
sort(ALL(qry), [&](int i, int j) {
return E[i]<E[j];
});
ll res = 2*N;
vector<int> par(N), sz(N);
for (int i=0; i<N; i++) par[i]=i, sz[i]=1;
auto find = [&](auto self, int v) -> int {
return par[v]==v ? v : par[v] = self(self, par[v]);
};
auto merge = [&](int v, int u) {
v = find(find, v);
u = find(find, u);
assert(v != u);
if (v > u) swap(v, u);
res -= sz[v] + sz[v]%2;
res -= sz[u] + sz[u]%2;
sz[v] += sz[u];
par[u] = v;
res += sz[v] + sz[v]%2;
};
auto cur = edges.begin();
vector<ll> ans(Q);
for (int id : qry) {
while (cur != edges.end() && f(*cur) <= E[id]) {
merge(*cur, *cur + 1);
cur++;
}
ans[id] = res;
}
return ans;
}
#include "nile.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define ALL(a) a.begin(), a.end()
std::vector<long long> calculate_costs(std::vector<int> W, std::vector<int> A, std::vector<int> B, std::vector<int> E) {
int N = W.size();
int Q = E.size();
vector<int> ord(N);
iota(ALL(ord), 0);
sort(ALL(ord), [&](int i, int j) {
return W[i]<W[j];
});
auto f = [&](int i) {
return W[ord[i+1]]-W[ord[i]];
};
vector<int> edges(N-1);
iota(ALL(edges), 0);
sort(ALL(edges), [&](int i, int j) {
return f(i) < f(j);
});
vector<int> qry(Q);
iota(ALL(qry), 0);
sort(ALL(qry), [&](int i, int j) {
return E[i]<E[j];
});
ll res = 2*N;
vector<int> par(N), sz(N);
for (int i=0; i<N; i++) par[i]=i, sz[i]=1;
auto find = [&](auto self, int v) -> int {
return par[v]==v ? v : par[v] = self(self, par[v]);
};
auto merge = [&](int v, int u) {
v = find(find, v);
u = find(find, u);
assert(v != u);
if (v > u) swap(v, u);
res -= sz[v] + sz[v]%2;
res -= sz[u] + sz[u]%2;
sz[v] += sz[u];
par[u] = v;
res += sz[v] + sz[v]%2;
};
auto cur = edges.begin();
vector<ll> ans(Q);
for (int id : qry) {
while (cur != edges.end() && f(*cur) <= E[id]) {
merge(*cur, *cur + 1);
cur++;
}
ans[id] = res;
}
return ans;
}