WYT的刷子

WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米;每列的高度单位也为米,由输入数据给出)。

使用刷子的规则是:

1.与地面垂直,从栅栏的底部向上刷

2.每次刷的宽度为M米(当剩余栅栏宽度不够M米的话,刷子也可以使用,具体看样例2)

3.对于连续的M列栅栏,刷子从底向上,刷到的高度只能到这M列栅栏的最低高度。

WYT请你回答两个问题:

1、最少有多少个单位面积不能刷到(单位面积为1平米)

2、在满足第一问的条件下,最少刷几次?

输入

共两行:

第一行两个整数N和M。

第二行共N个整数,表示N列栅栏的高度

输出

一行,两个整数,分别为最少剩余的单位面积数量和最少刷的次数。

Input1:

5 3

5 3 4 4 5

Output1:

3

2

Input2:

10 3

3 3 3 3 3 3 3 3 3 3

Output2:

0

4

Input3:

7 4

1 2 3 4 3

Output3:

4

4

样例1的解释:

高度分别为       5     3    4     4     5

如上:

黄色的方块表示共有3个单位面积没刷上

绿色的框和红色的框表示一共刷了两次。

数据范围:

30%的数据:N<=10^3

50%的数据:N<=10^5

100%的数据:1<=N<=10^6, 1<=M<=10^6,N>=M, 每列栅栏的高度<=10^6.

思路:

单调栈裸题

利用和求最大子矩形一样的方法,我们可以用单调栈求出每个高度它对应的区间

如果这个区间小于m,则显然刷不到这个点的最高处

然后我们O(N)的扫三遍

第一遍判出哪些地方一定到不了最高点

第二遍和第三遍求出这些到达不了最高点的地方能达到多高

然后再O(n)扫一遍

就能得到有多少个涂不了色的了

