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既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...
随机推荐
- vipkid 面试经历
今天下午去了位于钟鼓楼旁边的 vipkid 研发部进行了面试,面试过程中的回答只能说一般,面试官问的问题大概分为: 实际项目的设计问题 mysql的使用优化问题 多线程与锁的问题 JVM底层原理的问题 ...
- 多线程集成设计模式--future模式
多线程开发可以更好的发挥多核cpu性能,常用的多线程设计模式有:Future.Master-Worker.Guard Susperionsion 一.什么是Future模型: 该模型是将异步请求和代理 ...
- Linux-基于公私钥实现免密码登录
STEP1 在任意一个Linux机器上利用ssh-keygen 命令选择一种加密算法,生成一个密钥对.输入保存密钥对的位置和密码,输入完毕会在指定的目录,默认为/root/.ssh/下生成密钥对 语法 ...
- Springboot在包含有参构造方法的类中使用@Value注解取值
我们在Springboot中经常使用@Value注解来获取配置文件中的值,像下面这样 @Component class A { @Value("${user.value}") pr ...
- Git【入门】这一篇就够了
前言 欢迎关注公众号,白嫖原创PDF,也可以催更,微信搜:JavaPub,回复:[666] Git 在生产工作中是使用频率很高的工具,但我发现很多文章只是对它做了简单的提交命令说明,真正遇到 版本冲突 ...
- Windows10系统下安装配置Tomcat 9.0.1
Tomcat9.0.1下载:https://tomcat.apache.org/download-90.cgi 配置jdk的环境变量(略) 在系统变量里新建变量名:CATALINA_BASE,变量值: ...
- express高效入门教程(3)
3.路由 路由到底是什么呢?不管官方定义到底是什么,咱通俗的说就是根据不同的url,执行不同的代码,类似于编程语言中的分支结构 3.1.express规划路由 稍微复杂点的应用,通常都是分模块进行的, ...
- InfluxDB时序数据库基本知识
InfluxDB是一个由InfluxData开发的开源时序型数据.它由Go写成,着力于高性能地查询与存储时序型数据.InfluxDB被广泛应用于存储系统的监控数据,IoT行业的实时数据等场景. 安装下 ...
- Dynamics CRM 365 不用按钮工具,直接用js脚本控制按钮的显示隐藏
Dynamics CRM 365 不用按钮工具,直接用js脚本控制按钮的显示隐藏: try { // 转备案按钮 let transferSpecialRequestButton = parent.p ...
- 手把手教你部署 Redis Cluster
环境准备 阿里云申请3台ECS,如下: 序号 内网IP OS A 172.16.190.78 CentOS 7.6 B 172.16.242.36 CentOS 7.6 C 172.16.190.77 ...