2020-10 杂题选做
LOJ#6101. 「2017 山东二轮集训 Day1」第二题
按照最小值分治到两边,然后直接做即可。
\(\Theta(n\log n)\) , 如果 \(\Theta(n)\) 建笛卡尔树可以做到 \(\Theta(n)\) .
code 见 my solution
AtCoder Regular Contest 104 题解-洛谷博客
AtCoder Regular Contest 104 题解-cnblogs
补板子。
\(ans_i = F(c^i) = \sum\limits_{j=0}^{n-1} a_jc^{ij}\)
众所周知, \(ij = \binom{i+j}{2} - \binom{i}{2} - \binom{j}{2}\) :
\(ans_i = c^{-\binom{i}{2}} \sum\limits_{j=0}^{n-1} a_jc^{-\binom{j}{2}} c^{\binom{i+j}{2}}\)
不难发现这是一个卷积形式,模数 \(998244353\) 为 NTT 模数, NTT 即可。
几个细节:
\(1.\) 注意到我们是把一个长度为 \(n+m\) 的多项式和 长度为 \(n\) 的多项式做卷积,但是我们只需要卷积结果的第 \(n - (n+m-1)\) 项,由于 NTT 是循环卷积,所以我们可以把多项式长度设为 \(n+m\) , 对答案没有影响。
\(2.\) 每次用快速幂算\(c^{-\binom{i}{2}}\) 和 \(c^{\binom{i}{2}}\) 是\(\Theta((n+m)\log mod)\) 的,非常慢。
可以 \(\Theta(\sqrt{mod})\) 预处理然后光速幂\(\Theta(1)\)查询,或者用两次前缀积直接递推结果.
code 见 my solution
利用 tarjan 求 LCA 的思想来解决问题。
考虑把询问挂在点上,然后考虑求出 x -> 根 的路径上最深的对应颜色的点以及 y -> 根 的路径上最深的对应颜色的点 , 如果他们相等,就不满足条件;否则满足条件。
\(\Theta(n+q)\)
离线询问,从小到大扫描右端点的同时维护左端点的答案。
记 \(l_i\) 表示第 \(i\) 个点 \((i,p_i)\) 最晚被覆盖到的时间 .
不难发现我们需要对一个点集的 \(l_i\) 进行赋值,同时维护一个关于 \(l_i\) 的后缀和。
对点建出 KDTree , 每次询问在 KDTree 上遍历并打标记,在打标记的同时要把子树内的所有标记收回。因为收回标记对应着打标记,所以复杂度仍然是 \(\Theta(m)\) 次遍历 KDTree 的复杂度 , 即 \(\Theta(m\sqrt n)\) 次打标记/收回标记的操作。
现在我们要完成的问题变成了支持 \(\Theta(m\sqrt n)\) 次单点修改和 \(\Theta(m)\) 次后缀查询的数据结构 , 不难发现可以用 \(\Theta(1)-\Theta(\sqrt m)\) 的分块来实现它。
时间复杂度 \(\Theta(n\sqrt m+m\sqrt n)\) , 空间复杂度 \(\Theta(n+m)\)
code : 见 my solution