bzoj4198 荷马史诗
关于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 荷马史诗的更多相关文章
- bzoj4198 荷马史诗 哈夫曼编码
逐影子的人,自己就是影子. --荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的<荷马史诗>.但是由<奥德赛>和&l ...
- 【BZOJ4198】【NOI2015】荷马史诗(贪心,Huffman树)
[BZOJ4198][NOI2015]荷马史诗(贪心,Huffman树) 题面 BZOJ 洛谷 题解 合并果子都是不知道多久以前做过的了.现在才知道原来本质就是一棵哈夫曼树啊. 这题我们仔细研究一下题 ...
- 【bzoj4198】【Noi2015】荷马史诗
4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2200 Solved: 1169[Submit][Statu ...
- 【BZOJ4198】[Noi2015]荷马史诗 贪心+堆
[BZOJ4198][Noi2015]荷马史诗 Description 追逐影子的人,自己就是影子. ——荷马 Allison 最近迷上了文学.她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅 ...
- [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 & 洛谷2168 & UOJ130:[NOI2015]荷马史诗——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4198 https://www.luogu.org/problemnew/show/P2168 ht ...
- BZOJ4198: [Noi2015]荷马史诗(哈夫曼树)
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1824 Solved: 983[Submit][Status][Discuss] Descripti ...
随机推荐
- springboot No Identifier specified for entity的解决办法
今天在做一个项目的时候遇到一个问题,实体类忘了指定主键id,然后报如下错误,也是自己粗心大意造成的,在此记录下. java.lang.IllegalStateException: Failed to ...
- python学习笔记(11)--测验3: Python基础语法(下) (第7周)
斐波那契数列计算 B 描述 斐波那契数列如下: F(0) = 0, F(1) = 1 F(n) = F(n-1) + F(n-2) 编写一个计算斐波那契数列的函数,采用递归方式,输出不超过n的所有斐波 ...
- Lodop纯文本英文-等符号自动换行问题
ADD_PRINT_TEXT纯文本,宽度不够,高度足够,超宽会自动换行,高度不够会隐藏后面的内容.在超宽自动换行的时候,如果有-或()之类的,英文单词不拆分,或其他一些认为是不拆分的情况,会造成还没有 ...
- SQL Server 一张图让你秒懂联合表查询
- Ubuntu18.04下安装Sublime Text3!
这几天安装了Ubuntu18.04,然后在里面安装Sublime Text3,结果各种问题!各种BUG!试了网上各种办法!尼玛!都是坑爹的啊! 最后还是楼主自己解决了…… 废话不多说,直接按顺序执行下 ...
- BZOJ4477[Jsoi2015]字符串树——可持久化trie树
题目描述 萌萌买了一颗字符串树的种子,春天种下去以后夏天就能长出一棵很大的字符串树.字符串树很奇特,树枝上都密密麻麻写满了字符串,看上去很复杂的样子.[问题描述]字符串树本质上还是一棵树,即N个节点N ...
- 微信小程序——常用快捷键【四】
格式调整 ctrl+[, ctrl+]:代码行缩进(向前|向后) ctrl+shift+[, ctrl+shift+] :折叠打开代码块 ctrl+C, ctrl+V:复制粘贴,如果没有选中任何文件则 ...
- P1216 数字三角形
题目描述 观察下面的数字金字塔. 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大.每一步可以走到左下方的点也可以到达右下方的点. 7 3 8 8 1 0 2 7 4 4 4 5 ...
- LOJ6053 简单的函数 【Min_25筛】【埃拉托斯特尼筛】
先定义几个符号: []:若方括号内为一个值,则向下取整,否则为布尔判断 集合P:素数集合. 题目分析: 题目是一个积性函数.做法之一是洲阁筛,也可以采用Min_25筛. 对于一个可以进行Min_25筛 ...
- jsp大学作业:jsp编写单选,复选判断题及得分情况
project_1_1.jsp <%@ page contentType="text/html;charset=utf-8" language="java" ...