P8525 [Ynoi2078] 《A Path Towards Autonomous Machine Intelligence》阅读报告(更新中...)

· · 题解

一血纪念。

题目很抽象,大概意思是,给出一个操作序列 (L_i,R_i,v)v 是幺半群中的元素。并且给出运算 \oplus,每次在操作序列末尾插入,或者询问给出 l,r,x,按顺序遍历 [l,r] 中的操作,若 L_i\le x\le R_i 就把答案 \oplus v,否则答案不变。强制在线。

考虑在线构建操作序列的线段树,每次插入操作需要建立线段树上的若干节点。

考虑建立的节点为自底向上的一条右链,那么注意到这里是可以对每个节点 pushup 的,此处的时间复杂度仍然为 O(n\log n)

那么可以合并儿子的信息。类似于分段函数合并,归并即可。

那么问题就是在线段树上分解区间,对于分解出的区间,找到 x 所属的区间,即找到前驱。

考虑分散层叠的思想,在父节点保存两个子节点的归并序列并且指向子节点的序列的位置。那么只用在根节点二分一次,此后每次都可以直接定位到子节点的序列。对每个根进行定位,考虑从大到小维护 2^k 的分散层叠,每次选取 \dfrac 1 4\dfrac 1 2 的点混合。

这部分是口胡,代码待补。