P2101 命运石之门的选择

题意

题目描述

在某一条不知名世界线的冈伦今天突然接到了一条\(dmail\),上面说世界线将会发生巨大变动,未来的他无论如何都无法扭转这种变动回到原来的世界线。而世界线变动的原因是现在的他不久后错过了与助手的约会。他约好要和助手去约会,但是在去约会之前,由于一直拖欠房租,房东大叔要求他帮忙完成一幅画的上色,然而他没有以最快的速度完成这个任务,导致他错过了与助手的约会,从而导致世界线的剧变。现在到了拯救世界的时候,由于冈伦并不擅长画画,于是他找到了同样不擅长画画的你来帮他解决这个问题(这是命运石之门的选择)。不管怎样现在拯救世界的重任交到了你的手上,而你虽然不擅长画画,但是你可以使用编程来帮助你解决这个问题。

这幅画十分抽象:它由\(N\)个宽度为\(1\)高度为\(H_i\)的矩形组成,矩形并排排列,相邻的矩形间没有空隙,初始情况下每个矩形都是没有颜色的。你有一个宽度为\(1\)的刷子,你可以竖直或水平的刷,每次使用刷子,你的刷子都必须保证一直全部处于矩形中,即不能刷到矩形以外的地方去,当然你每次刷的时候也不能拐弯。你每刷一次,要花费\(1\)的时间,这和刷的长度无关,比如你可以从最左边刷到最右边(当然是不经过矩形以外的部分),这也只花费\(1\)的时间。你的目的是将全部的矩形都涂满颜色。请输出这个最短的时间,以便冈伦决定是自己来完成这个任务还是让你来做苦力。

输入输出格式

输入格式:

第\(1\)行:一个正整数\(N\),表示矩形的个数。

接下来\(N\)个正整数\(H_i\),表示第\(i\)个矩形的高度。

输出格式:

一个整数,表示最少花费的时间。

输入输出样例

输入样例#1:

5
2 2 1 2 1

输出样例#1:

3

说明

【数据规模】

\(30\% N\leq 20, H_i\leq 100\)

\(60\% N\leq 100, H_i\leq 1000\)

\(100\% N\leq 5,000, H_i\leq 10^9\)

思路

这就是个简单的分治或者\(dp\)啊。 --logeadd

完全不会分治的蒟蒻我只能做一些分治水题\(qwq\)。

我们对一个区间来搜索,再来一个一个区间地分下去。具体来说,我们用一个函数\(dfs(l,r)\)来查询区间\([l,r]\)的答案,而这个答案又可以用多个子区间\([l,x_1],[x_1+1,x_2],[x_2+1,x_3]\cdots [x_y+1,r]\)得到,这样我们一步步地分区间搜索,最后合并答案。

那么怎么合并答案呢?对于一个区间\([l,r]\)有一个显然的结论:先把下面的方块横着涂满,然后再竖着涂剩余的区间,所以我们可以统计出这个区间的最小高度,然后把它横着涂满,再把剩余的方块\(dfs\)考虑就好了。

比方说我们有这样的一个形状:


■ ■■ ■
■■ ■■ ■■
■■■■■■■■■■
■■■■■■■■■■

先把下面的方块横着涂:


■ ■■ ■
■■ ■■ ■■
□□□□□□□□□□
□□□□□□□□□□

上方就多出来了三个小区间,再来分别\(dfs\)就好了。

AC代码

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAXN=5e3+5;
LL n,a[MAXN];
LL read()
{
LL re=0;char ch=getchar();
while(!isdigit(ch)) ch=getchar();
while(isdigit(ch)) re=(re<<3)+(re<<1)+ch-'0',ch=getchar();
return re;
}
LL ask(LL l,LL r)
{
if(l==r) return 1;
LL re=INT_MAX;
for(LL i=l;i<=r;i++) re=min(re,a[i]);
for(LL i=l;i<=r;i++) a[i]-=re;
for(LL i=l;i<=r;i++)
{
if(!a[i]) continue;
LL j=i;
while(j<=r&&a[j+1]) j++;
re+=ask(i,j),i=j;
}
return min(r-l+1,re);
}
int main()
{
n=read();
for(LL i=1;i<=n;i++) a[i]=read();
printf("%lld",ask(1,n));
return 0;
}

