CF1896D 题解
Solution
令 \(l,r\) 能使 \(\sum\limits_{i=l}^{r} a_i=S\)。
考虑先令 \(l=1\),那么如果存在 \(\sum \limits_{i=1}^{r}=S\),即输出 YES。如果没有,则一定有 \(\sum \limits_{i=1}^{r}=S-1\),且 \(a_{r+1}=2\)。
考虑对 \(l,r\) 进行调整:将 \(l\) 向左移,\(r\) 向右移。可以发现当 \(1 \sim l'\) 全部为 \(2\),且 \(r \sim r'\) 全部为 \(2\),且 \(a_{r'+1}=1\) 或 \(a_{l'+1}=1,a_{r'}=2\) 时,条件成立。
于是考虑用线段数维护出区间内 \(1\) 出现的次数,记为 \(cnt1\),\(2\) 的出现次数显然可以用区间长度减去 \(cnt1\) 得到,记为 \(cnt2\)。然后用二分求出 \(1\) 左边第一次出现的 \(1\) 的位置,记为 \(pos1\),以及 \(r\) 左边第一次出现的 \(1\),记为 \(pos2\)。
接下来考虑答案:如果 \(pos1=-1\),显然无解;如果 \(pos2=-1\),且 \(pos1-1 >n-r\),说明 \(r\) 后面没有足够的 \(2\),无解。当 \(pos1,pos2\) 都不为 \(-1\) 时,显然有解。
考虑再记录区间和,方便找到初始的 \(r\)。显然我们可以使用二分套线段树的方法,时间复杂度为 \(O(n\log^2n)\),但在线段树上二分可以优化到单 \(\log\)。

浙公网安备 33010602011771号