至于涂得次数,贪心就好了

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rii register int i
#define rij register int j
using namespace std;
int n,m,zl[],r[],l[];
long long sum;
int sta[],top,sj[],bj[];
inline int rd(){
register int x=,f=;char ch=getchar();
while(!isdigit(ch)) {f=ch=='-'?:;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return f?x:-x;
}
int main()
{
freopen("wyt.in","r",stdin);
freopen("wyt.out","w",stdout);
n=rd(),m=rd();
for(rii=;i<=n;i++)
{
zl[i]=rd();
sum+=zl[i];
}
for(rii=;i<=n;i++)
{
if(top==)
{
top++;
sta[top]=i;
continue;
}
while(zl[sta[top]]>zl[i])
{
r[sta[top]]=i-;
top--;
}
top++;
sta[top]=i;
}
while(top!=)
{
r[sta[top]]=n;
top--;
}
for(rii=n;i>=;i--)
{
if(top==)
{
top++;
sta[top]=i;
continue;
}
while(zl[sta[top]]>zl[i])
{
l[sta[top]]=i+;
top--;
}
top++;
sta[top]=i;
}
while(top!=)
{
l[sta[top]]=;
top--;
}
for(rii=;i<=n;i++)
{
if(r[i]-l[i]+<m)
{
bj[i]=;
}
}
for(rii=;i<=n;i++)
{
if(bj[i]==)
{
sj[i]=sj[i-];
}
else
{
sj[i]=zl[i];
}
}
for(rii=n;i>=;i--)
{
if(bj[i]==)
{
sj[i]=max(sj[i+],sj[i]);
}
}
for(rii=;i<=n;i++)
{
sum-=sj[i];
}
cout<<sum<<endl;
int ans=;
int val=sj[],l=;
for(rii=;i<=n;i++)
{
if(sj[i]!=val)
{
int sl=(i-l)/m;
if(sl*m<(i-l))
{
sl++;
}
ans+=sl;
l=i;
val=sj[i];
}
}
int sl=(n-l+)/m;
if(sl*m<(n-l+))
{
sl++;
}
ans+=sl;
cout<<ans;
return ;
}

20181030NOIP模拟赛T2的更多相关文章

  1. 模拟赛T2 交换 解题报告

    模拟赛T2 交换 解题报告 题目大意: 给定一个序列和若干个区间,每次从区间中选择两个数修改使字典序最小. \(n,m\) 同阶 \(10^6\) 2.1 算法 1 按照题意模拟,枚举交换位置并比较. ...

  2. 20161003 NOIP 模拟赛 T2 解题报告

    Weed duyege的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹. 为了查出真相,duyege 准备修好电脑之后再进行一次金坷垃的模拟实验. 电脑上面有若干层金坷垃,每次只能在上面撒上一层高度为 ...

  3. NOIP欢乐模拟赛 T2 解题报告

    小澳的坐标系 (coordinate.cpp/c/pas) [题目描述] 小澳者表也,数学者景也,表动则景随矣. 小澳不喜欢数学,可数学却待小澳如初恋,小澳睡觉的时候也不放过. 小澳的梦境中出现了一个 ...

  4. 20180530模拟赛T2——绀碧之棺

    题目背景 qiancl 得到了一张藏宝图,上面写了一道谜题. 题目描述 定义\(F(n)\)为 n 在十进制下各个数位的平方和,求区间\([a,b]\)中有多少\(n\)满足\(k\times F(n ...

  5. 20180519模拟赛T2——pretty

    [问题描述] 小美今天对于数列很有兴趣.小美打算找出一些漂亮的序列.一个漂亮的序列的限制如下: 长度为 n ,而且数列里只包含 [1,n] 的整数. 要不是不降的序列就是不升的序列. 小美想知道有多少 ...

  6. 2019.11.11 模拟赛 T2 乘积求和

    昨天 ych 的膜你赛,这道题我 O ( n4 ) 暴力拿了 60 pts. 这道题的做法还挺妙的,我搞了将近一天呢qwq 题解 60 pts 根据题目给出的式子,四层 for 循环暴力枚举统计答案即 ...

  7. 5.12 省选模拟赛 T2 贪心 dp 搜索 差分

    LINK:T2 这题感觉很套路 但是不会写. 区间操作 显然直接使用dp不太行 直接爆搜也不太行复杂度太高. 容易想到差分 由于使得整个序列都为0 那么第一个数也要i差分前一个数 强行加一个0 然后 ...

  8. 20161023 NOIP 模拟赛 T2 解题报告

    Task 2.回文串计数 (calc.pas/calc.c/calc.cpp) [题目描述] 虽然是一名理科生,Mcx常常声称自己是一名真正的文科生.不知为何,他对于背诵总有一种莫名的热爱,这也促使他 ...

  9. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

随机推荐

  1. 2-4 Sass的函数功能-颜色函数

    RGB颜色函数-RGB()颜色函数 在 Sass 的官方文档中,列出了 Sass 的颜色函数清单,从大的方面主要分为 RGB , HSL 和 Opacity 三大函数,当然其还包括一些其他的颜色函数, ...

  2. 替换空格(C++和Python 实现)

    (说明:本博客中的题目.题目详细说明及参考代码均摘自 “何海涛<剑指Offer:名企面试官精讲典型编程题>2012年”) 题目 请实现一个函数,把字符串中的每个空格替换为 "%2 ...

  3. GIT团队合作探讨之一-保持工作同步的概念和实践

    感谢英文原文作者,这是我看到的关于git协同工作写的最清晰简洁的文章了: https://www.atlassian.com/git/tutorials/syncing/git-push SVN使用一 ...

  4. webpack从零开始第1课:安装webpack和webpack-dev-server

    原文地址:https://segmentfault.com/a/1190000012536871 webpack目录 第1课: 安装webpack和webpack-dev-server 第2课: 配置 ...

  5. IT装B小技巧

    1.编写简单的关机脚本 新建一个文本文档,将代码复制上去,将后缀改成bat,双击运行 @echo off shutdown -s -t 2.语音播报 新建一个文本文档,将代码复制上去,将后缀改成vbs ...

  6. linux普通用户使用root权限执行命令的脚本

    上一篇有说到普通用户使用免密登录并使用root权限: http://www.cnblogs.com/01-single/p/8919254.html 现在使用脚本批量实现部署系统任务操作步骤: #!/ ...

  7. CefSharp 浏览器核心,爬虫

    CefSharp是什么 A framework for embedding web-browsing-like capabilities to a standard .NET application ...

  8. IDEA 搭建Java WEB 开发环境

    本文是一篇讲解如何在 目前比较流行的IntellJ IDEA 下搭建JavaWEB的说明文档, 如有写的不详细的地方,希望各位留下自己宝贵的意义. Tips : 遇到的问题 , 请耐心看完文章,在文章 ...

  9. Override和Overload的含义去区别

    java中的继承,方法覆盖(重写)override与方法的重载overload的区别  方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.   重写(Ove ...

  10. io操作的要素

    文件 操作. 操作说明 数据