2025 hdu round7

2025 杭电多校 round7 补题

1004 - 梦醒时刻

题意有点复杂,这里讲一下思想,本质是维护某个初始值下,前缀最大值的数量。

题目维护的是一类类似单侧合并线段树的东西,该线段树每个节点维护一个 \(g_x\) 表示在考虑 \([l,mid]\) 的元素信息后,顺序遍历 \([mid+1,r]\) 的元素,得到的一个价值是多少。

同时其可以完成一个操作 \(F(s,x)\) 表示初始值是 \(s\) ,在对 \(x\) 节点代表区间做顺序遍历后能得到得价值是多少。通常来说,借助 \(g_x\) ,每次递归子树时可以做到只递归到其中一个子树内,将另一个子树的贡献快速计算掉。

单点修改时,在 push_up 操作时,通过一次 \(F(\max(lson),rson)\) 操作求出新的 \(g_x\) (因为递归向上子树的 \(g_x\) 都求解完成),由于求解一个 \(F\)\(O(\log n)\) ,总复杂度 \(O(\log^2n)\)

一个典型的例题是 楼房重建,其单点修改后求前缀最大值等于自身的位置个数,定义 \(g_x\) 为在初始值为左子树的最大值时,依次遍历右子树前缀最大值的数量,现在求解 \(F(s,x)\)

  • \(x\) 是叶子,直接求解。
  • 考虑左右子树,若 \(s\) 小于左子树最大值,则 \(s\) 不对右子树影响 (完全由左子树掌控),递归到 \(F(s,lson)+g_x\)
  • \(s\) 大于左子树最大值,则左子树没有贡献,递归到 \(0+F(s,rson)\)

回到这道题,我们可以对时间维护一个 \(v_j\) 表示当前这个人 \(j\) 时刻受到的噪音度,需要求解 \(F(s,x)\) 表示考虑 \(x\) 区间的噪音,初始忍耐度 \(s\) 会导致梦境减少多少层,在同样维护 \(g_x\) 后也可以递归计算,总复杂度为 \(O(n\log^2n)\)

注意此题 \(l_i>i\) ,一不留神就可能忽略掉这个关键性质。

1012 - 字典树逆向

仅给定一棵 trie 树的结构,无转移边权,确定一个大小为叶子个数的,字典序最小的序列使其生成的 trie 和给定 trie 同构。

这要求我们给每个点确定一个儿子的访问顺序,对所有儿子排序,现在比较儿子 \(u,v\) 的先后顺序。

我们确定 \(s_u\) 为从 \(u\) 开始的最优构造序列,相当于比较 \(\{1+s_u\}+\{2+s_v\}<\{1+s_v\}+\{2+s_u\}\)\(s_u\) 可以通过我们确定的儿子访问顺序遍历得到:

  • \(s_u\)\(s_v\) 前缀则 \(v\) 要排 \(u\) 前面。
  • 否则字典序最小的排最前面。

于是可以同时从 \(u,v\) 开始沿着最优序列向下遍历判别,若一个点顶到叶子另一个点没顶到则在字典序上有区别,通过比较出边大小还能得到是否互为前缀关系。

暴力比较 \(u,v\) 的最坏复杂度为 \(O(\min(siz_u,siz_v))\) ,当其中一个点是重儿子时,由最小值关系,这次比较的代价是一个轻儿子的大小,因此重儿子大小是不对复杂度做贡献的,排序一个点时,每个轻儿子最多被遍历 \(O(\log n)\) 次(排序复杂度),而由树上启发式合并的思路,最多有 \(\log n\) 个点会访问到这个轻儿子,因此每个点被遍历次数为 \(O(\log^2n)\) ,总复杂度 \(O(n\log^2n)\)

1011 - 切披萨

给定 \(n\) 个点 \(m\) 条直线,顺序处理直线将所有在直线下方的点删除,求每次删除哪些点。

整体二分,设 \(f(l,r,P)\) 表示考虑 \([l,r]\) 的直线,确定 \(P\) 中所有点的位置。

每次递归时直线划分到左右,\(P\) 中点分离到左右递归即可,相当于对直线求一个半平面交,需要确定一个点在左侧直线被切掉还是右侧被切掉。其实是在确定一个点是否在所有 \([l,mid]\) 直线组成的一个下凸壳中,将点按横坐标排序后可以扫描计算。

用动态凸包可以在线维护,后续更。

posted @ 2025-08-09 12:28  蒻蒻虫  阅读(22)  评论(0)    收藏  举报