关于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. Sublime Text3配置

    { "default_encoding": "UTF-8", "font_size": 16.0, "tab_size" ...

  2. PhpStorm本地断点调试

    一.断点调试php环境搭建 1.检测本地php环境是否安装了Xdebug 在本地输出phpinfo():搜索Xdebug;如下图  如果没有安装,安装操作Xdebug如下: 将phpinfo();的信 ...

  3. 本地git连接远程github

    git要连接GitHub仓库,是通过SSH加密连接的,所以必须要创建SSH key ssh-key -t rsa -C "youremail@example.com" 这里邮箱必须 ...

  4. linux audit审计(7)--读懂audit日志

    让我们先来构造一条audit日志.在home目录下新建一个目录,然后配置一条audit规则,对这个目录的wrax,都记录审计日志: auditctl -w /home/audit_test -p wr ...

  5. python3 自动识图

    一.安装依赖库 pip install pytesseract pip install pillow 二.安装识图引擎tesseract-ocr https://pan.baidu.com/s/1Qa ...

  6. Delphi中Owner和Parent的区别

    Owner为创建者,Parent为容器 他们的类型不同,Owner为TComponent(元件),Parent为TWinControl(窗体控件) Parent属性是指构件的包容器,构件只能在此范围内 ...

  7. python 三目运算符

    格式: true_res if condition else false_res Meto 1: Meto 2: >>> x = 2 >>> x+1 if x!=1 ...

  8. Jackson将对象转换为json字符串时,设置默认的时间格式

    maven需要的依赖: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifac ...

  9. LDOOP设置关联后超出新起一页LinkNewPage

    关联打印的时候,top,left关联位置是相对于被关联打印项的偏移值,具体可查看本博客相关介绍博文:LODOP打印控件关联输出各内容 正常情况下,超文本超过打印项高度,或纸张高度会自动分页,如果超文本 ...

  10. 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join

    在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...