【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. Android Studio 日志工具

    在项目中提供5个方法打印日志 Log.v() 最常见的日志信息 Log.d() 调试信息 Log.i() 用于打印用户操作行为 Log.w()警告潜在风险 Log.e()报错信息 TAG 填入类名就好 ...

  2. 23.QT记事本

    描述 主要功能有: 新建,打开,保存,另存为,打印, 编辑,撤销,,拖放,xml配置文件读写,字体更改,查找替换 菜单栏,工具栏,状态栏的实现 如下图所示: 效果如下所示:   源码下载地址: htt ...

  3. youtube link for review STAT(1)

    Confidence Interval: https://www.youtube.com/watch?v=bekNKJoxYbQ Introduction to confidence interval ...

  4. hihoCoder编程练习赛52

    题目1 : 字符串排序 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 一般我们在对字符串排序时,都会按照字典序排序.当字符串只包含小写字母时,相当于按字母表" ...

  5. POJ1509 Glass Beads(最小表示法 后缀自动机)

    Time Limit: 3000MS   Memory Limit: 10000K Total Submissions: 4901   Accepted: 2765 Description Once ...

  6. Conccrent中 Unsafe类原理 以及 原子类AutomicXX的原理以及对Unsafe类的使用

    Unsafe类的介绍 Java中基于操作系统级别的原子操作类sun.misc.Unsafe,它是Java中对大多数锁机制实现的最基础类.请注意,JDK 1.8和之前JDK版本的中sun.misc.Un ...

  7. 一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)

    面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部 ...

  8. 产品经理说|AIOps 让告警管理变得更智能

    AIOps 人工智能和IT运营支撑 Ops 之间的故事,愈演愈烈,已经成为当今运维圈的热门话题,我打算从2篇文档分享我们在 AIOps 上一些探索和实践.(本篇)为什么事件(告警)处理需要 AIOps ...

  9. Keras实现卷积神经网络

    # -*- coding: utf-8 -*- """ Created on Sun Jan 20 11:25:29 2019 @author: zhen "& ...

  10. mssql sqlserver 使用sql脚本检测数据表中一列数据是否连续的方法分享

    原文地址:http://www.maomao365.com/?p=7335 摘要:    数据表中,有一列是自动流水号,由于各种操作异常原因(或者插入失败),此列数据会变的不连续,下文将讲述使用sql ...