【洛谷P2168】[NOI2015]荷马史诗
2024-09-04 13:15:41
建一个k叉哈夫曼树,用堆维护一下
// luogu-judger-enable-o2
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define MAXN 1000010
#define max(i,j) ((i)>(j)?(i):(j))
#define int long long
int n,ans,k;
struct NODE{
int w,h;
} a[MAXN];
struct cmp{
bool operator()(NODE x,NODE y){
if(x.w!=y.w) return x.w>y.w; // 先按代价大小排序
else return x.h>y.h; // 再按子树深度排序
}
};
inline int read(){
int x=; char c=getchar();
while(c<''||c>'') c=getchar();
while(''<=c&&c<='') { x=(x<<)+(x<<)+c-''; c=getchar(); }
return x;
}
priority_queue< NODE, vector < NODE > , cmp > q0,q;
#undef int
int main()
#define int long long
{
n=read(); k=read();
int x; NODE p0;
p0.w=; p0.h=;
for(int i=;i<=n;i++){
x=read(); NODE p;
p.w=x; p.h=; q0.push(p);
}
q=q0; ans=;
int top=;
if((n-)%(k-)!=) top=k--(n-)%(k-);
for(int i=;i<=top;i++) q.push(p0);
while(q.size()>){
NODE s=p0;
for(int i=;i<=k;i++){
NODE b=q.top(); q.pop();
ans+=b.w; s.w+=b.w; s.h=max(s.h,b.h);
}
s.h++;
q.push(s);
}
NODE t=q.top();
printf("%lld\n%lld",ans,t.h-);
return ;
}
最新文章
- VB.NET操作Excel
- [No00006A]Js的addEventListener()及attachEvent()区别分析【js中的事件监听】
- linux打包与压缩
- Activity的Launch Mode
- PHP读取CSV数据写入数据库
- 2016年10月30日--JavaScript语法
- Effective Java之避免创建不必要的对象
- hdu 4003 Find Metal Mineral 树形DP
- loadrunner 脚本和replaylog中的中文乱码问题(转载)
- [wikioi]过河卒
- iOS开源 框架
- 【LeetCode练习题】Gas Station
- malloc实现原理
- 1.1 office安装
- js input输入事件兼容性问题
- 核心类生成-Mybatis Generator的使用
- mysql执行sql语句过程
- 修改openstack用户配额
- [2017BUAA软工助教]个人项目准备工作
- 不一样的go语言-athens私仓安装