想了一个小时居然想出来了。
每一次给出了一个 \([a,b]\leq [a+1,b+1]\) 或 \([a,b]\geq [a+1,b+1]\) 的形式。
很明显 \([a,b]\leq[a+1,b+1]\) 可以推出 \([a,b-1]\leq [a+1,b]\)。
考虑一个 \(a\) 对应的多个限制,按照 \(b\) 排序,有以下情况:
- 有小于等于也有大于等于
此时这一段一定相等
- 只有小于等于或只有大于等于
此时我们只需要考虑最大的限制即可。
以上的思路无法继续下去,突然发现我们每一次都是比较相邻两个字符的大小,这些限制都是针对相邻的字符的大小序列的限制。\(0\) 表示等于,\(-1\) 表示小于,\(1\) 表示大于。
限制形如:一个区间内,第一个非 \(0\) 的位置是 \(-1/1\),或者这个区间不存在 \(-1/1\)。
考虑设计 dp 解决,\(f_{i,j,k,l}\) 表示考虑了前 \(i\) 个位置,最后一个为 \(j\),最靠后的 \(1\) 限制为 \(k\),最靠后的 \(0\) 限制是 \(l\),转移很简单,但是没有丝毫前途。
考虑将整个序列划分成若干段 \(0000001\) 或者 \(000000-1\),此时我们一个区间我们只关心第一个跨过的段是什么类型。
我们同样希望考虑 \(f_{i}\) 的形式来转移,在上述问题中,对左端点的限制较严,对右端点限制没有那么严。
不妨考虑将序列倒过来,限制的 \((l,r)\) 也对应倒过来。设 \(f_{i,j}\) 表示考虑了前 \(i\) 个限制,上一个字符是 \(j\)。每一次我们考虑向后面转移到 \(ti\),只需要考虑 \(l\leq i\) ,\(i\leq r \leq ti\) 中的限制,不难发现此时随着 \(ti\) 的增大,限制会越来越严,我们考虑二分出最后一个能转移的点,对应区间加即可。
代码咕咕咕咕咕,不保证上述做法可行。