题意简述
你有一个空调(承太郎),初始温度为$m$,有$n$个客人。第$i$个客人会在$t_i$的时间过来,适应的温度在$[l_i,r_i]$之间。每一个时刻,空调珂以让气温升高$1$(制热),减少$1$(制冷),或者不变(关掉空调)。
请问你能否满足所有顾客的适应温度?输出$YES/NO$。
$n<=1e6$,其余输入数据的绝对值都$<=1e9$。 (原来是$n<=100$,但是$n<=1e6$也能做)
思路框架
首先,将所有的顾客按$t_i$排序(显然)。
定义两个数$l,r$。初始$l=r=m$。
然后对于每个顾客,$[l,r]$两端都向外扩展$t_i-t_{i-1}$个长度($l$减去这个数,$r$加上这个数)。然后和$[l_i,r_i]$取一下交集。看看最后$[l,r]$是否非空,如果非空,输出$YES$,否则$NO$。
具体思路
如何得到这个算法的
(排序肯定是第一个想到的)
一开始我还以为这个是贪心之类的,然后我就在想,从第$i-1$个人到第$i$个人,到底该停留在哪个决策点呢?
后来我就从能得到的区间开始考虑:初始温度为$x$,经过$t$时刻,能得到的区间是$[x-t,x+t]$。
然后我就有了一个灵感:我们不用具体决策到哪一个点,我们只需要知道能到哪一个区间就珂以了!
于是就有了下面这个算法。
算法的解释&正确性
$[l,r]$表示当前空调在满足所有顾客需求的情况下能调整到的温度范围。初始值为$[m,m]$是显然的(第$0$时刻,空调还没开)
然后从第$i-1$个人到第$i$个人,经过了$t_i-t_{i-1}$个时刻。最小的情况显然是全开制冷,最大的情况显然是全开制热。而且,容易证明,在这段区间中所有的温度都能得到。当然,我们还要考虑上新进来的第$i$个顾客,所以扩展完这个区间还要和$[l_i,r_i]$取一下交集。
然后到最后看看这个范围是否非空即珂。
代码
1 |
|