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

数据结构·堆

  • 动态变化的列表

二叉堆

  • 一个小顶堆和一个大顶堆
  • 擅长处理第k个大/小的题目
  • 特点:小堆的数据全都大于大堆的数据保持单调性
  • 小堆相当于一个寄存器,每次放数据到小堆后,要保证放一个大顶堆回来!确保大堆数量始终与要求区间长度一致

例题

  • 黑匣子:
    注意:为了保持单调性,小堆的数据及时拿回来大堆。新来的数据加入大堆可能破坏这种关系。
	for (int i = 1; i <= m; i++) {q1.push(a[i]);while (i == u[utop]) {while (q1.size() > utop) {q2.push(q1.top());q1.pop();}cout << q1.top()<<endl;if (!q2.empty()) {q1.push(q2.top());q2.pop();}utop++;}}
  • 中位数
	for (int i = 1; i <= n; i++) {cin >> a[i];bq.push(a[i]);if ((i + 1) % 2 == 0) {int mid = (i + 1) / 2;while (bq.size() > mid) {sq.push(bq.top());bq.pop();}cout << bq.top() << endl;if (!sq.empty()) {bq.push(sq.top());sq.pop();}}}

P2168 [NOI2015] 荷马史诗:

  • k叉哈夫曼树。注意到深度最浅的时候一定是只存在度为0(叶子节点)和度为k的节点(满节点)
  • 另外最深处可以换一种思路,补充节点,而不是一开始固定合并几个节点。
  • 利用树的性质:结点数=总度+1->叶子节点数=(k-1)满节点+1,进而确定补充的节点。
#include<bits/stdc++.h>
#define MAX_VALUE 1000009
#define mod 1000007
using ll = long long;
using namespace std;
int n, k,res;
ll w,ans,max_depth = 0;
typedef struct node {ll val;ll depth;node(ll a, ll b) :val(a), depth(b) {};
};
class cmp {
public:bool operator()(const node& a, const node& b) {if (a.val != b.val) {return a.val > b.val;}else {return a.depth > b.depth;}}
};
priority_queue<node, vector<node>, cmp>q;void printout() {while (!q.empty()) {cout << q.top().val << " " << q.top().depth << endl;q.pop();}
}void solve() {cin >> n >> k;for (int i = 1; i <= n; i++) {cin >> w;q.push(node(w,0));}//哈夫曼编码是一个满k叉树,所有节点的度为0或者k//等式有  N=n_0+n_k=0*n_0+k*n_k+1  n_0=(k-1)*n_k+1while((n-1)%(k-1)!=0){q.push(node(0, 0));n++;}while (!q.empty()) {if (q.size() == 1) {cout << ans << endl << max_depth;return;}ll sum = 0, new_depth =INT_MIN;for (int i = 1; i <= k; i++) {sum += q.top().val;new_depth = max(new_depth, q.top().depth+1);//cout << q.top().val << " " << q.top().depth << endl;q.pop();}ans += sum;max_depth = max(max_depth, new_depth);//cout << "sum:" << sum << " " << "max_depth:" << max_depth << endl;//cout << endl;q.push(node(sum, new_depth));}//printout();
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);solve();return 0;
}
http://www.dtcms.com/a/532068.html

相关文章:

  • 阮一峰《TypeScript 教程》学习笔记——类型映射
  • 需要做网站建设和推广网站地图插件
  • PyCharm 设置 Tabs and Indents
  • Spring Boot3零基础教程,生命周期监听,自定义监听器,笔记59
  • 【SpringBoot】详解Maven的操作与配置
  • 【C++】STL容器--priority_queue的使用与模拟实现
  • 【系统分析师】高分论文:论需求分析方法及应用(电子商务门户网站系统)
  • 【大模型应用开发 6.LangChain多任务应用开发】
  • 泰安最好的网站建设公司怎么通过做网站赚钱吗
  • 初识C语言15.文件操作
  • 聊聊连续、递增
  • 9款上班打卡软件测评:帮你选出最适合企业的工具
  • 建站服务网络公司建设宣传网站上的请示
  • Mem0 使用案例学习总结 - 记忆化应用结构
  • 如何自动清理 Linux 临时文件 ?
  • C++容器forward_list
  • 茂名网站建设培训品牌宣传网站
  • 油漆工找活做的网站网站免费建设
  • TcpClinet
  • Appium+Python+Android+Nodejs环境安装
  • SCDN:互联网时代网站安全的安全保障
  • Linux小课堂: Apache服务在CentOS上的安装与基础配置指南
  • Gorm(八)预加载方式
  • 网站开发与设计的实训场地WordPress无法自动推送
  • 【找指针数组最大值】2022-11-24
  • 自己做网站能赚钱吗做spa的网站怎么推广
  • 网络管理中的名词
  • gitlab配置git的ssh秘钥
  • 机器狗进化论:当“园区跑腿”遇上具身智能,一场静悄悄的变革正在发生
  • 江宁区建设工程质量监督站网站学校网站源码开源