专栏文章

线段树合并

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipkkz27
此快照首次捕获于
2025/12/03 13:31
3 个月前
此快照最后确认于
2025/12/03 13:31
3 个月前
查看原文

CF600E Lomsat gelral


  • 给定一个大小为 nn 并且以 11 为根的树。对于树上的结点 ii 有一个颜色 cic_i
  • 现在对于树上的每一个结点 ii,输出以 ii 为根的子树出现最多的颜色的编号,如果有多个颜色出现次数均为最大,输出它们的编号和。
  • 1n1051\leq n \leq 10^51cin1\leq c_i \leq n
  • 用线段树合并求出每一个点的子树信息。
  • 以颜色 cic_i 作为下标建立线段树。叶子结点存对应的颜色出现次数,非叶子结点存最大出现次数 mx 和编号和 sumID
  • 然后就是线段树合并,对于叶子结点,累加即可。对于非叶子节点 xx,先把其的左右儿子和 yy 的左右儿子对应合并,然后考虑 push_up 这个过程。

CF570D Tree Requests


  • 给定一个以 11 为根的树。树上的每一个点 ii 都有一个小写字母 cic_i
  • qq 次询问,每次询问给定两个参数 aabb,表示询问 aa 子树内深度为 bb 的结点的 cic_i 是否能重新排列成为一个回文串。
  • 1n5×1051\leq n \leq 5 \times 10^51q5×1051\leq q \leq 5\times 10^5
  • 线段树合并,以深度 dep 为下标建立线段树。
  • 由于 cic_i 只有 2626 中,而且只需要考虑每一个字母出现次数的奇偶性,因此状压即可。
  • 由于只询问某一个深度,因此线段树上只需要维护叶子结点的信息,查询某一个深度的信息时在线段树上二分即可。

P3899 [湖南集训] 更为厉害


  • 给定一个大小为 nn 并且以 11 为根的树。
  • qq 次询问,每次询问给定两个参数 aakk,表示询问有多少个点对 (b,c)(b , c) 满足:
    • 1.1. aa bb cc 三点互不相同
    • 2.2. aabb 均为 cc 的祖先节点。
    • 3.3. aabb 距离为不超过 kk
  • 1n3×1051\leq n \leq 3\times 10^5
  • bbaa 的祖先节点,则只需要令 ccaa 的子树节点即可。贡献为 min{dep[a]1,k}×(siz[b]1)\min \{ \text{dep}[a] - 1 , k \} \times (\text{siz}[b] - 1)
  • bbaa 的子树节点,则需要查询 aa 子树内深度 dep[x]\text{dep}[x]dep[a]+1dep[a]+k\text{dep}[a] + 1 \sim \text{dep}[a] + k 范围 siz[x]1\text{siz}[x] - 1 之和。
  • dep\text{dep} 为下标建立线段树,线段树合并即可。
  • 注意 upd 函数要写一个 if(!u) u = ++ idx

P8907 [USACO22DEC] Making Friends P


  • 给定 nn 头奶牛,初始有 mm 对朋友关系
  • 现在奶牛以 1n1 \sim n 的顺序离开。每当一头奶牛 ii 离开时,它所有的朋友都会互相建立朋友关系。
  • nn 头奶牛离开之后,新增了多少对朋友关系。
  • 1n2×1051\leq n \leq 2\times 10^51m2×1051\leq m \leq 2 \times 10^5
  • 考虑一种延迟的操作,每次找到与 ii 相邻并且编号最小的点 pp,然后让 ppii 的其余朋友 v1,v2,...,vkv_1, v_2,...,v_k 连边。即把 ii 集合内除了 pp 的所有元素扔到 pp 集合里面。
  • 发现每次取出 ii 时都能保证 ii 集合是当前 ii 的所有朋友结点,累加答案即可。
  • 感觉理解的不好

P9400 「DBOI」Round 1 三班不一般


整体 dp

评论

0 条评论,欢迎与作者交流。

正在加载评论...