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


洛谷P6800 【模板】Chirp-Z Transform

补板子。

\(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


[USACO19DEC]Milk Visits G

利用 tarjan 求 LCA 的思想来解决问题。

考虑把询问挂在点上,然后考虑求出 x -> 根 的路径上最深的对应颜色的点以及 y -> 根 的路径上最深的对应颜色的点 , 如果他们相等,就不满足条件;否则满足条件。

\(\Theta(n+q)\)


洛谷P6783 【[Ynoi2008]rrusq】

离线询问,从小到大扫描右端点的同时维护左端点的答案。

\(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


posted @ 2020-10-03 10:42  srf  阅读(516)  评论(0编辑  收藏  举报