令 l,r 能使 ∑i=lrai=S。
考虑先令 l=1,那么如果存在 ∑i=1r=S,即输出 YES。如果没有,则一定有 ∑i=1r=S−1,且 ar+1=2。
YES
考虑对 l,r 进行调整:将 l 向左移,r 向右移。可以发现当 1∼l′ 全部为 2,且 r∼r′ 全部为 2,且 ar′+1=1 或 al′+1=1,ar′=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(nlog2n),但在线段树上二分可以优化到单 log。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Apifox不支持离线,Apipost可以!
· 历时 8 年,我冲上开源榜前 8 了!
· Trae 开发工具与使用技巧
· 通过 API 将Deepseek响应流式内容输出到前端
· 分享一个我遇到过的“量子力学”级别的BUG。