跟着第一篇题解的思路写的,但是只有25pts
玄1关
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int p[N], n, k, l[N], r[N];
bool vis[N];
typedef pair<int, int> pii;
priority_queue<pii, vector<pii>, greater<pii>> q;
int main() {
cin >> n >> k;
long long ans = 0; // 改为long long防溢出
int prefix = 0;
cin >> prefix;
for (int i = 1; i < n; i++) {
int x;
cin >> x;
p[i] = x - prefix;
prefix = x;
l[i] = i - 1;
r[i] = i + 1;
q.push({p[i], i});
}
p[0] = p[n] = INT_MAX;
for (int i = 1; i <= k; i++) {
pii x;
while (true) {
auto t = q.top(); q.pop();
if (vis[t.second]) continue;
if (t.first != p[t.second]) continue; // 检查值有效性
x = t;
break;
}
ans += x.first;
int left_node = l[x.second];
int right_node = r[x.second];
vis[left_node] = vis[right_node] = true;
p[x.second] = p[left_node] + p[right_node] - p[x.second];
l[x.second] = l[left_node];
r[x.second] = r[right_node];
r[l[x.second]] = x.second; // 修复链表指针
l[r[x.second]] = x.second;
q.push({p[x.second], x.second});
}
cout << ans << endl;
return 0;
}