十五月明


私信TA

用户名:dotcpp0605328

访问量:2846

签 名:

等  级
排  名 501
经  验 4459
参赛次数 0
文章发表 68
年  龄 18
在职情况 学生
学  校 曲阜师范大学
专  业 人工智能

  自我简介:

Easy

解题思路:

注意事项:

参考代码:

#include<iostream>

#include<queue>

#include<vector>

using namespace std;

using ll = long long;

const int N = 5e5 + 10;

ll v[N], l[N], r[N];

//l[i]代表i下标的左边下标,r[i]代表i下标的右边下标,v[i]是i下标的值



void del(int x) {

    r[l[x]] = r[x], l[r[x]] = l[x];

    v[l[x]] += v[x], v[r[x]] += v[x];

}

//把id右边个体的左编号改为id的左编号

//把id左边个体的右编号改为id的右编号


int main () {

    int n, k; cin >> n >> k;

    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> h;

    //输入并构造双向递增链表

    r[0] = 1, l[n + 1] = n;

    for (int i = 1; i <= n; i ++)

        cin >> v[i], l[i] = i - 1, r[i] = i + 1, h.push({v[i], i});

    while (k --) {

        auto p = h.top(); h.pop();

        //如果v发生变化, 则目前的元素不一定是最小值, 需要重新放入堆中

        if (p.first != v[p.second]) h.push({v[p.second], p.second}), k ++;

        else del(p.second);

    }

    //输出链表剩余的元素

    int head = r[0];

    while (head != n + 1) {

        cout << v[head]<< " ";

        head = r[head];

    }

    return 0;

}


 

0.0分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区