D. Boris and His Amazing Haircut(线段树)

传送门

题意:

思路:

首先分析一定剪不出发型的可能:

1)现在的头发长度小于要剪的头发长度

2)要剪的发型的长度没有对应的剪刀

然后对于剩下的情况,我们剪头发肯定是要从高的剪刀开始剪,因为处理完高的情况可以处理低的头发,但是对于低的情况一定处理不了高的头发了。然后考虑某个区间[l,r],如果,并且在[l+1,r-1]上,那么这一把剪刀可以把l和r两个点的发型都完成。

就相当于如果对于两个相邻的相同的,如果最大值不大于,那么就不需要花费额外的剪刀;否则就需要多花费一把剪刀。那么就可以简化为对于某一种长度的头发x,遍历他的下标,如果有区间的最大值大于x就需要的剪刀数++(最少剪刀要一把),然后遍历完之后如果存在的剪刀数小于需要的剪刀数就可以直接标记,最后直接输出答案即可。

这里找区间最大值我用的是线段树,用树状数组也是可以的(自己找罪受)。

代码:

你可能感兴趣的:(c++,算法,c++)