【NOI2019模拟】搬砖
【NOI2019模拟】搬砖
Description
小火车很穷,只好去搬砖了。
小火车被工头要求搭建\(n\)座塔,第i个高度为\(H_i\),也就是由\(H_i\)块砖头组成。每次小火车可以携带至多\(k\)块砖头,由某座塔底出发,摆放砖头。他可以向左右两座塔的相同高度摆放砖头(即使是悬空的),也可以向那两个位置移动过去(必须有砖头才能移动),还可以向同一座塔的上一层攀爬(如果那里有砖头的话就直接爬,如果没有的话可以摆上砖头再爬过去),可惜携带砖头的他并不方便向下爬。请问他至少要多少次才能搭建完成呢?
Input
第一行两个整数\(n,k\),表示有\(n\)个纪念塔,每次你可以携带\(k\)块砖头。
第二行有\(n\)个整数表示\(H_i\)。
Output
一行一个整数表示答案。
Sample Input
5 10
2 1 2 1 2
Sample Output
3
不会贪心
因为如果我们从下往上搬砖上去了就下不来了,所以我们考虑倒着做,从上往下搬砖。用到类似的贪心思路的题还有“【NOI2017】蔬菜”。
我们考虑先将区间划分为多个子区间。假设处理区间\([l,r]\),我们设其中的最矮的纪念塔高度为\(H\)。然后我们从高度为\(H\)的位置切一刀。然后可能还剩下一堆小区间,再用同样的方法处理。
比如样例:我们先切一刀,得到了\([1,5](1)\),然后剩下了\([1,1](1),[3,3](1),[5,5](1)\)。我们称\([1,5](1)\)是剩下那些区间的上一级区间。
然后我们考虑从上往下搬砖。假设第\(i\)个区间还需要办\(x\)个砖,那么我们需要搬\(\lceil\frac{x}{k} \rceil\)。然后我们可能剩下了\(k*\lceil\frac{x}{k} \rceil-x\)个砖,那么我们就把它累加到它的上一级区间中。
为什么上面多出来的砖一定可以给上一级的区间贡献呢?因为我们可以理解为我们多出来的砖在经过上一级区间的时候就先摆放了,所以是合法的。
搬砖都搬不来了
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 100005
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n,k;
int h[N];
struct node {
int l,r;
ll h;
bool operator <(const node &x)const {
if(l!=x.l) return l<x.l;
if(r!=x.r) return r>x.r;
return h<x.h;
}
}t[N];
int L[N],R[N];
int st[N],top;
int fa[N];
vector<int>Line;
bool cmp(const int &a,const int &b) {return t[a].h<t[b].h;}
ll res[N],ans;
int q[N];
int main() {
n=Get(),k=Get();
for(int i=1;i<=n;i++) h[i]=Get();
h[0]=h[n+1]=-1;
st[top=1]=0;
for(int i=1;i<=n;i++) {
while(top&&h[st[top]]>=h[i]) top--;
L[i]=st[top]+1;
st[++top]=i;
}
st[top=1]=n+1;
for(int i=n;i>=1;i--) {
while(top&&h[st[top]]>=h[i]) top--;
R[i]=st[top]-1;
st[++top]=i;
}
for(int i=1;i<=n;i++) t[i]=(node) {L[i],R[i],h[i]};
sort(t+1,t+1+n);
t[0].h=-1;
int tot=0;
for(int i=1;i<=n;i++) {
if(t[tot]<t[i]) t[++tot]=t[i];
}
for(int i=1;i<=tot;i++) {
while(Line.size()&&t[Line.back()].r<t[i].l) Line.pop_back();
if(Line.size()) {
fa[i]=Line.back();
}
Line.push_back(i);
}
for(int i=1;i<=tot;i++) q[i]=i;
sort(q+1,q+1+tot,cmp);
for(int i=tot;i>=1;i--) {
int now=q[i];
if(fa[now]) t[now].h-=t[fa[now]].h;
ll ned=1ll*t[now].h*(t[now].r-t[now].l+1);
if(res[now]>=ned) {
res[now]-=ned;
res[fa[now]]+=res[now];
} else {
ned-=res[now];
ll t=(ned+k-1)/k;
ans+=t;
res[fa[now]]+=t*k-ned;
}
}
cout<<ans;
return 0;
}
【NOI2019模拟】搬砖的更多相关文章
- 国内平台比特币(Bitcoin)搬砖流程教学
建议搬砖时要的价差,实际费用与利润请自行计算,避免亏损或白做工请自行拿捏利润. 请搬砖前要先自行操作与确认双边平台的存取速度.利於拿捏时间,避免时间差导致亏损. (所有内容 仅供参考 盈亏自负) 搬砖 ...
- 如何使用银联卡充值美元到BTC-E以及比特币搬砖教程
1,名词解释 搬砖:就是在价格低的平台买入比特币,然后转移到价格高的平台卖出, 一般而言,BTC-E是国外三大比特币交易所中比特币单价最低的一个站,因为其需要用美元充值,相对不方便.之前国内比特币价格 ...
- 网络搬砖是件苦力活 CMS推荐GHOS博客程序
搬砖不是技术活,而是苦力(bi)活,富有技术含量的苦力活说不定就是一门可以持续的生意. 我们不生产内容,我们只是互联网的内容搬运工,这是大部分不具备原创能力个人站长的心声.虽然原创能力不够,但是服务目 ...
- Software-Defined Networking之搬砖的故事
在很久很久以前,有一个村子. 村里的每一户,都有一个男人和一个女人. 每一户,都以搬砖为生. 从不同的地方,搬到不同的地方. 男人负责搬砖,女人负责告诉男人往哪搬. 每个家庭,都服从村委会的指挥. 村 ...
- PS官方正式中文版(搬砖分享)
https://pan.baidu.com/s/1c3IdQq0 PS官方正式中文版(搬砖分享) 注意事项: 1.安装开始前请先断网,在成功破解激活前请全程断网: 2.安装完成后先试运行软件一次,然后 ...
- 中国用户通过rchange用银联充值到PerfectMoney再给BTC-E充值进行搬砖的方法
最近迷上了比特币这个疯狂的东西,相信很多技术人员都感兴趣. 比特币.莱特币钱包下载和把数据迁移到C盘以外其他盘的方法. 莱特币和山寨币的原理跟比特币基本上一样,可以参考这个方法进行,莱特币的钱包数据迁 ...
- NOJ——1656搬砖(DP)
[1656] 搬砖 时间限制: 2000 ms 内存限制: 65535 K 问题描述 开学了,万恶的大二学长们又要领着大一的鲜肉们一起敲代码搬砖了,这不,著名的杨神拿着n块砖头,当然他把这n块砖头的重 ...
- 比特币搬砖对冲策略Python源码
策略复制地址:https://www.fmz.com/strategy/21023 策略原理 比特币搬砖策略是入门程序化交易的基础策略.原理简单,是新手尝试程序化的好选择,在其黄金时期,比特币搬砖也带 ...
- 搬砖--杭电校赛(dfs)
搬砖 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Submissi ...
随机推荐
- SET XACT_ABORT ON [SQL SERVER] 设置事务全部回滚
SET XACT_ABORT ON 设置事务回滚的默认是OFF. 当为ON时,如果你存储中的某个地方出了问题,整个事务中的语句都会回滚为OFF时,只回滚错误的地方
- mongodb "Element '{0}' does not match any field or property of class" 异常的解决方法
在序列化的对象上增加 [BsonIgnoreExtraElements]
- Prism 学习:从配置文件中加载 Module
之前我们已经了解过,如何从指定的目录中来加载 Module(原文),现在我们来看,如何从应用程序的配置文件中来加载 Module.以这种方式来加载 Module 的优点包括:1. 被加载的 Modul ...
- Java实现Base64加密
阅读本文约“2.5分钟” Java加解密系列,介绍Java加密解密的基础知识,并使用Base64算法实现加解密. 对于加密在企业中是非常常见的,就如邮件的传输,每个企业都会有自己设置安全方式,设置加密 ...
- JSJ—编译器与虚拟机哪个重要?
阅读本文约“2分钟” 熟悉Java的朋友都知道虚拟机还有编译器,那么它们各自主要的功能是什么?谁比较重要呢?让我们来了解一下这两位美女的故事. 虚拟机可以说就是Java,她能让程序运行起来. 但是编译 ...
- myeclipse无法部署项目的解决
一.问题 myeclipse无法部署项目,点击这个部署按钮没有反应. 二.解决办法 1.找到myeclipse的工作空间,也就是启动时的那个项目保存的空间,我的是在D:\myeclipse_works ...
- webpack4 系列教程(十五):开发模式与webpack-dev-server
作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十五):开发模式与 webpack-dev-server>原文地址.更欢迎来我的 ...
- date('Y-m-d H:i:s',time()) 与 date('Y-m-d h:i:s',time())区别是什么
date('Y-m-d H:i:s',time()) 按24小时制 date('Y-m-d h:i:s',time()) 按12小时制
- 搞清Image加载事件(onload)、加载状态(complete)后,实现图片的本地预览,并自适应于父元素内(完成)
onload与complete介绍 complete只是HTMLImageElement对象的一个属性,可以判断图片加载完成,不管图片是不是有缓存:而onload则是这个Image对象的load事件回 ...
- 2018-08-11 中文代码示例之Spring Boot 2.0.3问好
上次试用Spring Boot还是两年前: 中文代码示例之Spring Boot 1.3.3演示. 打算用在一个讨论组内小项目上, 于是从官网Building an Application with ...