NOI 2015 荷马史诗

来源:互联网 发布:使用java制作电脑程序 编辑:程序博客网 时间:2024/05/01 14:19

题意:
扩展的Huffman编码(由以前的二进制变为了k进制)
求编码后文章最短长度和Huffman树的最小高度(或者说最长串最短长度,当然是在文章最短前提下)
你不知道Huffman编码?
你知道Huffman编码但不知道是怎么回事?
看CLRS(算法导论)贪心那一章吧,无比详细,伪代码,图解,证明样样俱全;
你没有CLRS?
白书(算法竞赛入门经典)上也有(但不如CLRS的详细);
连白书都没有?
百(baí)度(chī)百(bì)科(kēng);

题解:
既然已经知道是Huffman编码了那么思路就比较明确了:
仿照Huffman二叉形式写k叉;
二叉形式一次弹出两个(最小值),那k叉一次弹出k个(最小值);
那么就用堆(不是k叉堆);
你用splay?好像也可以;
堆中保存Huffman树中串出现频率和,以及Huffman树的深度;
比较时先比较频率和,再比较深度(不可不比,要保证Huffman树高最小);
每次合并时,ans都要加上合并后长度(要不然求的是串频率和),而深度在取最大后再插入时要加一;
当堆中只有一个元素时退出,这时,ans和该元素深度即为答案;
初始化堆时,各元素深度为0,若n!≡1mod(k-1),那么补齐n,增加的新元素频率为0(显然),深度为0;
重要提示:
想省空间的一定要注意什么时候是long long int,什么时候是 int,尤其注意中间变量!
其实不必担心k太大,用时大概是O(knlogn/(k-1));
注: http://blog.csdn.net/Quack_quack/article/details/46958413,你也可以直接看他写的题解;

0 0