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\)

posted @ 2024-03-07 13:36  Celestial_cyan  阅读(21)  评论(0)    收藏  举报