# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1179321 | shirokito | Stove (JOI18_stove) | C++20 | 1 ms | 328 KiB |
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define el '\n'
const int N = 1e5 + 24;
struct Edge { int u, v; ll w; };
int n, k, a[N];
int par[N], sz[N], mn[N], mx[N];
int find(int v) {
return (par[v] == v ? v : par[v] = find(par[v]));
}
bool merge(int u, int v) {
u = find(u); v = find(v);
if (u == v) return 0;
else {
if (sz[u] < sz[v]) swap(u, v);
par[v] = u; sz[u] += sz[v];
mn[u] = min(mn[u], mn[v]);
mx[u] = max(mx[u], mx[v]);
return 1;
}
}
void solve() {
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
for (int i = 1; i <= n; i++) {
par[i] = i; sz[i] = 1;
mn[i] = mx[i] = a[i];
}
vector<Edge> e;
for (int i = 1; i < n; i++) {
e.push_back({i, i + 1, a[i + 1] - a[i]});
}
sort(e.begin(), e.end(), [](Edge x, Edge y) {
return x.w < y.w;
});
int cnt = n;
for (auto [u, v, w]: e) {
merge(u, v);
cnt--; if (cnt == k) break;
}
ll res = 0;
for (int i = 1; i <= n; i++) {
if (find(i) == i) res += mx[i] - mn[i] + 1;
}
cout << res << el;
}
signed main() {
cin.tie(0) -> sync_with_stdio(0);
#define task "STOVE"
if (fopen(task".inp", "r")) {
freopen(task".inp", "r", stdin);
freopen(task".out", "w", stdout);
}
int T = 1; // cin >> T;
while (T--) solve();
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |