【NOI2015】荷马史诗

链接:http://uoj.ac/problem/130

因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树。第一问直接求解,第二问即第二关键字为树的高度。

  1. #include< cstdio >
  2. #include< algorithm >
  3.  
  4. typedef unsigned long long ull;
  5. template
  6. inline void read(T&x)
  7. {
  8. x=0;bool f=0;char c=getchar();
  9. while((c<'0'||c>'9')&&c!='-')c=getchar(); if(c=='-')f=1,c=getchar();
  10. while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
  11. x=f?-x:x;
  12. }
  13. const int MAXN(100010);
  14. struct Data
  15. {
  16. ull val;int dep;
  17. inline bool operator <(const Data &A)const {return (val==A.val)?dep>A.dep:val>A.val;}
  18. }h[MAXN],New;int top;
  19. int n,k,First;ull Ans,sum,w[MAXN];
  20. void umax(int &a,int b){if(a<b)a=b;}
  21. int main()
  22. {
  23. // freopen("C.in","r",stdin);
  24. // freopen("C.out","w",stdout);
  25. read(n);read(k);
  26. for(int i=1;i<=n;i++)read(w[i]),sum+=w[i];
  27. for(int i=1;i<=n;i++)h[++top]=(Data){w[i],1};
  28. std::make_heap(h+1,h+1+top);
  29. First=(n-1)%(k-1) +1;
  30. // printf("%d\n",First);
  31. // printf("%llu\n",sum);
  32. if(First>1||n==1)
  33. {
  34. for(int i=1;i<=First;i++)
  35. {
  36. New.val+=h[1].val;
  37. Ans+=h[1].val;
  38. umax(New.dep,h[1].dep);
  39. std::pop_heap(h+1,h+1+top);top--;
  40. }
  41. New.dep++;h[++top]=New;
  42. std::push_heap(h+1,h+1+top);
  43. }
  44. while(top>1)
  45. {
  46. New.val=New.dep=0;
  47. for(int i=1;top&&i<=k;i++)
  48. {
  49. New.val+=h[1].val;
  50. Ans+=h[1].val;
  51. umax(New.dep,h[1].dep);
  52. std::pop_heap(h+1,h+1+top);top--;
  53. }
  54. New.dep++;
  55. // printf("%llu %d\n",New.val,New.dep);
  56. h[++top]=New;
  57. std::push_heap(h+1,h+1+top);
  58. }
  59. printf("%llu\n",Ans);
  60. printf("%d\n",h[1].dep-1);
  61. return 0;
  62. }

UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树的更多相关文章

  1. P2168 [NOI2015]荷马史诗 k叉哈夫曼树

    思路:哈夫曼编码 提交:1次(参考题解) 题解:类似合并果子$QwQ$ 取出前$k$小(注意如果叶子结点不满的话要补全),合并起来再扔回堆里去. #include<cstdio> #inc ...

  2. AcWing:149. 荷马史诗(哈夫曼编码 + k叉哈夫曼树)

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

  3. hdu5884 Sort(二分+k叉哈夫曼树)

    题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给 ...

  4. 两个队列+k叉哈夫曼树 HDU 5884

    // 两个队列+k叉哈夫曼树 HDU 5884 // camp题解: // 题意:nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过TT, ...

  5. 【CF884D】Boxes And Balls k叉哈夫曼树

    题目大意:给定一个大小为 N 的集合,每次可以从中挑出 2 个或 3 个数进行合并,合并的代价是几个数的权值和,求将这些数合并成 1 个的最小代价是多少. 引理:K 叉哈夫曼树需要保证 \((n-1) ...

  6. 贪心法:K叉哈夫曼树

    NOI2015荷马史诗 一部<荷马史诗>中有 n 种不同的单词,从 1 到 n 进行编号.其中第 i 种单词出现的总次数为 wi.Allison 想要用 k 进制串 si 来替换第 i 种 ...

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

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

  8. HDU 5884 Sort (二分+k叉哈夫曼树)

    题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...

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

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

随机推荐

  1. 微信小程序-获取当前城市位置

    CSDN链接 https://blog.csdn.net/weixin_42262436/article/details/80458430

  2. C#监听窗体新建/鼠标移入移出

    在新建window窗体时会激活方法,并循环所有窗体,鼠标移动在重写方法的页面中也会激活 winform直接在继承了From窗体cs中 protected override void WndProc(r ...

  3. 菜鸟眼中的”AppSettings和ConnectionStrings“

    前言 这次的机房收费系统重构,我们用到了这个配置文件.瞬间感觉高大上了许多,对新鲜的事务就是又陌生又好奇,通过看静静的博客,还有自己查资料花了点时间弄了弄,下面是我整理的结果. 内容 是什么 AppS ...

  4. Java Web之文件的上传及下载

    一.文件的上传 1. 简介 > 将一个客户端的本地的文件发送到服务器中保存. > 上传文件是通过流的形式将文件发送给服务器. 2.表单的设置 1.向服务器上传一个文件时,表单要使用post ...

  5. Go入门基础手记

    1. 配置环境变量(临时) export GOPATH=yourpath 2. 跨平台交叉编译 env GOOS=linux GOARCH=amd64 go build 3. test写法 // 首先 ...

  6. springboot 使用 mybatis + mapper

    首先引入相关pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...

  7. 项目 08 WebSocket

    项目班 08 WebSocket app.py 更新 添加两个路由 handlers = [ ('/', main.IndexHandler), ('/explore', main.ExploreHa ...

  8. kindle资源

    化繁为简!Kindle 漫画和电子书 资源汇总 & 用法 刚入Kindle那会,在网上翻看了不少文章,有的讲怎么下载电子书,有的讲怎么看漫画,有的讲怎么设置推送邮箱…… 好吧,我不想在用Kin ...

  9. js中去掉字符中间空格和首尾空格

    转载: https://www.jb51.net/article/109522.htm 1.  去掉字符串前后所有空格: 代码如下: ? 1 2 3 4 function Trim(str)  {   ...

  10. Microsoft JET Database Engine (0x80004005)未指定的错误解决

    Microsoft JET Database Engine (0x80004005)未指定的错误,这个错误只有在使用Access数据库时才能出现 出现以上问题,可以使用以下步骤进行解决问题: 1.系统 ...