AlmostSorted

[ARC132C] Almost Sorted

本题的状压并不是很明显,但是因为 \(d\) 很小,所以应该想到。

可以用差值来设计状态。

\(f[i][j]\) 表示填完前 \(i\) 个数,目前 \([-d,d]\) 的差值中可用的状态为 \(j\)(对于 \(i+1\) 而言)的方案数。

考虑枚举上一个位置:

  • \(i\) 个位置选的数不能再上一个位置的集合中出现
  • 需要保证现在选的数是可以选到的,即要么这个位置随意填数,要么这个位置本来就是要填的数
  • 不越界

满足以上条件之后,就可以进行状态转移了。

f[i][(j | (1<<(d+k))) >> 1] = (f[i][(j | (1<<(d+k))) >> 1]+f[i-1][j])%mod

其中的 \(k\) 是枚举的新入的数,需要 \(d\) 的偏移,然后加入 \(j\) 集合。然后因为是下一个位置,所有的 \(p_i-i\) 集合需要减小 \(1\)\(>>1\) 即可。

答案是 \(f[n][2^d-1]\),因为前 \(n\) 个数均填完,所以 \([-d,-1]\) 范围内的数均已填过。

复杂度 \(O(n2^{2d+1})\)

posted @ 2023-07-23 18:21  wscqwq  阅读(17)  评论(0编辑  收藏  举报