WYT的刷子

题目描述

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

使用刷子的规则是:

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

WYT请你回答两个问题:

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

输入格式

共两行:

第一行两个整数N和M。

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

输出格式

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

样例

样例输入1

  1. 5 3
  2. 5 3 4 4 5

样例输出1

  1. 3
  2. 2

样例输入2

  1. 10 3
  2. 3 3 3 3 3 3 3 3 3 3

样例输出2

  1. 0
  2. 4

样例输入3

  1. 7 4
  2. 1 2 3 4 3 2 1

样例输出3

  1. 4
  2. 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

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn = 1e6 + 10, INF = 0x3f3f3f3f;
  4. struct Node {
  5. int id;
  6. long long high;
  7. } sol[maxn], solmin[maxn], solmax[maxn];
  8. long long height[maxn], f[maxn];
  9. long long ans = 0;
  10. int flag = 1, t = 0;
  11. int n, m;
  12. void get_min() {
  13. for (int i = 1; i <= n; i++) {
  14. while (flag <= t && sol[t].high >= height[i]) t--;
  15. t++;
  16. sol[t].id = i;
  17. sol[t].high = height[i];
  18. if (i >= m) {
  19. if (sol[flag].id <= i - m)
  20. flag++;
  21. solmin[i].high = sol[flag].high;
  22. solmin[i].id = sol[flag].id;
  23. }
  24. }
  25. for (int i = 1; i < m; i++) {
  26. solmin[i].id = i;
  27. solmin[i].high = -INF;
  28. }
  29. }
  30. void get_max() {
  31. flag = 1, t = 0;
  32. for (int i = 1; i <= n; i++) {
  33. while (flag <= t && solmax[t].high <= solmin[i].high) t--;
  34. solmax[++t].id = i;
  35. solmax[t].high = solmin[i].high;
  36. if (i >= m) {
  37. if (solmax[flag].id <= i - m)
  38. flag++;
  39. f[i - m + 1] = solmax[flag].high;
  40. ans += height[i - m + 1] - f[i - m + 1];
  41. }
  42. }
  43. long long maxh = -INF;
  44. for (int i = n; i > n - m + 1; i--) {
  45. maxh = max(maxh, solmin[i].high);
  46. f[i] = maxh;
  47. ans = ans + height[i] - f[i];
  48. }
  49. }
  50. int main() {
  51. cin >> n >> m;
  52. for (int i = 1; i <= n; i++) cin >> height[i];
  53. get_min();
  54. get_max();
  55. int last = 1, num = 1;
  56. for (int i = 1; i <= n; i++) {
  57. if (i - last + 1 > m || f[last] != f[i]) {
  58. last = i;
  59. num++;
  60. }
  61. }
  62. cout << ans << endl << num << endl;
  63. return 0;
  64. }

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. snprintf和sprintf区别分析

    目录[-] snprintf函数的返回值 snprintf函数的字符串缓冲 今天在项目中使用snprintf时遇到一个比较迷惑的问题,追根溯源了一下,在此对sprintf和snprintf进行一下对比 ...

  2. 键盘侠Linux干货| 使用SSH方式推送文件至github仓库

    前言 作为一名优秀的计算机从业人员,相信大家github应该都知道吧.(优秀的代码托管工具) 但是由于平常使用的https方式克隆的本地仓库,每次git push时都需要输入帐号密码才能将我们修改的文 ...

  3. 磨皮美颜算法 附完整C代码

    前言 2017年底时候写了这篇<集 降噪 美颜 虚化 增强 为一体的极速图像润色算法 附Demo程序> 这也算是学习过程中比较有成就感的一个算法. 自2015年做算法开始到今天,还有个把月 ...

  4. Page "页面路径" has not been registered yet.

    网上找了很多方法,但和我遇到的都不一样,我这个页面是我路由接口更改时遇到的错误,原因是我移动了文件,js里引用的文件找不到了 解决方法:更改引用路径即可

  5. Netty源码分析之自定义编解码器

    在日常的网络开发当中,协议解析都是必须的工作内容,Netty中虽然内置了基于长度.分隔符的编解码器,但在大部分场景中我们使用的都是自定义协议,所以Netty提供了  MessageToByteEnco ...

  6. django 中间键 csrf 跨站请求伪造

    django中间件和auth模块   Django中间件 由django的生命周期图我们可以看出,django的中间件就类似于django的保安,请求一个相应时要先通过中间件才能到达django后端( ...

  7. pikachu靶场-XSS

    .Tips: 一般查询接口容易出现反射型XSS,留言板容易出现存储型XSS 由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器): 通过变化不同的scr ...

  8. 物联网SIM卡和SIM卡,真的不是一回事

    [摘要]在物联网解决方案中,设备移动上网也需要使用SIM卡.那么,SIM卡是什么?各种SIM卡有什么区别?物联网SIM卡如何选择?本文将为您答疑解惑. 通信进化史 过去几百年间,通信技术经历了天变地异 ...

  9. 不同编程语言实现HelloWorld程序

    目录 C C# C++ HTML Java Python C #include <stdio.h> int main() { printf("Hello World!" ...

  10. typeof、instanceof与constructor

    typeof返回一个表达式的数据类型的字符串,返回结果为js基本的数据类型,包括number,boolean,string,object,undefined,function. 语法: typeof( ...