【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. 从零开始学安全(十)●TCP/IP协议栈

    局域网靠mac 地址通信

  2. [android] 保存文件到SD卡

    /****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...

  3. mysql常用操作小节

    比如要将表user 中的字段 username修改为 name: ); 其他关于表字段信息的修改: 1.添加字段:给表 user 添加字段 password 在 id 后面; ) NOT NULL A ...

  4. Java基础IO流(二)字节流小案例

    JAVA基础IO流(一)https://www.cnblogs.com/deepSleeping/p/9693601.html ①读取指定文件内容,按照16进制输出到控制台 其中,Integer.to ...

  5. MyBatis中映射器Mapper概述

    MyBatis真正强大之处在于它的映射器.因为它异常强大并且编写相对简单,不仅比传统编写SQL语句做的更好并且能节省将近95%的代码量 XML中顶级元素汇总 cache: 给定命名空间的缓存配置 ca ...

  6. mysql date_add()函数的使用

    date_add(date,interval expr type)  类型(type) expr参数格式  说明 MICROSECOND 数值类型 以微妙为计算单位  SECOND 数值类型 以秒为计 ...

  7. 查询文章的上下篇Sql语句

    直接开入正题 文章内容页一般都会有上一篇和下一篇的功能: 那么查询上下篇的sql语句应该怎么写呢:示例数据表:zmd_article自增主键:id当前文章id:10 肯定有人说,这简单啊id+1和id ...

  8. 3款网页jQuery抽奖实例演示

    实例演示 实例演示 实例演示

  9. PHP7.27: Cookie and Session

    <?php // 有的浏览器不支持Cookie,这要考虑的 $cFile="count.txt"; $acctime=time(); if(file_exists($cFil ...

  10. 洛谷P4462 [CQOI2018]异或序列(莫队)

    题意 题目链接 Sol 一开始以为K每次都是给出的想了半天不会做. 然而发现读错题了维护个前缀异或和然后直接莫队搞就行,. #include<bits/stdc++.h> #define ...