Submission #996497

#TimeUsernameProblemLanguageResultExecution timeMemory
996497overwatch9Stove (JOI18_stove)C++17
100 / 100
46 ms5328 KiB
#include <iostream> #include <algorithm> #include <queue> using namespace std; using ll = long long; vector <int> t; struct DSU { vector <int> link, sz; vector <ll> mn, mx; DSU (int s) { link = sz = vector <int> (s + 1); mx = mn = vector <ll> (s+1); for (int i = 1; i <= s; i++) { link[i] = i; sz[i] = 1; mx[i] = mn[i] = t[i]; } } int head(int x) { while (x != link[x]) x = link[x]; return x; } bool same(int a, int b) { return head(a) == head(b); } void unite(int a, int b) { a = head(a); b = head(b); if (a == b) return; if (sz[a] < sz[b]) swap(a, b); sz[a] += sz[b]; link[b] = a; mx[a] = max(mx[a], mx[b]); mn[a] = min(mn[a], mn[b]); } }; int main() { int n, k; cin >> n >> k; t = vector <int> (n+1); for (int i = 1; i <= n; i++) cin >> t[i]; DSU dsu(n+1); priority_queue <pair <ll, pair <int, int>>> pq; for (int i = 1; i+1 <= n; i++) { pq.push({-t[i+1] + t[i], {i, i+1}}); } int cnt = n; while (cnt > k) { int a = pq.top().second.first, b = pq.top().second.second; pq.pop(); if (dsu.same(a, b)) continue; dsu.unite(a, b); cnt--; } ll ans = 0; for (int i = 1; i <= n; i++) { if (i == dsu.head(i)) { ans += dsu.mx[i] - dsu.mn[i] + 1; } } cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...