1987. 粉刷栅栏
题目描述:
农夫约翰发明了一种绝妙的方法来粉刷牛棚旁边的长栅栏(把栅栏想象成一维的数轴)。
他只需要在他最喜欢的奶牛贝茜身上挂一个刷子,然后在一旁悠闲的喝凉水就行了。
贝茜沿着栅栏来回走动时,会将她走过的栅栏部分涂上油漆。
贝茜从栅栏上的位置 $ 0 $ 处开始,共进行 $ N $ 次移动。
移动可能形如 10 L
,表示向左移动 $ 10 $ 单位距离,也可能形如 15 R
,表示向右移动 $ 15 $ 单位距离。
给定贝茜的 $ N $ 次移动列表,约翰想知道至少被涂抹了 $ 2 $ 层油漆的区域的总长度。
整个行进过程中,贝茜距离出发地的距离不会超过 $ 10^9 $ 。
输入格式
第一行包含一个整数 $ N $ 。
接下来 $ N $ 行,每一行包含一个行动指令,诸如 10 L
或 15 R
。
输出格式
输出至少被涂抹了 $ 2 $ 层油漆的区域的总长度。
数据范围
$ 1 \le N \le 10^5 $
整个行进过程中,贝茜距离出发地的距离不会超过 $ 10^9 $ 。
每次指令移动距离的取值范围是 $ [1,2 \times 10^9] $ 。
输入样例:
1 | 6 |
输出样例:
1 | 6 |
题解:
首先可以发现如果数据范围比较小的话,使用数组就可以存下,然后使用区间加就可以得到结果。
但是数据范围太大,开不下这么大的数组,而且时间复杂度太高。可以发现区间比较少,只有 $ 10^5 $ 个,因此可以考虑离散化。
离散化:即是映射,通常用来把长的区间映射为数组上的点,或者把比较大的数值映射为比较小的数值。区间映射到点,实际上也是比较大的数值映射比较小的数值。
该题使用的连续的长度,和区间加还不太一样。可以使用区间左端点代替整个区间,将连续的区间变成离散的点,这样就可以使用区间加了。
可以使用 map
来做映射,最后遍历 map
计算当前值,统计长度。
代码:
1 | using namespace std; |