edu 162D
限时每日一题day22。今天做得比较顺。
想吃掉第 \(i\) 个笑脸,无非只有两种可能——从左边吃过来,或者从右边吃过来。而能吃掉 \(a[i]\) 的条件就是最终能合成为一个 \(>a[i]\) 的数。首先观察到,对于左侧或右侧,合成的笑脸必然要构成一个区间(证明略)。一个显然的充分条件即为:合成区间的总和要 \(>a[i]\)。然后还需要考虑一个区间是否可以合成。大胆 \(guess\) 一下就可以发现:只要区间内的数不都是相同的,就必然可以合成为一个数,即区间和。前者用前缀和 + 二分来确定边界;后者可以通过维护每个位置左 \(or\) 右侧第一个与其不相同的数的位置来确定。具体细节见代码。
code