【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模拟】搬砖的更多相关文章

  1. 国内平台比特币(Bitcoin)搬砖流程教学

    建议搬砖时要的价差,实际费用与利润请自行计算,避免亏损或白做工请自行拿捏利润. 请搬砖前要先自行操作与确认双边平台的存取速度.利於拿捏时间,避免时间差导致亏损. (所有内容 仅供参考 盈亏自负) 搬砖 ...

  2. 如何使用银联卡充值美元到BTC-E以及比特币搬砖教程

    1,名词解释 搬砖:就是在价格低的平台买入比特币,然后转移到价格高的平台卖出, 一般而言,BTC-E是国外三大比特币交易所中比特币单价最低的一个站,因为其需要用美元充值,相对不方便.之前国内比特币价格 ...

  3. 网络搬砖是件苦力活 CMS推荐GHOS博客程序

    搬砖不是技术活,而是苦力(bi)活,富有技术含量的苦力活说不定就是一门可以持续的生意. 我们不生产内容,我们只是互联网的内容搬运工,这是大部分不具备原创能力个人站长的心声.虽然原创能力不够,但是服务目 ...

  4. Software-Defined Networking之搬砖的故事

    在很久很久以前,有一个村子. 村里的每一户,都有一个男人和一个女人. 每一户,都以搬砖为生. 从不同的地方,搬到不同的地方. 男人负责搬砖,女人负责告诉男人往哪搬. 每个家庭,都服从村委会的指挥. 村 ...

  5. PS官方正式中文版(搬砖分享)

    https://pan.baidu.com/s/1c3IdQq0 PS官方正式中文版(搬砖分享) 注意事项: 1.安装开始前请先断网,在成功破解激活前请全程断网: 2.安装完成后先试运行软件一次,然后 ...

  6. 中国用户通过rchange用银联充值到PerfectMoney再给BTC-E充值进行搬砖的方法

    最近迷上了比特币这个疯狂的东西,相信很多技术人员都感兴趣. 比特币.莱特币钱包下载和把数据迁移到C盘以外其他盘的方法. 莱特币和山寨币的原理跟比特币基本上一样,可以参考这个方法进行,莱特币的钱包数据迁 ...

  7. NOJ——1656搬砖(DP)

    [1656] 搬砖 时间限制: 2000 ms 内存限制: 65535 K 问题描述 开学了,万恶的大二学长们又要领着大一的鲜肉们一起敲代码搬砖了,这不,著名的杨神拿着n块砖头,当然他把这n块砖头的重 ...

  8. 比特币搬砖对冲策略Python源码

    策略复制地址:https://www.fmz.com/strategy/21023 策略原理 比特币搬砖策略是入门程序化交易的基础策略.原理简单,是新手尝试程序化的好选择,在其黄金时期,比特币搬砖也带 ...

  9. 搬砖--杭电校赛(dfs)

    搬砖 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submissi ...

随机推荐

  1. EF(EntityFramework)与mysql使用,取数据报错,linq实体映射错误

    报错信息:LINQ to Entities does not recognize the method 'System.String ToString()' method, and this meth ...

  2. Netty中的HttpObjectAggregator

    Http的Get,POST Get请求包括两个部分: request line(包括method,request uri,protocol version)) header 基本样式: GET /?n ...

  3. webpack4 系列教程(十三):自动生成HTML文件

    作者按:因为教程所示图片使用的是 github 仓库图片,网速过慢的朋友请移步<webpack4 系列教程(十三):自动生成 HTML 文件>原文地址.更欢迎来我的小站看更多原创内容:go ...

  4. Java垃圾回收器的工作原理

    上课,老师照本宣科,实在难以理解,干脆就看书包里的Java书,正好看了Java的垃圾回收器是如何工作的,觉得有必要记录一下. 参考于 Java编程思想第四版(Thinking in Java) 老年代 ...

  5. Linux下Python安装完成后如何使用pip命令

    一.很多读者Python安装完成之后,想要下载相关的包,例如:numpy.pandas等Python中这些基础的包,但是,发现pip根本用不了,主要表现在一下几种情况: 二.出现这种情况其实并不意外, ...

  6. Python mysql 创建连接

    安装 pymysql 模块 pip3 install pymysql # python2, 默认无 pip 命令 # python3, 默认自带 pip3 命令 mysql基本操作 # 导入 pymy ...

  7. BZOJ2946 [Poi2000]公共串(后缀自动机)

    Description          给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l        读入单词 l        计算最长公共子串的长度 l        输 ...

  8. 移动端开发H5页面点击按钮后出现闪烁或黑色背景的解决办法

    H5页面在IOS端测试的时候发现,点击按钮会闪动,出现一个黑色的背景一闪而过,影响用户体验.最后通过度娘,找到解决方法: 就是给点击的元素添加一个CSS属性或者全局添加一个css. -webkit-t ...

  9. C# 利用PrintDocument定制打印单据

    本文是利用PrintDocument定制打印单据的小例子,仅供学习分享使用,如果不足之处,还请指正. 涉及知识点: PrintDocument :从 Windows 窗体应用程序打印时,定义一种可重用 ...

  10. The value of ESP was not properly saved across a function call 快速解决

    The value of ESP was not properly...快速解决 今天遇到这个问题,真的是非常头疼,期间电脑居然崩掉一次.所以,分享一下解决办法. 如果是:类定义的时候,新添加了属性, ...