제출 #577884

#제출 시각아이디문제언어결과실행 시간메모리
577884haxormanStove (JOI18_stove)C++14
100 / 100
35 ms6080 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long

const int mxN = 1e5 + 7;

int n, k, arr[mxN], dsu[mxN];

int find(int x) {
	return (dsu[x] < 0 ? x : dsu[x] = find(dsu[x]));
}

bool unite(int x, int y) {
	x = find(x), y = find(y);

	if (x == y) {
		return false;
	}

	if (dsu[x] > dsu[y]) {
		swap(x, y);
	}

	dsu[x] += dsu[y];
	dsu[y] = x;

	return true;
}

int32_t main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);

	cin >> n >> k;
	memset(dsu, -1, sizeof(dsu));

	for (int i = 0; i < n; ++i) {
		cin >> arr[i];
	}
	sort(arr, arr + n);
	
	vector<pair<int,pair<int,int>>> difs;
	for (int i = 0; i < n - 1; ++i) {
		difs.push_back({arr[i + 1] - arr[i], {i + 1, i}});
	}
	sort(difs.begin(), difs.end());
	
	int ans = n, cnt = n;
	for (auto p : difs) {
		int dif = p.first, u = p.second.first, v = p.second.second;

		if (unite(u, v) && cnt > k) {
			//cout << dif << ' ' << u << ' ' << v << "\n";
			ans += dif - 1;
			--cnt;
		}
	}

	cout << ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...