AGC056
https://atcoder.jp/contests/agc056
B - Range Argmax
先考虑判断合法性:每次找到一个满足 \(\forall L_{j}\le i\le R_{j},x_{j}=i\) 的位置 \(i\),删掉 \(i\) 和包含 \(i\) 的段,若能删空则合法
在此基础上计数需要注意去重(一个合法序列可能有多个删除方式),钦定每次选择最小的位置 \(i\) 即可
删除一个位置后左右相互独立,且顺序一定是先删空左边再删右边。可以用区间刻画状态:\([l,r]\) 表示剩下 \([l,r]\) 中的位置和完全被 \([l,r]\) 包含的段
还有一个条件是 \(i\) 是最小的能删位置。记 \(le[l,r,i]\) 为区间内包含 \(i\) 的段的最小左端点。考虑左边下一个删的位置 \(j\),若不存在一段同时覆盖 \(i,j\)(显然该段对应的 \(x=i\)),那么删 \(i\) 之前 \(j\) 就可以被删,矛盾。因此要求 \(j\ge le[l,r,i]\)
设 \(f[l,r,i]\) 为区间 \([l,r]\),删的位置 \(\ge i\) 的方案数。删除位置 \(j\) 的方案数为 \(f[l,j-1,le[l,r,j]]\times f[j+1,r,j+1]\),前缀和即可得到 \(f[l,r]\)
注意特判不包含任何一段的区间