题解 P5606 【小K与毕业旅行】
jerome_wei · · 题解
我们称一对数可以匹配当且仅当两个数的乘积
1(a_i \ge 0 )
如果直接按照从小到达插入或从大到小插入很难处理,想办法构造一个插入顺序,使得任何位置
如果有以上条件,我们考虑依照这个顺序插入,这个时候是一个经典的 dp 套路,设
每次的转移有三种:
- 插入一个新的连续段
- 合并两个相邻连续段
- 一个连续段的两边延长
发现
这个 插入顺序 有很多种方法构造,在此叙述比较简单的一种:
排序之后考虑最小的数和最大的数,设为
如果
反之,则
然后递归到子问题即可。
2
对
3(a_i\ge 0 )
以上的插入顺序看起来并不能继续优化,考虑构造一个更优秀的插入顺序。
考虑把以上 插入顺序 reverse。
现在的性质是:
考虑插入的时候插在两个位置中间,与这两个位置相邻。
现在插入的时候有一些限制:
-
- 只能插入在两个
A 类 之间。
考虑两个相邻的
仔细分析后还会发现:
每次插入
每次插入
于是可以在排序后
4
考虑事先硬点有多少段,即最开始给了多少空位。
如果最开始的空位个数是
这个多项式可以 分治FFT 求出。
我们要求出若干个
注意到枚举的空位其实是最多多少段(可能有段最终仍然是空)。我们需要容斥。
这个容斥是一个卷积的形式,一次 FFT 即可。
综上我们即可在
More
参考 @xgcxgc 的做法,最后的多点求值可以通过下降幂多项式优化,最终复杂度是分治下降幂多项式乘法的