BZOJ4198:[NOI2015]荷马史诗
浅谈\(Huffman\)树:https://www.cnblogs.com/AKMer/p/10300870.html
题目传送门:https://lydsy.com/JudgeOnline/problem.php?id=4198
根据题意描述,这就是要你建一棵\(k\)叉\(Huffman\)树,并且还是棵\(trie\)树。
然后记个深度,权值相同的时候选深度小的,就可以使得最长单词最短了,也就是这棵\(trie\)树会尽量扁。
时间复杂度:\(O(nlogn)\)
空间复杂度:\(O(nk)\)
代码如下:
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
ll sum_len;
ll w[maxn];
int n,tot,k,mx_dep;
ll read() {
ll x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
}
struct node {
ll cnt;
int dep,id;
node() {}
node(ll _cnt,int _dep,int _id) {
cnt=_cnt,dep=_dep,id=_id;
}
bool operator<(const node &a)const {
if(cnt==a.cnt)return dep<a.dep;
return cnt<a.cnt;
}
};
struct Heap {
int tot;
node tree[maxn];
void ins(node a) {
tree[++tot]=a;
int pos=tot;
while(pos>1) {
if(tree[pos]<tree[pos>>1])
swap(tree[pos],tree[pos>>1]),pos>>=1;
else break;
}
}
node pop() {
node res=tree[1];
tree[1]=tree[tot--];
int pos=1,son=2;
while(son<=tot) {
if(son<tot&&tree[son|1]<tree[son])son|=1;
if(tree[son]<tree[pos])
swap(tree[son],tree[pos]),pos=son,son=pos<<1;
else break;
}
return res;
}
}T;
struct trie {
int son[maxn][10];
void calc_ans(int u,int dep) {
if(!son[u][0]) {
mx_dep=max(mx_dep,dep);
sum_len+=w[u]*dep;
return;
}
for(int i=0;i<k;i++)
calc_ans(son[u][i],dep+1);
}
}c;
int main() {
tot=n=read(),k=read();
for(int i=1;i<=n;i++) {
w[i]=read();
T.ins(node(w[i],1,i));
}
while((n-1)%(k-1))
tot++,n++,T.ins(node(0,1,tot));
while(T.tot!=1) {
ll tmp=0;int dep=0;++tot;
for(int i=0;i<k;i++) {
node word=T.pop();
c.son[tot][i]=word.id;
tmp+=word.cnt,dep=max(dep,word.dep);
}
T.ins(node(tmp,dep+1,tot));
}
c.calc_ans(T.tree[1].id,0);
printf("%lld\n%d\n",sum_len,mx_dep);
return 0;
}
BZOJ4198:[NOI2015]荷马史诗的更多相关文章
- [UOJ#130][BZOJ4198][Noi2015]荷马史诗
[UOJ#130][BZOJ4198][Noi2015]荷马史诗 试题描述 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静 ...
- [BZOJ4198][Noi2015]荷马史诗
4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 700 Solved: 365[Submit][Status] ...
- [BZOJ4198] [Noi2015] 荷马史诗 (贪心)
Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是 ...
- BZOJ4198: [Noi2015]荷马史诗(哈夫曼树)
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1824 Solved: 983[Submit][Status][Discuss] Descripti ...
- 【BZOJ4198】[Noi2015]荷马史诗 贪心+堆
[BZOJ4198][Noi2015]荷马史诗 Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅 ...
- BZOJ_4198_[Noi2015]荷马史诗_huffman实现
BZOJ_4198_[Noi2015]荷马史诗_huffman实现 题意: Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗> ...
- 洛谷 P2168 [NOI2015]荷马史诗 解题报告
P2168 [NOI2015]荷马史诗 题目描述 追逐影子的人,自己就是影子 --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷 ...
- BZOJ4198 & 洛谷2168 & UOJ130:[NOI2015]荷马史诗——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://www.luogu.org/problemnew/show/P2168 ht ...
- bzoj 4198: [Noi2015]荷马史诗
Description 追逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由& ...
- [Noi2015]荷马史诗
来自FallDream的博客,未经允许,请勿转载,谢谢. 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的 ...
随机推荐
- Swing 添加超链接 打开页面
http://lazycat774880994.iteye.com/blog/567412 Swing中打开一个连接或者web页面的一些记录,这几种方式是在项目中有这样子用到过,特来记录一下,以便下 ...
- 在IOS开发中,项目的目录结构如何搭建?
网上有很多关于IOS开发的学习资料.然而却很少有关于设计一个项目时,如何设计其目录结构?这对于自学IOS的程序猿们,无疑有诸多不利.接下来,我就简单的谈下真正在公司中,项目的目录结构如何搭建: 以上为 ...
- [Python] 弗洛伊德(Floyd)算法求图的直径并记录路径
相关概念 对于一个图G=(V, E),求图中两点u, v间最短路径长度,称为图的最短路径问题.最短路径中最长的称为图的直径. 其中,求图中确定的某两点的最短路径算法,称为单源最短路径算法.求图中任意两 ...
- groupby和agg的使用
先来看一段代码: 分析下groupby和agg的联合使用: reset_index()表示重新设置索引 agg传进来的统计特征: 按照A这一列作聚合,C这一列作统计 注意:df = df.groupb ...
- codeforces 439D 思维
题意:两个数组a,b,每次操作可将其中一个数组的一个数字加1或减1,求最小操作次数使得a数组的最小值大于等于b数组的最大值. 思路: 解法一:考虑最终状态,假设a为数组a中最小的数,b为数组b中最大的 ...
- mysql删除重复记录
Solution 1: Add Unique Index on your table: ALTER IGNORE TABLE `TableA` ADD UNIQUE INDEX (`member_id ...
- Centos7 远程登录端口22 设置
第一步 #查看本机是否安装SSH软件包 [root@localhost ~]# rpm -qa | grep ssh openssh-server-6.6.1p1-12.el7_1.x86_64 op ...
- table-layout 属性
最近被测试提了一个bug,表单的某个字段有1300的字数限制,测试填了1300字,提交后,表格上的呈现丑爆了,那个字段的所在的列撑满了整个表格,其他列被压缩的很小. 后来知道了table-layout ...
- 安装,配置webpack.
1.下载node.js 2.在需要用到webpack的项目下打开命令窗口运行npm init生成package.js 3.安装webpack,使用npm install webpack --save- ...
- swoole帮助文档
入门指引 [编辑本页] Swoole虽然是标准的PHP扩展,实际上与普通的扩展不同.普通的扩展只是提供一个库函数.而swoole扩展在运行后会接管PHP的控制权,进入事件循环.当IO事件发生后,swo ...