【题目】D. Huffman Coding on Segment

【题意】给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长。1<=n,m,ai<=10^5。

【算法】哈夫曼树+莫队+分块

【哈夫曼树】哈夫曼树又称最优构造树,n个数字的哈夫曼树是含有n个给定权值叶子的点权路径和最小的二叉树。

点权路径和(WPL)可以表示为每个点的深度*权值

构造方法:每次取点权最小的两个根节点作为左右子树(左小右大)组成新根节(点权为左右之和),多次操作直到只剩一棵树。(类似合并果子)

哈夫曼树的WPL是所有节点的权值和-数字和(也是非叶子节点的权值和,或是所有非根节点的权值和)。

哈夫曼编码:从根出发左0右1,走到每个字符的二进制就是它的编码。

Huffman Code是电文总长最短的二进制编码方式,将n个字符的出现频率作为点权构造哈夫曼树得到的就是对应的哈夫曼编码。

n个数字的哈夫曼编码长度和就是WPL。

【题解】对于一个区间,令f[x]表示数字x的出现次数,令g[x]表示出现次数为x的数字个数,用莫队维护。

每次区间询问,考虑朴素做法是将出现次数作为点权,构造哈夫曼树,但这样太慢了。令S=sqrt(n)。

对于出现次数>S的数字,一共只有不超过S个,按朴素做法构造哈夫曼树求解即可,复杂度O(S log S)。

对于出现次数<S的数字,考虑到点权很小,可以用一个桶记录,就可以批量做了,复杂度O(S),点权一旦超过S就进入上一过程。

总复杂度O(n√n)。

转载于:https://www.cnblogs.com/onioncyc/p/8855864.html

【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块相关推荐

  1. 哈夫曼树(Huffman Tree),与哈夫曼编码

    目录 一.哈夫曼树 1.什么是哈夫曼树? 2.哈夫曼树关键字说明 3.用代码实现哈夫曼树思路分析 4.代码实现 二.哈夫曼编码 1.哈夫曼编码基本介绍 2.原理剖析 3.代码实现 一.哈夫曼树 1.什 ...

  2. Huffman Coding 哈夫曼树

    一.实验名称:Huffman Coding 二.实验目的: 熟练掌握哈夫曼树的数据结构,结构的特点: 能够实现哈夫曼树的基本操作:如构造,插入等 利用最小堆降低哈夫曼树的时间复杂度. 熟练掌握最小堆的 ...

  3. 哈夫曼树(Huffman Tree)及哈夫曼编码(Huffman Coding)

    目录 一.Huffman树(最优二叉树) 1.定义 2.构造 构造哈夫曼树的算法 哈夫曼树特点 二.Huffman编码 一.Huffman树(最优二叉树) 1.定义 树的带权路径长度,就是树中所有的叶 ...

  4. Python---哈夫曼树---Huffman Tree

    今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...

  5. huffman树_笃学不倦|c语言构造哈夫曼树哈夫曼编码

    艾薇巴蒂!许久不见甚是想念,想必这"涨姿势"的时刻大家已经期待许久了!今天我们要共同学习的是c语言构造哈夫曼树-哈夫曼编码 构造哈夫曼树 首先,我们需要了解哈夫曼树是什么: 相关知 ...

  6. 哈夫曼树(Huffman Tree)的介绍、画法、哈夫曼树的可视化显示(Python代码实现)

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) 目录 一.概念 二 ...

  7. java哈夫曼_用 JAVA 实现哈夫曼树(Huffman Tree)

    -1. 什么是树 树是一种 有层次关系的 数据结构.它由结点组成. 图一: 树的结点由 数据域 和 子结点域 组成.数据域 作为数据的容器:子结点域 存放 子结点 的地址.一个结点是它的子结点的父结点 ...

  8. 哈夫曼树【最优二叉树】【Huffman】

    [转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设计直接影响着程序 ...

  9. 数据结构C#版笔记--啥夫曼树(Huffman Tree)与啥夫曼编码(Huffman Encoding)

    哈夫曼树Huffman tree 又称最优完全二叉树,切入正题之前,先看几个定义 1.路径 Path 简单点讲,路径就是从一个指定节点走到另一个指定节点所经过的分支,比如下图中的红色分支(A-> ...

最新文章

  1. 2022THE重量级大学排名:97所内地高校上榜!
  2. 非常有创意的音乐网站
  3. eclipse编码设置
  4. mysql select内部原理_数据库SQL SELECT查询的工作原理
  5. chrome浏览器允许跨域
  6. 使用Spring配合Junit进行单元测试的总结
  7. git_day03_01——git远程仓库的使用
  8. python之路——作业:Select FTP(仅供参考)
  9. 美赛O奖、F奖论文写作技巧!【微信公众号:校园数模】
  10. 盘点12个yyds的微信小程序开源项目
  11. Photoshop cc 2019 破解教程
  12. matlab.m文件
  13. Apache-Tomcat-Ajp文件读取漏洞(CVE-2020-1938、CNVD-2020-10487)
  14. HiWork告诉你:拿什么来拯救你,我的时间!
  15. 独家出品 | 培训机构免费资源汇总
  16. 国产AT2401c完全替代RFX2401C直接兼容软件硬件
  17. python/php/java/nodejs+vue社区团购系统
  18. 外卖cps分销公众号小程序淘客项目,引发的思考(附0基础搭建源码)
  19. 迷你图书管理器1.2 - 面向对象+集合
  20. dz diy html用户信息,Discuz教程:个人资料设置只显示用户名的解决方法

热门文章

  1. Git-删除文件后找回-比较文件差异
  2. 如何安装、管理多个 NodeJS 版本?
  3. WPF在代码中创建DataTemplate时候的异常
  4. 第三:Python发送邮件时中文附件下载乱码
  5. php zend mvc 配置,理解Zend Framework 的MVC模式_PHP教程
  6. 2018麦考林杂志计算机科学,最新出炉|2018年麦考林杂志加拿大大学排名!
  7. 【第1篇】Python爬虫实战-王者荣耀高清壁纸下载
  8. JAVA对List进行手动分页
  9. EclipseLink+H2 快速搭建JPA开发环境
  10. JVM调优大全及实战总结