设fi 0/1表示当前子序列mex为i并且序列是否含有i+1。每次转移与ai差不超过1
先把不合法的判掉。
然后设最大子段和为LR,值为M,对于一次查询lr
如果LR将lr完全覆盖,直接无解,因为你不能减
如果lr和LR有交,也是无解,因为你没有办法不让他选没有被lr覆盖的地方。
如果lr在LR外面,答案很好算。
所以LR肯定在lr内部。
直接预处理子段和:
int M = 0,cur = 0;
for(int i = 1;i <= n;i++){cur = ((i==1)?a[i]:max(a[i],cur+a[i]));M = max(M,cur);
}
然后处理前缀和后缀和一车信息,非常难写。