当前位置: 首页 > news >正文

P12085 [蓝桥杯 2023 省 B] 整数删除

调完代码,感觉要素(链表,堆)很好想的。但是反悔贪心不会的话可能还真写不出来(我就是一个),代码也非常难调。

并且似乎没有人手写堆......


思路

小根堆维护最小值,时间戳和指向链表的指针,链表维护删除与相邻关系。并开一个 \(t\) 数组记录每个数最后操作的时间

\(K\) 次操作,每次操作取出小根堆的最小值,保留时间戳正确的值,通过指向链表的指针,删除该元素,将该元素相邻元素的 \(val\) 加上删除元素的 \(val\),并将相邻的元素重新加入堆中,并更新时间戳。同时在 \(t\) 数组中记录,取最小值时如果时间戳不对。就证明这个元素被更新过了,该元素过期,没有价值,扔掉。

最后 \(n - k\) 次 遍历链表,输出答案。


例子

这里以样例为例子

\(Input\)

5 3

1 4 2 8 7

\(Out\)

17 7

初始化后

第一次删除后

第二次删除,注意到第二次删除后,根节点的右节点为最小值,但时间戳与其链表中所不同,所以是过期数据,弹出。

最后


注意事项

  • \(A_{i}\) 操作之后会超出 int 的范围 ,需开 long long
  • 如果是手写堆和链表建议开几倍空间,否则可能会 RE (不过也没人手写吧?)
  • 链表的加入删除操作注意边界条件
  • 堆的判断逻辑中要有如果最小值相同,取靠前的

Code

#include <iostream>
#include <bits/stdc++.h>
#define For(i, a, b) for(int i = (a); i <= (b); i++)
using namespace std;
using ll = long long;
const int N = 5e6 + 10;
int n, k, T = 0;
vector <ll> a(N, 0), vt(N, 0);// 小根堆
struct Heap{int un = 0;struct ubth{ll val;int t = 0, it;}v[N];bool check(int x, int y){if(v[x].val == v[y].val) return v[x].it < v[y].it;return v[x].val < v[y].val;}void adjust(int x){if(x == 1 || !check(x, x >> 1))return ;swap(v[x], v[x >> 1]);adjust(x >> 1);}void push(ll x, int t, int it){ v[++un] = (ubth){x, t, it}, adjust(un); }ubth top() { return v[1]; }void rebuild(int x){if(x << 1 > un)return ;int p = x << 1;if((p | 1) <= un && check(p|1, p)) p |= 1;if(check(p, x))swap(v[p], v[x]), rebuild(p);return ;}void pop(){swap(v[1], v[un--]), rebuild(1);}
}H;//链表
struct List{int Head = 0, End = 1;struct ubtl{int pre, nxt, t;ll val;}v[N];void add(ll x, int d){vt[d] = T;v[End - 1].nxt = End;v[End].pre = End - 1;v[End].nxt = End + 1;v[End].val = x;v[End].t = T;H.push(x, T, End);End++;}void delate(int x){v[v[x].pre].nxt = v[x].nxt;v[v[x].nxt].pre = v[x].pre;if(v[x].pre != Head)v[v[x].pre].val += v[x].val;if(v[x].nxt != End)v[v[x].nxt].val += v[x].val;if(v[x].pre != Head)H.push(v[v[x].pre].val, T, v[x].pre), vt[v[x].pre] = T;if(v[x].nxt != End)H.push(v[v[x].nxt].val, T, v[x].nxt), vt[v[x].nxt] = T;v[x].pre = v[x].nxt = v[x].val = v[x].t = 0;return ;}
}L;int main(){ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> n >> k;For(i, 1, n)cin >> a[i];For(i, 1, n)L.add(a[i], i);For(i, 1, k){T++;while(H.top().t != vt[H.top().it])H.pop();Heap::ubth x = H.top(); H.pop();L.delate(x.it);}int it = 0;For(i, 1, n - k){it = L.v[it].nxt ;cout << L.v[it].val << " ";}
}
http://www.jsqmd.com/news/367690/

相关文章:

  • 计算机毕业设计springboot基于房屋租赁系统 SpringBoot框架下在线房产租赁服务平台的设计与实现 基于Java Web的智能住房租赁管理系统构建
  • 人工智能需要学习哪些课程?
  • 大数据存储方案:社交网络图数据库选型指南
  • 请举例 AST 的更多真实例子
  • 计算机毕业设计springboot程序设计竞赛团队管理系统 基于SpringBoot的ACM程序设计竞赛战队协同平台 Java技术栈下的算法竞赛队伍全流程管理系统
  • 数据标注:推动大数据领域进步的关键力量
  • Java毕设项目推荐-基于springboot+vue的工厂精密设备销售管理系统的设计与实现【附源码+文档,调试定制服务】
  • 基于VUE+Tailwind CSS的高德地图导航功能开发实战教程
  • 大模型微调内存优化全攻略:无需昂贵显卡,打造你的AI助手
  • 如何进行 OTel : OpenTelemetry 采用蓝图
  • Code vs Serialized AST Inputs for LLM-Based CodeSummarization: An Empirical Study
  • 【无人机三维路径规划】基于蚁群算法ACA、Astar和遗传GA算法实现无人机山地路径规划附matlab代码
  • 收藏备用|2026年AI人才市场真相:缺口500万+,程序员吃透这篇少走3年弯路
  • 千亿美金争夺战:AI军火商为何突然“踩刹车”?Anthropic3500亿美元;OpenAI8300亿美元
  • 【MIMO通信】超越对角线RIS MIMO容量最大化Matlab复现
  • 收藏备用|AI Agent薪资天花板曝光(60W-300W),小白/程序员入局必看
  • 必收藏!5大主流基于图的RAG框架详解(小白程序员入门必备)
  • 字节Seedance 2.0紧急叫停真人人脸上传
  • 2026六盘水购物地标口碑排名:本地人必逛的5家高性价比名单 - 精选优质企业推荐榜
  • AI应用架构师谈企业AI技术栈选型的重要性
  • 大模型幻觉问题详解:小白也能看懂的成因、分类与缓解方案(收藏版)
  • 反悔贪心练习题目
  • 免费降aigc全攻略:如何通过降ai技术降知网、维普 AI率,亲测10款降AI工具【建议收藏】
  • 论文降ai哪家最有效?深度实测10款主流降ai率工具(内附对比表)
  • Java毕设项目:基于springboot的工厂精密设备销售管理系统的设计与实现(源码+文档,讲解、调试运行,定制等)
  • 2026六枝逛街搭配指南:本地人必逛的5家好店名单出炉! - 精选优质企业推荐榜
  • 2026六盘水买鞋避坑指南:专业售后口碑店TOP5名单公布! - 精选优质企业推荐榜
  • 编写约会助手APP,根据约会对象,约会主题(第一次约会/纪念日/生日),预算,推荐合适的约会地点,美食,活动,还能生成约会攻略,避免约会难堪,适合年轻人。
  • Perl 运算符
  • 2026六枝特区中产消费指南:本地人私藏的5家必逛好店名单! - 精选优质企业推荐榜