合并果子加强版.......

哈夫曼树是一种特别的贪心算法,它的作用是使若干个点合并成一棵树,每次合并新建一个节点连接两个合并根并形成一个新的根,使叶子节点的权值乘上其到根的路径长的和最短(等价于每次合并的代价是合并根的权值和,求最小代价)。实现过程就是每次合并权值最小的两个节点,具体一下就是建个森林,每次取最小的两个然后权值加和再放入,重复。

他的实际应用就是哈夫曼编码,拓展就是k叉(本题),对于k叉也就是k进制,如果叶子节点不是1+(k-1)*x的形式,那么就加权值为0的点使他变成此种形式,不能到最后一次再加,那样做不是最优树。

关于哈夫曼编码有静态(本题)和动态,并不会动态......

具体实现的话,工程里是循环找最小,oi里是优先队列。

#include <cstdio>
#include <cstring>
#include <algorithm>
#define HoN Heap::
#define make(a,b) ((Heap::V){(a),(b)})
typedef long long LL;
const int N=;
namespace Heap{
struct V{
LL val;int deep;
inline friend bool operator <(V a,V b);
}k[N];
int len;
inline bool operator <(V a,V b){
return a.val<b.val||(a.val==b.val&&a.deep<b.deep);
}
inline bool empty(){return len==;}
inline V top(){return k[];}
inline int size(){return len;}
inline void pop(){
k[]=k[len--];register int now=;
while(now<=(len>>)){
int next=now<<;
if(next<len&&k[next|]<k[next])next|=;
if(k[now]<k[next])return;
std::swap(k[now],k[next]),now=next;
}
}
inline void push(V key){
k[++len]=key;register int now=len;
while(now!=&&k[now]<k[now>>])
std::swap(k[now],k[now>>]),now>>=;
}
}
int n,k;
LL ans;
int main(){
scanf("%d%d",&n,&k);LL x;
for(int i=;i<=n;++i)
scanf("%lld",&x),HoN push(make(x,));
if(k!=&&n%(k-)!=){
if(n%(k-)==)HoN push(make(,)),++n;
else{
for(int i=;i<=k-(n%(k-));++i)
HoN push(make(,));
n+=n%(k-);
}
}
int m=k==?n-:n/(k-);
int max;HoN V use;
while(m--){
x=,max=;
for(int i=;i<=k;++i)
use=HoN top(),HoN pop(),x+=use.val,max=std::max(max,use.deep);
ans+=x,HoN push(make(x,max+));
}
printf("%lld\n%d",ans,HoN top().deep-);
return ;
}

【BZOJ 4198】[Noi2015]荷马史诗 哈夫曼编码的更多相关文章

  1. bzoj 4198 [Noi2015]荷马史诗——哈夫曼树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 学习一下哈夫曼树.https://www.cnblogs.com/Zinn/p/940 ...

  2. BZOJ 4198: [Noi2015]荷马史诗 哈夫曼树 k叉哈夫曼树

    https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://blog.csdn.net/chn_jz/article/details/7 ...

  3. bzoj 4198: [Noi2015]荷马史诗

    Description 追逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...

  4. 洛谷P2168 [NOI2015] 荷马史诗 [哈夫曼树]

    题目传送门 荷马史诗 Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马 ...

  5. BZOJ4198: [Noi2015]荷马史诗(哈夫曼树)

    Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1824  Solved: 983[Submit][Status][Discuss] Descripti ...

  6. bzoj4198 荷马史诗 哈夫曼编码

    逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和&l ...

  7. bzoj 4198 [ Noi 2015 ] 荷马史诗 —— 哈夫曼编码(k叉哈夫曼树)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 第一次写哈夫曼树!看了很多博客. 哈夫曼树 & 哈夫曼编码:https://w ...

  8. bzoj 4198: [Noi2015]荷马史诗【哈夫曼树+贪心】

    和合并果子类似(但是是第一次听说哈夫曼树这种东西) 做法也类似,就是因为不用知道树的形态,所以贪心的把最小的k个点合为一个节点,然后依次向上累加即可,具体做法同合并果子(但是使用优先队列 注意这里可能 ...

  9. 【NOI2015】荷马史诗 - 哈夫曼树

    题目描述 追逐影子的人,自己就是影子 ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛&g ...

随机推荐

  1. 一些斗鱼TV Web API [Some DouyuTv API]

    一些斗鱼TV Web API [Some DouyuTv API]   写在最前 去年TI5前开发了dotaonly.com,网站需要用到各个直播平台API.不像国外网站Twitch那样开放,都有现成 ...

  2. ruby json解析&生成

    JSON 通常用于与服务端交换数据. 在接收服务器数据时一般是字符串. 我们可以使用 JSON.parse() 方法将数据转换为 ruby 对象. 一. json字符串解析 require 'json ...

  3. dedecms织梦首页被篡改 网站被黑被跳转的解决办法建议

    2018年的中秋节即将来临,我们Sine安全公司,最近接到很多用dedecms程序的企业公司网站客户的反馈,说是公司网站经常被篡改,包括网站首页的标题内容以及描述内容,都被改成了什么北京赛车,北京PK ...

  4. 常用数字信号的产生(C实现)-ARMA模型数据生成

    ARMA模型属于信号现代谱估计的范畴,AR模型常用于信号的线性预测.AR模型最后归结为线性方程,MA最后为非线性方程,因此,AR模型使用较多. AR模型最后归结为解Yule-Walker方程,对应矩阵 ...

  5. dns文件

    1.dns简介 dns为域名解析系统,当本地浏览器输入域名访问网站时,如果本地host中没有配置域名与IP的对应关系,那么域名信息将会被发送到dns服务器上,由dns服务器将域名解析为IP(过程较为复 ...

  6. office 总结

    wps word中双击格式刷即可开启永久格式刷

  7. 接口和lambda表达式笔记

    接口 接口是双方,即服务提供方和想让它们的对象对服务是可用的那些类,之间约定的一种机制. 声明一个接口 public interface IntSequence{ //不提供实现,则该方法为抽象方法, ...

  8. malloc分配失败的两个现象

    在实际代码中,malloc的反复分配释放,可能会导致某一次malloc分配失败,虽然上一次调用malloc分配成功(然后释放),下一次在相同地方调用malloc分配可能会失败,疑问在于,既然上一次分配 ...

  9. LeetCode题目解答

    LeetCode题目解答——Easy部分 Posted on 2014 年 11 月 3 日 by 四火 [Updated on 9/22/2017] 如今回头看来,里面很多做法都不是最佳的,有的从复 ...

  10. PostgreSQL 10.0 压缩版的 pgAdmin 不能用的问题

    PostgreSQL终于发布10.0正式版了!下载压缩版的更新了一下本机的版本,然后打开pgAdmin的时候总是报错“The application server could not be conta ...