双向链表 + 优先队列

news/2025/3/21 1:01:34/文章来源:https://www.cnblogs.com/zevan/p/18784343

双向链表 + 优先队列

整数删除

给定一个长度为\(N\)的整数序列\(:A_1,A_2,...,A_n\)。你要重复以下操作\(K\)次:

每次选择数列中最小的整数(如果最小值不止一个,选择最靠前的),将其删除。

并把与它相邻的整数加上被删除的数值。

输出 \(K\)次操作后的序列

输入格式

第一行包含两个整数 \(N\)\(K\)

第二行包含 \(N\) 个整数\(,A1,A2,A3,…,AN\)

输出格式

输出 \(N−K\) 个整数,中间用一个空格隔开,代表 \(K\) 次操作后的序列。

样例输入

5 3
1 4 2 8 7

样例输出

17 7

模拟一下过程:

1(最小) 4 2 8 7
-> 5 2(最小) 8 7
-> 7(最小) 10 7
-> 17 7

题解

思路:根据题意可知,\(K\)次操作,每次都要取最小值,因此这里大概可以猜一个小根堆的优先队列

又把这个最小值累加到相邻位置,这里需要一个数据结构记录相邻位置的坐标,其中双向链表可以\(O(1)\)

  1. 首先建立小根堆的优先队列\(q\),双向链表\(l[],r[]\),用一个数组记录元素杯累加的\(add[]\)
  2. 输入数据,将\([val, pos]\)存入队列,并且初始化双向链表
  3. 进入循环,队列最多存放\(n-k\)个元素
    1. 出队元素,若当前有累加值\(add\),那么把累加值加上,再入队
    2. 出队元素,若当前没有累加值\(add\),那么把当前的值累加到相邻点,调整链表指向
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6+10;
int _;int n, k;typedef struct node {int val, pos;
}node;
int l[N], r[N];
int ans[N], add[N];struct cmp {bool operator () (const node &a, const node &b) {if(a.val == b.val) {return a.pos > b.pos;}return a.val > b.val;}
};priority_queue<node, vector<node>, cmp> q;void solve() {cin >> n >> k;for(int i = 1; i <= n; i++) {int x; cin >> x;q.push({x, i});l[i] = i - 1;r[i] = i + 1;}while(q.size() > n - k) {node t = q.top(); q.pop();if(add[t.pos]) {q.push({t.val + add[t.pos], t.pos});add[t.pos] = 0;} else {int pl = l[t.pos], pr = r[t.pos];add[pl] += t.val; add[pr] += t.val;l[pr] = pl; r[pl] = pr;}}while(q.size()) {auto [x, y] = q.top(); q.pop();ans[y] = x + add[y];}for(int i = 1; i <= n; i++) {if(ans[i]) cout << ans[i] << " ";}
}signed main() {ios::sync_with_stdio(false);cin.tie(nullptr);_ = 1;// cin >> _;while(_--) {solve();} return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902290.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day19_java运算符_死锁

每日一题 题目 请解释死锁(Deadlock)的概念及其产生的必要条件,并说明常见的死锁处理策略及其优缺点。问题分析 此问题考察对操作系统资源管理机制的理解,需深入分析死锁的成因、判定条件及解决方法。回答时需结合理论模型与实际策略,体现系统性思维。参考答案 1. 死锁的定…

[AI/AIGC/GPT] 提示词工程1概述篇

概述:提示词工程提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。 研究人员可利用提示工程来提…

java综合开发-前后端分离-01前端html,css

java综合开发-前后端分离-01前端html,css[ 任务列表 ] 1.阶段目标 2.网页基础知识 3.html和css 4.html的常用标签 4.1. 标题标签:h1-h6 4.2. 图片标签:img 4.3. 水平分割线标签:hr 4.4. css的三种引入方式: 4.5. 颜色的三种表示形式: 4.6. css的三种选择器: 4.7. 无语义…

Unreal最佳实践——通过进程Hack资源

Q:接到一个需求说是要一个外部C++调用ReadProcessMemory 黑进UE的程序找到uimage的地址,然后把里面的png图片拷贝出来,一头雾水 A:ReadProcessMemory写过 A:进程的启动地址就是你的基址,不过UE的需要找到world基址,所有的world对象U指针基于world,如果不是world内的,直接…

数据、信息、知识、智慧:AI时代我们该如何思考?

时代的浪潮滚滚向前,AI技术的演进正悄然改变着我们认知世界和创造价值的方式。从数据、信息到知识、智慧,从大数据到大模型,从单一智能体到多智能体协作,这是一场深刻的认知革命,也是生产力解放的新纪元。 AI粉嫩特攻队,2025年3月15日。 最近跟几个朋友讨论AI发展,突然意…

3.20学习苍穹外卖

今天主要学习关于微信支付的流程问题 又微信官方文档和流程图整体来说十分复杂 不过通过一篇博客成功跳过这个问题 引文正真支付是需要部分密钥文件 黑马不会提供这个 所有无法实现 就是通过直接跳转到成功支付实现的这个功能 https://blog.csdn.net/XZY__one/article/details/…

GKI改造原则、机制和方法

Google在android11-5.4分支上开始要求所有下游厂商使用Generic Kernel Image(GKI),需要将SoC和device相关的代码从核心内核剥离到可加载模块中(下文称之为GKI改造),从而解决内核碎片化问题。GKI为内核模块提供了稳定的内核模块接口(KMI),模块和内核可以独立更新。本文…

鸿蒙特效教程07-九宫格幸运抽奖

鸿蒙特效教程07-九宫格幸运抽奖在移动应用中,抽奖功能是一种常见且受欢迎的交互方式,能够有效提升用户粘性。本教程将带领大家从零开始,逐步实现一个九宫格抽奖效果,适合HarmonyOS开发的初学者阅读。最终效果预览 我们将实现一个经典的九宫格抽奖界面,包含以下核心功能:3…

Ollama系列05:Ollama API 使用指南

本文是Ollama系列教程的第5篇,在前面的4篇内容中,给大家分享了如何再本地通过Ollama运行DeepSeek等大模型,演示了chatbox、CherryStudio等UI界面中集成Ollama的服务,并介绍了如何通过cherryStudio构建私有知识库。 在今天的分享中,我将分享如何通过API来调用ollama服务,通…

前端HTML+CSS+JS速成笔记

HTML 超文本标记语言。 单标签与双标签的区别 单标签用于没有内容的元素,双标签用于有内容的元素。 HTML文件结构 告诉浏览器这还是一个 Html 文件: <!DOCTYPE html>Html文件的范围: <html>...</html>Html 文件的头: <head>...</head>实际显…

12. ADC

一、ADC简介生活中接触到的大多数信息是醉着时间连续变化的物理量,如声音、温度、压力等。表达这些信息的电信号,称为 模拟信号(Analog Signal)。为了方便存储、处理,在计算机系统中,都是数字 0 和 1 信号,将模拟信号(连续信号)转换为数字信号(离散信号)的器件就叫模…