【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块
【题目】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)。
【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块的更多相关文章
- 哈夫曼树(Huffman Tree)与哈夫曼编码
哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman coding)
- 哈夫曼树(Huffman)的JS实现
我本身并不懂哈夫曼树也不知道有什么用,GOOGLE了下,也只是一知半解,只是刚好看到有JAVA实现版,又看了下生成原理,感觉挺有意思,就写了一下 有些地方可以优化,效率不怎么样的,纯好玩,也不保证一定 ...
- 哈夫曼树【最优二叉树】【Huffman】
[转载]只为让价值共享,如有侵权敬请见谅! 一.哈夫曼树的概念和定义 什么是哈夫曼树? 让我们先举一个例子. 判定树: 在很多问题的处理过程中,需要进行大量的条件判断,这些判断结构的设 ...
- 哈夫曼树Huffman
哈夫曼树处理这样的一种问题: 给出一棵n个叶子的k叉树,每个叶子有一个权值wi,要求最小化∑wi*di di表示,第i个叶子节点到根节点的距离.(一般是边数) 处理方法比较固定. 贪心的思路:我们让权 ...
- 04-树6. Huffman Codes--优先队列(堆)在哈夫曼树与哈夫曼编码上的应用
题目来源:http://www.patest.cn/contests/mooc-ds/04-%E6%A0%916 In 1953, David A. Huffman published his pap ...
- Python---哈夫曼树---Huffman Tree
今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...
- [算法]Huffman树(哈夫曼树)
目录 一.关于Huffman树 二.具体实现 例1:P1090 合并果子 例2:P2168 [NOI2015]荷马史诗 一.关于Huffman树 Huffman树(哈夫曼树)可以解决下述问题: 一颗\ ...
- 数据结构-二叉树(6)哈夫曼树(Huffman树)/最优二叉树
树的路径长度是从树根到每一个结点的路径长度(经过的边数)之和. n个结点的一般二叉树,为完全二叉树时取最小路径长度PL=0+1+1+2+2+2+2+… 带权路径长度=根结点到任意结点的路径长度*该结点 ...
- Codeforces 700D - Huffman Coding on Segment(莫队+根分)
Codeforces 题目传送门 & 洛谷题目传送门 好家伙,刚拿到此题时我连啥是 huffman 编码都不知道 一种对 \(k\) 个字符进行的 huffman 编码的方案可以看作一个由 \ ...
随机推荐
- cxDBTreelist一些使用方法
一.导出EXCEL TXT HTML: uses cxTLExportLink; cxExportTLToEXCEL(dm.SaveDialog.FileName,cxDBTreeList1, ...
- 基于JVM原理、JMM模型和CPU缓存模型深入理解Java并发编程
许多以Java多线程开发为主题的技术书籍,都会把对Java虚拟机和Java内存模型的讲解,作为讲授Java并发编程开发的主要内容,有的还深入到计算机系统的内存.CPU.缓存等予以说明.实际上,在实际的 ...
- 【.Net】c# 让double保留两位小数
1.Math.Round(0.333333,2);//按照四舍五入的国际标准2. double dbdata=0.335333; string str1=String.Format(&qu ...
- NOIP2011
DAY1 铺地毯 (carpet.cpp/c/pas) 模拟 倒序离线处理 program carpet; var l,w:..,..] of longint; n,i,a,b,g,k,x,y:lon ...
- 锁对象-Lock: 同步问题更完美的处理方式 (ReentrantReadWriteLock读写锁的使用/源码分析)
Lock是java.util.concurrent.locks包下的接口,Lock 实现提供了比使用synchronized 方法和语句可获得的更广泛的锁定操作,它能以更优雅的方式处理线程同步问题,我 ...
- Fortinet Security Fabric
Fortinet Security Fabric 这个世界从不固步自封.在技术方面,这意味着解决方案供应商必须保持不断创新和探索才能实现生存与发展. 在网络安全领域,这更是至理名言.许多黑客都是才华横 ...
- maven简单理解
前言: maven项目也是一个项目,类似于javaProject,javaWebProject,就是多了些功能,其他也没啥,所以大家接触的时候不要害怕! 1 . 帮你下载jar包 maven项目会有一 ...
- 【刷题】BZOJ 2190 [SDOI2008]仪仗队
Description 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视线所及的学生人数来判断队伍是 ...
- 安装MySql出现Error Nr.1045的解决办法
如图,最后一步出现这个错误框 这是因为上次安装过MySql,其用户数据在卸载的时候没有被删除掉,解决办法如下: 显示隐藏的文件夹,打开C盘,找到下图文件删除之 删除之后再安装一遍MySQL,就可以了
- 模板:快速傅里叶变换(FFT)
参考:http://blog.csdn.net/f_zyj/article/details/76037583 如果公式炸了请去我的csdn博客:http://blog.csdn.net/luyouqi ...