WYT的刷子

题目描述

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

使用刷子的规则是:

  1. 与地面垂直,从栅栏的底部向上刷
  2. 每次刷的宽度为M米(当剩余栅栏宽度不够M米的话,刷子也可以使用,具体看样例2)
  3. 对于连续的M列栅栏,刷子从底向上,刷到的高度只能到这M列栅栏的最低高度。

WYT请你回答两个问题:

  1. 最少有多少个单位面积不能刷到(单位面积为1平米)
  2. 在满足第一问的条件下,最少刷几次?

输入格式

共两行:

第一行两个整数N和M。

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

输出格式

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

样例

样例输入1

5 3
5 3 4 4 5

样例输出1

3
2

样例输入2

10 3
3 3 3 3 3 3 3 3 3 3

样例输出2

0
4

样例输入3

7 4
1 2 3 4 3 2 1

样例输出3

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.

code

#include <bits/stdc++.h>
using namespace std; const int maxn = 1e6 + 10, INF = 0x3f3f3f3f; struct Node {
int id;
long long high;
} sol[maxn], solmin[maxn], solmax[maxn]; long long height[maxn], f[maxn];
long long ans = 0;
int flag = 1, t = 0;
int n, m;
void get_min() {
for (int i = 1; i <= n; i++) {
while (flag <= t && sol[t].high >= height[i]) t--;
t++;
sol[t].id = i;
sol[t].high = height[i];
if (i >= m) {
if (sol[flag].id <= i - m)
flag++;
solmin[i].high = sol[flag].high;
solmin[i].id = sol[flag].id;
}
}
for (int i = 1; i < m; i++) {
solmin[i].id = i;
solmin[i].high = -INF;
}
} void get_max() {
flag = 1, t = 0;
for (int i = 1; i <= n; i++) {
while (flag <= t && solmax[t].high <= solmin[i].high) t--;
solmax[++t].id = i;
solmax[t].high = solmin[i].high;
if (i >= m) {
if (solmax[flag].id <= i - m)
flag++;
f[i - m + 1] = solmax[flag].high;
ans += height[i - m + 1] - f[i - m + 1];
}
}
long long maxh = -INF;
for (int i = n; i > n - m + 1; i--) {
maxh = max(maxh, solmin[i].high);
f[i] = maxh;
ans = ans + height[i] - f[i];
}
} int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> height[i];
get_min();
get_max();
int last = 1, num = 1;
for (int i = 1; i <= n; i++) {
if (i - last + 1 > m || f[last] != f[i]) {
last = i;
num++;
}
}
cout << ans << endl << num << endl;
return 0;
}

WYT的刷子的更多相关文章

  1. 单调栈之WYT的刷子

    好久没更题解了(改题困难的我) 题目描述 WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米:每列的高度单位也为米,由输入数据给出). 使用刷子的 ...

  2. 20181030NOIP模拟赛T2

    WYT的刷子 WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米:每列的高度单位也为米,由输入数据给出). 使用刷子的规则是: 1.与地面垂直,从 ...

  3. VB6 GDI+ 入门教程[3] 笔、刷子、矩形、椭圆绘制

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[3] 笔.刷子.矩形.椭圆绘制 2009 年 6 月 1 ...

  4. TPanel的默认颜色存储在dfm中,读取后在Paint函数中设置刷子的颜色,然后填充整个背景

    声明如下: TCustomPanel = class(TCustomControl) private FFullRepaint: Boolean; FParentBackgroundSet: Bool ...

  5. Uva 4394 字符串刷子

    题目链接:https://vjudge.net/contest/164840#problem/A 题意:一个字符串刷子,每次可以将一段连续的字符串变成一种颜色,给两个字符串,最少通过几次可以将第一个字 ...

  6. FL Studio钢琴卷轴之刷子工具以及其他

    上一篇文章我们重点讲解了FL Studio钢琴卷轴的画笔工具,今天我们就来讲解钢琴卷轴窗口中剩下的工具.由于接下来的工具都很简单,所以我们将放在一起讲,现在就和小编一起来看看FL Studio钢琴卷轴 ...

  7. QPainter就是手里的作图工具,只需要三洋东西:笔(颜色,宽度,样式),字体(写字),刷子(大面积作画),这里有三个典型例子

    设置笔和字体以后,就可以写字了: void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter ...

  8. hdu 2476 (string painter) ( 字符串刷子 区间DP)

    String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)

    利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...

随机推荐

  1. 使用addEventListener绑定事件是关于this和event记录

    DOM元素使用addEventListener绑定事件的时候经常会碰到想把当前作用域传到函数内部,可以使用以下两种放下: var bindAsEventListener=function (objec ...

  2. redis过期键的策略

    一.过期时间设置: 127.0.0.1:6379> expire key seconds //设置键的过期时间为多少秒 127.0.0.1:6379> setex key seconds ...

  3. SpringMVC拦截器使用

    源码地址 拦截器interceptor 拦截器是URL请求的第一道门,所有请求会先经过拦截器interceptor,然后再进入controller: 下面,记录一种通过注解方法拦截所有需要登录才能发起 ...

  4. Hystrix总结

    Hystrix 能使你的系统在出现依赖服务失效的时候,通过隔离系统所依赖的服务,防止服务级联失败,同时提供失败回退机制,更优雅地应对失效,并使你的系统能更快地从异常中恢复. Hystrix能做什么? ...

  5. Redis:缓存淘汰策略

    将redis用做缓存是一种非常常见的手段,然而由于内存大小的限制,会导致redis在内存空间满了以后需要处理继续存入的数据.总计有以下几种策略: volatile-ttl:在设置了过期时间的数据集里, ...

  6. laravel生成key失败

    laravel生成key失败 生成KEY失败.原因是没有复制.env文件 In KeyGenerateCommand.php line 96: file_get_contents(D:\project ...

  7. 1166 - Unknown error 1166[mysql 错误

    错误码 1166 原因 字段名因为是复制过来的, 末尾存在了一个空格换行

  8. win10 64位 MySQL 8.0 下载与安装

    免安装版(超级棒的教程): 安装只需 Download .zip压缩文件 卸载只需 Delete 解压文件即可 https://blog.csdn.net/hzxOnlineOk/article/de ...

  9. Glusterfs的安装、创建卷、配置和优化卷、挂载使用

    一.网站推荐 1.https://gluster.readthedocs.io/en/latest/    这是官方的说明网站.这里面有安装Glusterfs原理,安装流程,各种卷的原理.创建方式.以 ...

  10. P2629 【好消息,坏消息】

    其实刚开始看到这道题,应该很多都会想到区间DP中的合并石子,开一个2倍的空间(严格来说的话应该是2n-1),将本来的环变成一个链式的结构.然后对于得到的消息,可以预处理一个前缀和,这样就可以很方便的知 ...