CDQ 分治小测

contest

A(容斥 + cdq)

利用二维前缀和思想,考虑将一个询问拆成四个,然后将询问离线后转化为 \(x_i \le x_j,y_i \le y_j,t_i \le t_j\)\(t\) 是输入顺序)的三维偏序问题,使用 cdq 分治即可解决。注意 \(x,y,t\) 相同时需保证修改在询问之前。

B(容斥 + cdq 优化 dp)

首先列出朴素转移方程(令 \(dp_{i,j}\) 表示从 \((1,1)\) 走到 \((i,j)\) 的合法方案数):

\[dp_{i,j}=\sum_{x<i,y<j,a_{x,y} \neq a_{i,j}} dp_{x,y} \]

注意到要求行和列都严格递增,考虑 cdq 分治优化。

对于不同颜色的限制,我们可以采用容斥,用前面所有的 dp 值减去相同颜色的 dp 值,而相同颜色的 dp 值使用一个全局桶即可维护。

实现上并不需要将矩阵转换成序列再排序,cdq 分治中按照列循环即可满足题意。

C(带方案数 dp 的处理技巧)

\(dp_i\) 表示以 \(i\) 结尾的最长不上升子序列长度,\(f_i\) 表示 \(dp_i\) 对应的方案数。

因为题目要求方案数,所以我们还需要定义 \(dp1_i\) 表示以 \(i\) 开头的最长不上升子序列长度,\(f1_i\) 的定义类似。

转移需要找到一个决策点 \(j\),满足 \(j<i,h_j \ge h_i,v_j \ge v_i\),显然这是三维偏序问题,可以利用 cdq 分治优化。

实现上可以正着求出 \(dp_i,f_i\),然后倒过来求出 \(dp1_i,f1_i\)。输出概率的话,用 \(f_i \times f1_i\) 除以 最长不上升子序列的总方案数即可,前提是 \(i\) 处在最长不上升子序列中(即 \(dp_i +dp1_i - 1 = ans\)\(ans\) 为第一问答案)。

posted @ 2026-08-24 11:16  _KidA  阅读(10)  评论(0)    收藏  举报