UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树
【NOI2015】荷马史诗
因为不能有前缀关系,所以单词均为叶子节点,就是K叉哈夫曼树。第一问直接求解,第二问即第二关键字为树的高度。
- #include< cstdio >
- #include< algorithm >
- typedef unsigned long long ull;
- template
- inline void read(T&x)
- {
- x=0;bool f=0;char c=getchar();
- while((c<'0'||c>'9')&&c!='-')c=getchar(); if(c=='-')f=1,c=getchar();
- while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
- x=f?-x:x;
- }
- const int MAXN(100010);
- struct Data
- {
- ull val;int dep;
- inline bool operator <(const Data &A)const {return (val==A.val)?dep>A.dep:val>A.val;}
- }h[MAXN],New;int top;
- int n,k,First;ull Ans,sum,w[MAXN];
- void umax(int &a,int b){if(a<b)a=b;}
- int main()
- {
- // freopen("C.in","r",stdin);
- // freopen("C.out","w",stdout);
- read(n);read(k);
- for(int i=1;i<=n;i++)read(w[i]),sum+=w[i];
- for(int i=1;i<=n;i++)h[++top]=(Data){w[i],1};
- std::make_heap(h+1,h+1+top);
- First=(n-1)%(k-1) +1;
- // printf("%d\n",First);
- // printf("%llu\n",sum);
- if(First>1||n==1)
- {
- for(int i=1;i<=First;i++)
- {
- New.val+=h[1].val;
- Ans+=h[1].val;
- umax(New.dep,h[1].dep);
- std::pop_heap(h+1,h+1+top);top--;
- }
- New.dep++;h[++top]=New;
- std::push_heap(h+1,h+1+top);
- }
- while(top>1)
- {
- New.val=New.dep=0;
- for(int i=1;top&&i<=k;i++)
- {
- New.val+=h[1].val;
- Ans+=h[1].val;
- umax(New.dep,h[1].dep);
- std::pop_heap(h+1,h+1+top);top--;
- }
- New.dep++;
- // printf("%llu %d\n",New.val,New.dep);
- h[++top]=New;
- std::push_heap(h+1,h+1+top);
- }
- printf("%llu\n",Ans);
- printf("%d\n",h[1].dep-1);
- return 0;
- }
UOJ#130 【NOI2015】荷马史诗 K叉哈夫曼树的更多相关文章
- P2168 [NOI2015]荷马史诗 k叉哈夫曼树
思路:哈夫曼编码 提交:1次(参考题解) 题解:类似合并果子$QwQ$ 取出前$k$小(注意如果叶子结点不满的话要补全),合并起来再扔回堆里去. #include<cstdio> #inc ...
- AcWing:149. 荷马史诗(哈夫曼编码 + k叉哈夫曼树)
追逐影子的人,自己就是影子. ——荷马 达达最近迷上了文学. 她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>. 但是由<奥德赛>和<伊 ...
- hdu5884 Sort(二分+k叉哈夫曼树)
题目链接:hdu5884 Sort 题意:n个有序序列的归并排序.每次可以选择不超过k个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问k最小是多少. 题解:先二分k,然后在k给 ...
- 两个队列+k叉哈夫曼树 HDU 5884
// 两个队列+k叉哈夫曼树 HDU 5884 // camp题解: // 题意:nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过TT, ...
- 【CF884D】Boxes And Balls k叉哈夫曼树
题目大意:给定一个大小为 N 的集合,每次可以从中挑出 2 个或 3 个数进行合并,合并的代价是几个数的权值和,求将这些数合并成 1 个的最小代价是多少. 引理:K 叉哈夫曼树需要保证 \((n-1) ...
- 贪心法:K叉哈夫曼树
NOI2015荷马史诗 一部<荷马史诗>中有 n 种不同的单词,从 1 到 n 进行编号.其中第 i 种单词出现的总次数为 wi.Allison 想要用 k 进制串 si 来替换第 i 种 ...
- bzoj 4198 [ Noi 2015 ] 荷马史诗 —— 哈夫曼编码(k叉哈夫曼树)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4198 第一次写哈夫曼树!看了很多博客. 哈夫曼树 & 哈夫曼编码:https://w ...
- HDU 5884 Sort (二分+k叉哈夫曼树)
题意:n 个有序序列的归并排序.每次可以选择不超过 k 个序列进行合并,合并代价为这些序列的长度和.总的合并代价不能超过T, 问 k最小是多少. 析:首先二分一下这个 k .然后在给定 k 的情况下, ...
- BZOJ 4198: [Noi2015]荷马史诗 哈夫曼树 k叉哈夫曼树
https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://blog.csdn.net/chn_jz/article/details/7 ...
随机推荐
- 微信小程序-获取当前城市位置
CSDN链接 https://blog.csdn.net/weixin_42262436/article/details/80458430
- C#监听窗体新建/鼠标移入移出
在新建window窗体时会激活方法,并循环所有窗体,鼠标移动在重写方法的页面中也会激活 winform直接在继承了From窗体cs中 protected override void WndProc(r ...
- 菜鸟眼中的”AppSettings和ConnectionStrings“
前言 这次的机房收费系统重构,我们用到了这个配置文件.瞬间感觉高大上了许多,对新鲜的事务就是又陌生又好奇,通过看静静的博客,还有自己查资料花了点时间弄了弄,下面是我整理的结果. 内容 是什么 AppS ...
- Java Web之文件的上传及下载
一.文件的上传 1. 简介 > 将一个客户端的本地的文件发送到服务器中保存. > 上传文件是通过流的形式将文件发送给服务器. 2.表单的设置 1.向服务器上传一个文件时,表单要使用post ...
- Go入门基础手记
1. 配置环境变量(临时) export GOPATH=yourpath 2. 跨平台交叉编译 env GOOS=linux GOARCH=amd64 go build 3. test写法 // 首先 ...
- springboot 使用 mybatis + mapper
首先引入相关pom <dependency> <groupId>org.springframework.boot</groupId> <artifactId& ...
- 项目 08 WebSocket
项目班 08 WebSocket app.py 更新 添加两个路由 handlers = [ ('/', main.IndexHandler), ('/explore', main.ExploreHa ...
- kindle资源
化繁为简!Kindle 漫画和电子书 资源汇总 & 用法 刚入Kindle那会,在网上翻看了不少文章,有的讲怎么下载电子书,有的讲怎么看漫画,有的讲怎么设置推送邮箱…… 好吧,我不想在用Kin ...
- js中去掉字符中间空格和首尾空格
转载: https://www.jb51.net/article/109522.htm 1. 去掉字符串前后所有空格: 代码如下: ? 1 2 3 4 function Trim(str) { ...
- Microsoft JET Database Engine (0x80004005)未指定的错误解决
Microsoft JET Database Engine (0x80004005)未指定的错误,这个错误只有在使用Access数据库时才能出现 出现以上问题,可以使用以下步骤进行解决问题: 1.系统 ...