WYT的刷子
WYT的刷子
题目描述
WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米;每列的高度单位也为米,由输入数据给出)。
使用刷子的规则是:
- 与地面垂直,从栅栏的底部向上刷
 - 每次刷的宽度为M米(当剩余栅栏宽度不够M米的话,刷子也可以使用,具体看样例2)
 - 对于连续的M列栅栏,刷子从底向上,刷到的高度只能到这M列栅栏的最低高度。
 
WYT请你回答两个问题:
- 最少有多少个单位面积不能刷到(单位面积为1平米)
 - 在满足第一问的条件下,最少刷几次?
 
输入格式
共两行:
第一行两个整数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的刷子的更多相关文章
- 单调栈之WYT的刷子
		
好久没更题解了(改题困难的我) 题目描述 WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米:每列的高度单位也为米,由输入数据给出). 使用刷子的 ...
 - 20181030NOIP模拟赛T2
		
WYT的刷子 WYT有一把巨大的刷子,刷子的宽度为M米,现在WYT要使用这把大刷子去粉刷有N列的栅栏(每列宽度都为1米:每列的高度单位也为米,由输入数据给出). 使用刷子的规则是: 1.与地面垂直,从 ...
 - VB6 GDI+ 入门教程[3] 笔、刷子、矩形、椭圆绘制
		
http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[3] 笔.刷子.矩形.椭圆绘制 2009 年 6 月 1 ...
 - TPanel的默认颜色存储在dfm中,读取后在Paint函数中设置刷子的颜色,然后填充整个背景
		
声明如下: TCustomPanel = class(TCustomControl) private FFullRepaint: Boolean; FParentBackgroundSet: Bool ...
 - Uva 4394 字符串刷子
		
题目链接:https://vjudge.net/contest/164840#problem/A 题意:一个字符串刷子,每次可以将一段连续的字符串变成一种颜色,给两个字符串,最少通过几次可以将第一个字 ...
 - FL Studio钢琴卷轴之刷子工具以及其他
		
上一篇文章我们重点讲解了FL Studio钢琴卷轴的画笔工具,今天我们就来讲解钢琴卷轴窗口中剩下的工具.由于接下来的工具都很简单,所以我们将放在一起讲,现在就和小编一起来看看FL Studio钢琴卷轴 ...
 - QPainter就是手里的作图工具,只需要三洋东西:笔(颜色,宽度,样式),字体(写字),刷子(大面积作画),这里有三个典型例子
		
设置笔和字体以后,就可以写字了: void MainWindow::paintEvent(QPaintEvent *event) { Q_UNUSED(event); QPainter painter ...
 - hdu 2476 (string  painter) ( 字符串刷子 区间DP)
		
String painter Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
 - 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)
		
利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...
 
随机推荐
- http 的8中请求方式:
			
http 的8中请求方式: 1.OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性 2.HEAD 向服务器索与GET请求相一致 ...
 - Linux 初始化系统 SystemV Upstart
			
System V 特点 缺点: 启动时间长,init是串行启动,只有前一个进程启动完,才会启动下一个进程 启动脚本复杂,init只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本 ...
 - vue开发搭建(npm安装 + vue脚手架安装)
			
一.概念 1.npm: Nodejs下的包管理器. 2.webpack: 它主要的用途是通过CommonJS的语法,把所有浏览器端需要发布的静态资源,做相应的准备,比如资源的合并和打包. 3.vue ...
 - Python3-os模块-操作系统的各种接口
			
Python3中的os模块提供了一个便携的方式去使用操作系统的相关功能 os.name 返回导入的操作系统相关模块的名字,如 posix(unix/linux),nt(windows)等 os.env ...
 - caffe训练数据流程
			
cifar10训练实例 1. 下载数据 # sudo sh data/cifar10/get_cifar10.sh 2. 转换数据格式为lmdb # sudo sh examples/cifar10/ ...
 - Python实用笔记 (5)使用dictionary和set
			
dictionary 通过键值存储,具有极快的查找速度,但占用空间比list大很多 举个例子,假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list: names = ['Micha ...
 - MyEclipse 选中属性或方法后 相同的不变色
			
myeclipse-->windows-->java-->Editor-->content Assist-->Mark Occurrencmyeclipse-->w ...
 - Java项目开启远程调试(tomcat、springboot)
			
当我们运行一个项目的时候,一般都是在本地进行debug.但是如果是一个分布式的微服务,这时候我们选择远程debug是我们开发的利器. 环境apache-tomcat-8.5.16 Linux 如何启用 ...
 - Spring Boot入门系列(十七)整合Mybatis,创建自定义mapper 实现多表关联查询!
			
之前讲了Springboot整合Mybatis,介绍了如何自动生成pojo实体类.mapper类和对应的mapper.xml 文件,并实现最基本的增删改查功能.mybatis 插件自动生成的mappe ...
 - C++ MFC 文件操作(新建,删除,剪切,复制,读数据,写数据,重命名)
			
源文件:http://pan.baidu.com/s/1ve0hV 这是运行mfc缺失的dll动态链接库:http://pan.baidu.com/s/17pGlT 哈哈,我也是初接触C++,基础的什 ...