Loading

【题解】AGC036F Square Constraints

注意到相当于给定每个 \(p_i\) 上下界,求合法排列数。

只保留上界或者下界的话是个简单问题,同时考虑上下界不妨往容斥的方向想。假设 \(p_i\) 的限制为 \(p_i\in[L_i,R_i]\) 。不考虑下界的话方案数是 \(\prod \max(0, R_{2n-i}-i+1)\),这里假装 \(R_i\) 是单调不增的。

钦定一些位置取值在下界下面,然后带容斥系数计算方案数和。现在唯一的问题就是,上述的贡献计算式只适用于 \(R_i\) 单调不增的情况下,而容斥时加入的上界不能保证单调不增。

可以发现关键的性质:\(L_i,R_i\) 都是单调不增的。且对于 \(i\geq n\) 都有 \(L_i=0\),也就是说 \(i\geq n\) 的部分可以忽视下界,容斥也只需要对 \(i<n\) 的部分进行。此时能注意到,对于 \(i<n\) 都有 \(R_i\geq n\),而 \(L_i< n\),这意味着上下界可以直接拆开,在钦定有哪些(多少个) \(i\) 是以 \(L_i-1\) 为上界后,\(R,L\) 可以分开计算贡献。

\(i\geq n\) 部分的 \(R\)\(i<n\) 部分的 \(L\) 放在一起 dp 处理即可。令 \(f_k(i,j)\) 表示考虑到了第 \(i\) 个,\(i<n\) 的部分最终有 \(k\)\(L_i-1\) 为上界位置,到目前位置已经选出来 \(j\) 个了的方案数。直接转移即可,时间复杂度 \(O(n^3)\)

代码:Submission #25886559 - AtCoder Grand Contest 036

打草稿的时候做的一张图也贴上来吧:

posted @ 2021-09-17 09:36  Qiuly  阅读(118)  评论(0编辑  收藏  举报