Luogu P2101 命运石之门的选择(分治+搜索)的更多相关文章

  1. 洛谷 P2101 命运石之门的选择 (分治)

    P2101 命运石之门的选择 (分治) 介绍 El Psy Congroo 题目链接 没错,作为石头门厨,怎么能不做石头门的题呢?(在搜石头门的时 候搜到了本题) 本题作为一道分治基础练习题还是不错的 ...

  2. ACM数论之旅13---容斥原理(一切都是命运石之门的选择(=゚ω゚)ノ)

    容斥原理我初中就听老师说过了,不知道你们有没有听过(/≧▽≦)/ 百度百科说: 在计数时,必须注意没有重复,没有遗漏. 为了使重叠部分不被重复计算,人们研究出一种新的计数方法. 这种方法的基本思想是: ...

  3. UESTC-1964命运石之门(类似SPFA的BFS)

    命运石之门 Time Limit: 1000 MS     Memory Limit: 256 MB Submit Status "这一切都是命运石之门的选择!" 凶真博士发明了能 ...

  4. Luogu 1312 【NOIP2011】玛雅游戏 (搜索)

    Luogu 1312 [NOIP2011]玛雅游戏 (搜索) Description Mayan puzzle 是最近流行起来的一个游戏.游戏界面是一个7行5列的棋盘,上面堆放着一些方块,方块不能悬空 ...

  5. Luogu 1429 平面最近点对 | 平面分治

    Luogu 1429 平面最近点对 题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 ...

  6. 【Luogu P4149】[IOI2011]Race(点分治)

    自闭了几天后的我终于开始做题了..然后调了3h一道点分治板子题,调了一天一道IOI... 最后还是自己手造数据debug出来的... 这题一看:树上路径问题,已知路径长度求balabala,显然是点分 ...

  7. Luogu P1429 平面最近点对 【分治】By cellur925

    题目传送门 题目大意:给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的.$n$<=100000. $Algorithm$ 最朴素的$n^2$枚举肯定 ...

  8. LUOGU P4027 [NOI2007]货币兑换 (斜率优化+CDQ分治)

    传送门 解题思路 题目里有两句提示一定要看清楚,要不全买要不全卖,所以dp方程就比较好列,f[i]=max(f[j]*rate[j]*a[i])/(rate[j]*a[j]+b[j])+(f[j]*b ...

  9. LUOGU P3157 [CQOI2011]动态逆序对(CDQ 分治)

    传送门 解题思路 cdq分治,将位置看做一维,修改时间看做一维,权值看做一维,然后就转化成了三维偏序,用排序+cdq+树状数组.注意算删除贡献时要做两次cdq,分别算对前面和后面的贡献. #inclu ...

随机推荐

  1. Algo: Two Sum

    类似的题目可以用HashTable的思想解决. 1.Two Sum Given an array of integers, return indices of the two numbers such ...

  2. CSIC_716_20191119【常用模块的用法 subprocess、re、logging、防止自动测试、包的理论】

    subprocess模块 可以通过python代码给操作系统终端发送命令,并可以得到返回结果. import subprocess str = input('>>>请输入命令') # ...

  3. css----less预处理器

    ###less less是一种动态样式语言,属于css预处理器的范畴,它扩展了 CSS 语言, 增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展 LESS 既可以在 客户端 上运行 ,也 ...

  4. 简单的 js手写轮播图

    html: <div class="na1">   <div class="pp">    <div class="na ...

  5. 导出Excel格式数据

    /** * 导出规则统计数据 excel格式 * @param bill * @return */ public String exportExamsignupExamnoExcel ( String ...

  6. 【未完成】Jmeter接口自动化测试:参数化设置

    1. 从CSV文件读取参数 创建一个CVS文件,文件第一行不写参数名,直接从参数值开始,每一列代表一个参数 在测试计划或者线程组中,添加一个配置元件-->CSV 数据文件设置 Filename: ...

  7. thinkphp 模版引擎

    系统支持原生的PHP模板,而且本身内置了一个基于XML的高效的编译型模板引擎,系统默认使用的模板引擎是内置模板引擎,关于这个模板引擎的标签详细使用可以参考模版引擎部分. 内置的大理石平台检定规程模板引 ...

  8. python相关软件安装流程图解——虚拟机安装——CentOS-7-x86_64-DVD-1810——CentOS-01下载——CentOS-02安装——CentOS-03配置操作

    http://www.xitongzhijia.net/soft/24315.html http://www.downxia.com/downinfo/4574.html     .

  9. C#winform datagridview单元格的单击处理

    首先看看效果图: 需求:要求是的在datagridview里面绑定数据后,可以任意点击想要点击的某列的单元格进行改变数据.需要在datagridview里面写3个事件 1.RowPrePaint事件: ...

  10. Jumpserver-1.5.2 安装步骤

    Jumpsever 是飞致云旗下的一块开源的堡垒机.在如今都在上云的趋势下,一款堡垒机非常重要. 官网:http://jumpserver.org/ GitHub:https://github.com ...