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

蓝桥杯每日一题2023.9.23

4961. 整数删除 - AcWing题库

题目描述

 分析

注:如果要进行大量的删除操作可以使用链表

动态求最小值使用堆,每次从堆中取出最小值的下标然后在链表中删除

注意long long

代码解释:

	while(k --){auto t = q.top();q.pop();res = t.first;i = t.second;if(res != v[i])q.push({v[i], i});else del(i);	}

eg. 2 3 4此时这三个数的下标分别为1 2 3

第一步:在q的队列中加入2, 3, 4,第一次k --进行del操作,使v[2] == 5

第二部:q.top() == 3发现3对应下标为2, v[2]原本为3,但是上一步使其变为了5,故此时需要重新将5加入队列,当然,此时k不算进行了一次操作,需要k ++(因为这一步只是将上一步两边加数的操作进行了完善)

#include<bits/stdc++.h>
using namespace std;
const int N = 5e5 + 10;
typedef long long ll;
typedef pair<ll, ll> PII;
priority_queue<PII, vector<PII>, greater<PII>>q;
ll n, k, v[N], l[N], r[N];
void del(ll x)
{r[l[x]] = r[x], l[r[x]] = l[x];v[l[x]] += v[x], v[r[x]] += v[x];
}
int main()
{ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);cin >> n >> k;r[0] = 1, l[n + 1] = n;//初始化左右端点的下标,将0后的下标赋于1,将n + 1左边的下标赋予n for(int i = 1; i <= n; i ++){cin >> v[i];//下标i对应的值为v[i]l[i] = i - 1;//建立双链表 r[i] = i + 1; q.push({v[i], i});//将值和对应下标存入优先队列 }while(k --){auto t = q.top();q.pop();ll res = t.first;ll i = t.second;if(res != v[i]){q.push({v[i], i});k ++;}else del(i);	}for(int i = r[0]; i != n + 1; i = r[i]){cout << v[i] << ' ';}cout << '\n';return 0;
}
http://www.lryc.cn/news/173656.html

相关文章:

  • C语言数组和指针笔试题(三)(一定要看)
  • leetcode11 盛水最多的容器
  • 进入数据结构的世界
  • stm32之看门狗
  • 纤维蛋白单体(FM)介绍
  • 知识图谱实战导论:从什么是KG到LLM与KG/DB的结合实战
  • 第5章 会话与会话技术
  • IDEA2023新UI回退老UI
  • ElasticSearch(三)
  • 【LinkedHashMap】146. LRU 缓存
  • Opencv-python去图标与水印方案实践
  • 自己写过比较蠢的代码:从失败中学习的经验
  • C语言 cortex-A7核 点LED灯 (附 汇编实现、使用C语言 循环实现、使用C语言 封装函数实现【重要、常用】)
  • LABVIEW 实战案例1--温度报警系统
  • 【力扣】292. Nim 游戏
  • IAP固件升级分几步?(Qt上位机、)
  • Otter改造 增加springboot模块和HTTP调用功能
  • Vue.js vs React:哪一个更适合你的项目?
  • Debian环境下搭建STM32开发环境
  • 如何防止商业秘密泄露(洞察眼MIT系统商业机密防泄密解决方案)
  • 题目 1062: 二级C语言-公约公倍
  • 【Leetcode】148.排序链表
  • 用《斗破苍穹》的视角打开C#多线程开发1(斗帝之路)
  • 图像处理与计算机视觉--第三章-颜色与纹理分析-6问
  • vue重修002
  • [PowerQuery] PowerAutoMate 刷新PowerBI 数据
  • C语言中各种接口标准
  • vscode常用插件
  • 代码随想录算法训练营day60|84.柱状图中最大的矩形 |完结撒花~
  • 在 android 上使用 adb client