下文中令 a 为题目中的 c 序列。
考虑一对限制 (x,y) 的本质是什么。根据题意得知,maxi=1xai<ay,且 ak≤maxi=1xai(x<k<y),于是可以推出 maxi=1y−1ai<ay,也就是说。ak(x<k<y) 一定不是严格前缀最大值,而 ay 一定是严格前缀最大值。
于是我们可以 O(n) 求出数组 b,bi=−1/0/1,表示 ai 一定不是 / 不一定是 / 一定是 前缀最大值,或者推出矛盾(即一个位置同时应该是 −1,1 的情况),判无解即可。
考虑构造。首先我们考虑 a 全都不确定的情况,此时是简单的,bi=1 时令 ai=maxj=1i−1aj+1,否则令 ai=1 即可。
如果当前的 ai 确定了,那我们考虑判断合不合法。
- 如果 bi=1 且 ai≤maxj=1i−1aj 则一定无解,因为我们在最小化字典序的同时最小化了前缀 max。
- 如果 bi=−1 且 ai>maxj=1i−1,则我们考虑往前找到一个最大的 p 使得 ap 未确定且 bi=−1,令 ap=ai 来满足 ai 的限制。如果找不到这样的 p 那么显然无解;调整后 ap 可能会与 [p+1,i−1] 中的一些位置的限制冲突,此时也一定无解。因为冲突的位置 o 一定满足 ao 确定了,且 bo=1,而这样的位置相当于给前缀 max 设置了上界。
于是我们可以做到 O(n) 构造并且判定是否有解。代码在这里。