4 月 16 日记录

[Ynoi2008] rdCcot

还是邻域。

先考虑 \(l=1\),这样扫描 \(r\) 的过程就会不断合并连通块。

维护连通块合并是困难的,考虑转而计数代表元。

规定一个等价类的代表元为其深度最浅的结点,如果有多个比较编号。一个结点能够成为代表元当且仅当它向上的大小为 \(C\) 的邻域 \(S_u\) 内不存在已经被激活的点。

那么对于一次询问的区间 \([l,r]\),要计数 \(S_u\) 和区间 \([l,r]\) 无交的 \(u\) 的数量。

这还是很困难,考虑利用点分治的性质。

注意到上面的条件中漏了一个:\(l\le u\le r\),所以只需求出 \(S_u\)\(<l\) 最大的和 \(>r\) 最小的就能转化为一次二维偏序。

\(dep_u\) 排序,线段树维护下标,然后在线段树二分找。

复杂度 \(O(n\log^2 n+m\log n)\)

做到 \(O(n\log n\alpha(n)+m\log n)\) 需要更深入地利用点分治的性质。

【模板】点分树

又是邻域。

单点修改,动态查询邻域信息。

把点分治的结构离线下来,建成点分树。

如果我们把线段树看成区间分治的结构离线建成的一棵树,那么我们就可以说点分树就是树上的线段树。

点分树的一层,需要支持的操作相当于:单点修改,查询一个前缀颜色不同于给定的颜色 \(c\) 的附带的信息之和。如果信息可减或者信息可重满足其一,就可以用线段树完成;否则可以树套树。

和线段树一样,建树 \(O(n\log n)\),每次修改或询问 \(O(\log^2 n)\)。精细实现可以 \(O(n\log n)\) 空间,实际上无脑写动态开点空间就是对的。

[Ynoi2008] rplexq

这题应该是这篇博客里的最难的一题。

这个问题是有困难性的规约的:严格难于小 Z 的袜子,因此时间复杂度不会低于 \(O(n\sqrt n)\)

对原树重剖。对于一次询问,把它拆解为一次数点、一次重儿子的数点和很多次轻儿子的数点。前两者都可以做到 \(O(n\log n)\);后者我们把轻子树内的点拉出来跑莫队。这样 \(O(n\sqrt n\log n+n\log n)\),非常不优美。

于是想到平衡。对每个点设置 \(B\) 个重儿子,这样轻子树大小之和就是 \(O(n\log_B n)\) 量级。阈值为 \(B\) 时复杂度为 \(O(q\sqrt{n\log_B n}+nBf(n,nB))\)。其中 \(f(n,m)\) 表示 \(n\) 次单点加 \(m\) 次查询区间和操作的最优复杂度(无论怎样都小于 \(n^{1+\epsilon}+m^{1+\epsilon}\))。\(B\) 取任意 \(n^c\)\(c\)\((0,0.5]\) 之间的常数)就可以平衡得到单根。没有任何精细实现,一发过了。

posted @ 2025-04-16 08:43  Network_Error  阅读(20)  评论(0)    收藏  举报