Grakn Forces 2020 题解-洛谷 Grakn Forces 2020 题解-cnblogs
LOJ#6101. 「2017 山东二轮集训 Day1」第二题
按照最小值分治到两边,然后直接做即可。
(Theta(nlog n)) , 如果 (Theta(n)) 建笛卡尔树可以做到 (Theta(n)) .
code 见 my solution
AtCoder Regular Contest 104 题解-洛谷博客
AtCoder Regular Contest 104 题解-cnblogs
补板子。
(ans_i = F(c^i) = sumlimits_{j=0}^{n-1} a_jc^{ij})
众所周知, (ij = inom{i+j}{2} - inom{i}{2} - inom{j}{2}) :
(ans_i = c^{-inom{i}{2}} sumlimits_{j=0}^{n-1} a_jc^{-inom{j}{2}} c^{inom{i+j}{2}})
不难发现这是一个卷积形式,模数 (998244353) 为 NTT 模数, NTT 即可。
几个细节:
(1.) 注意到我们是把一个长度为 (n+m) 的多项式和 长度为 (n) 的多项式做卷积,但是我们只需要卷积结果的第 (n - (n+m-1)) 项,由于 NTT 是循环卷积,所以我们可以把多项式长度设为 (n+m) , 对答案没有影响。
(2.) 每次用快速幂算(c^{-inom{i}{2}}) 和 (c^{inom{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(msqrt n)) 次打标记/收回标记的操作。
现在我们要完成的问题变成了支持 (Theta(msqrt n)) 次单点修改和 (Theta(m)) 次后缀查询的数据结构 , 不难发现可以用 (Theta(1)-Theta(sqrt m)) 的分块来实现它。
时间复杂度 (Theta(nsqrt m+msqrt n)) , 空间复杂度 (Theta(n+m))
code : 见 my solution