关于Huffman树:

大概就是那样子吧。

是这样的:对于最多只能有k个叉的树,我们想要使得∑val(i) * deep(i)最大

那么我们补0后建立小根堆即可。

最典型例题:合并果子。

然后是这个:

 /**************************************************************
Problem: 4198
Language: C++
Result: Accepted
Time:1032 ms
Memory:3896 kb
****************************************************************/ #include <cstdio>
#include <queue>
const int N = ;
typedef long long LL;
inline void max(LL &a, LL b) {
if(a < b) a = b;
return;
}
struct Node {
LL val, p;
bool operator < (const Node &x) const {
if(val != x.val) {
return val > x.val;
}
return p > x.p;
}
}; std::priority_queue<Node> Q; Node mk(LL v, LL p) {
Node ans;
ans.val = v;
ans.p = p;
return ans;
} int main() {
LL n, k, v;
scanf("%lld%lld", &n, &k);
for(int i = ; i <= n; i++) {
scanf("%lld", &v);
Q.push(mk(v, ));
}
while((n - ) % (k - ) != ) {
Q.push(mk(, ));
n++;
} LL ans = ; for(int i = ; i <= (n - ); i += (k - )) {
LL p = ;
v = ;
for(int j = ; j <= k; j++) {
Node nd = Q.top();
Q.pop();
max(p, nd.p);
v += nd.val;
}
ans += v;
Q.push(mk(v, p + ));
}
LL p = Q.top().p;
printf("%lld %lld", ans, p);
return ;
}

AC代码

之前写的太菜了......

对于这种要让叶权值 * 深度最小的最多k叉树,通解就是每层放k - 1个,然后多的一个向下延伸。

从下往上着构造,要添加0补全。

然后,可以用蚯蚓的套路优化常数(有排序的复杂度)。

如果给定的是有序的或者能够桶排,就能做到O(n + k)。

 #include <cstdio>
#include <algorithm>
#include <queue> typedef long long LL;
const int N = ; struct Node {
LL val, deep;
inline bool operator <(const Node &w) const {
if(val == w.val) {
return deep < w.deep;
}
return val < w.val;
}
Node(LL a = , LL b = ) {
val = a;
deep = b;
}
}a[N]; int top, head = ; std::queue<Node> Q; inline Node getmin() {
if(Q.empty()) {
return a[head++];
}
if(head > top || Q.front() < a[head]) {
Node t = Q.front();
Q.pop();
return t;
}
return a[head++];
} int main() {
LL n, k;
scanf("%lld%lld", &n, &k);
for(int i = ; i <= n; i++) {
scanf("%lld", &a[i].val);
a[i].deep = ;
} while((n - ) % (k - )) {
n++;
a[n].deep = ;
}
std::sort(a + , a + n + );
LL ans = , d = , lm = (n - ) / (k - );
top = n;
for(int i = ; i <= lm; i++) {
Node s;
for(int j = ; j <= k; j++) {
Node t = getmin();
s.val += t.val;
s.deep = std::max(s.deep, t.deep);
}
s.deep++;
Q.push(s);
ans += s.val;
d = std::max(d, s.deep);
} printf("%lld\n%lld\n", ans, d - );
return ;
}

新版AC代码

bzoj4198 荷马史诗的更多相关文章

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

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

  2. 【BZOJ4198】【NOI2015】荷马史诗(贪心,Huffman树)

    [BZOJ4198][NOI2015]荷马史诗(贪心,Huffman树) 题面 BZOJ 洛谷 题解 合并果子都是不知道多久以前做过的了.现在才知道原来本质就是一棵哈夫曼树啊. 这题我们仔细研究一下题 ...

  3. 【bzoj4198】【Noi2015】荷马史诗

    4198: [Noi2015]荷马史诗 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 2200  Solved: 1169[Submit][Statu ...

  4. 【BZOJ4198】[Noi2015]荷马史诗 贪心+堆

    [BZOJ4198][Noi2015]荷马史诗 Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅 ...

  5. [UOJ#130][BZOJ4198][Noi2015]荷马史诗

    [UOJ#130][BZOJ4198][Noi2015]荷马史诗 试题描述 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静 ...

  6. [BZOJ4198][Noi2015]荷马史诗

    4198: [Noi2015]荷马史诗 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 700  Solved: 365[Submit][Status] ...

  7. [BZOJ4198] [Noi2015] 荷马史诗 (贪心)

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

  8. BZOJ4198 & 洛谷2168 & UOJ130:[NOI2015]荷马史诗——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://www.luogu.org/problemnew/show/P2168 ht ...

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

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

随机推荐

  1. linux apache tomcat 安装和升级

    一,安装tomcat 注意!安装tomcat前需安装配置JDK,安装方式请参照这篇文章: http://www.cnblogs.com/blog4matto/p/5582054.html 1 tomc ...

  2. python之路--线程的其他方法

    一 . current_thread的用法 import threading import time from threading import Thread, current_thread def ...

  3. delphi中退出是弹出让你确定的几种确定对话框怎么写?

    procedure TForm2.btn1Click(Sender: TObject); begin if MessageBox(Handle, '你确定要退出系统吗?', '信息提示', MB_OK ...

  4. 循环神经网络RNN及LSTM

    一.循环神经网络RNN RNN综述 https://juejin.im/entry/5b97e36cf265da0aa81be239 RNN中为什么要采用tanh而不是ReLu作为激活函数?  htt ...

  5. .NET提供了三种后台输出js的方式:

    .NET提供了三种后台输出js的方式: 首先创建 js文件testjs.js {    Page.ClientScript.RegisterClientScriptInclude("keys ...

  6. NC部门考勤月报定制sql

    SELECT t_1.pk_psndoc pk_psndoc, t_1.pk_group pk_group, t_1.pyear pyear, t_1.month month, t_1.code ps ...

  7. Spring Boot 构建电商基础秒杀项目 (九) 商品列表 & 详情

    SpringBoot构建电商基础秒杀项目 学习笔记 ItemDOMapper.xml 添加 <select id="listItem" resultMap="Bas ...

  8. 模板-layui

    table数据格式化 {field:'IsTop',title:'是否置顶',width:150,templet:'#isTop'} <!-- 模板 --> <script type ...

  9. Sum of Consecutive Prime Numbers POJ - 2739 线性欧拉筛(线性欧拉筛证明)

    题意:给一个数 可以写出多少种  连续素数的合 思路:直接线性筛 筛素数 暴力找就行   (素数到n/2就可以停下了,优化一个常数) 其中:线性筛的证明参考:https://blog.csdn.net ...

  10. Android短信大全

    使用ListView实现点击条目跳转短信界面,并将内容传至短信页面: 代码如下:activity_main.xml: <?xml version="1.0" encoding ...