25pts求条
查看原帖
25pts求条
845400
lwj54joy楼主2025/7/22 13:32

跟着第一篇题解的思路写的,但是只有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;
}
2025/7/22 13:32
加载中...