题解:AT_arc150_e [ARC150E] Weathercock
看到
- 一个向左的人
i 转向的条件是:1 到i 中,向右看的人数减去向左看的人数>0 。 - 一个向右的人
i 转向的条件是:i+1 到n 中,向左看的人数减去向右看的人数>0 。
很容易可以想到使用前缀和优化,由于条件只需要知道两种人人数的差值,因此我们规定:
此时条件就可以写为:
- 一个向左的人
i 转向的条件是:s_{i-1}-s_0>0 ,由于s_0=0 且s_i-s_{i-1}=-1 ,条件等价于s_i\ge0 。 - 一个向右的人
i 转向的条件是:-(s_n-s_i)>0 ,即s_i>s_n 。
现在我们钦定
构建一个坐标系,把所有
结合上面的条件,我们发现:
- 所有在
s_n 上方的的线段都要翻转。 - 在
0 上方的向下线段都要翻转。
如果我们不管第二部分,那么在进行完一轮操作后,
对于向左的人,我们如何判断他会不会翻转?
我们考虑第一个在
- 在进行了一次操作之后得到的
s 数组,对于现在的所有向下线段i ,最终会翻转当且仅当\max_{1\le j\le i}s_j>0 。
现在我们已经有了一个做法,但是这个做法需要我们先做一次把第一部分的处理掉,不好扩展到
考虑分析第一部分翻转后会变成什么样。
- 如果
s_n>0 ,那么第一部分翻转完后,第一个线段(原本肯定向上,翻转后向下)必定在0 上方,因此会在第二部分中做贡献。 - 如果
s_n=0 ,那么我们直接特判即可。
现在我们已经可以解决
我们把
code