P17858 「GLR-R5」处暑 / defervit
连通块加和查的话明显是要搞个并查集的,但是你又不能给每个节点都开那么多并查集。
注意到其实合并两个节点只会合并边界的,你只要记下边界的点在只管当前节点这段区间的连通块的祖先只谁就可以了,然后再把这个祖先的编号离散化一下就可以存下来。
但是知道这些依然不够,因为你在处理连通块的加和查时是需要打 \(tag\) 的,你在下传标记更新答案时,是需要知道这个连通块的大小和权值和的1,于是你上传祖先时还需要把标记和权值和一起上传。
修改把标记打到最上面的一个区间包含整个连通块,查询同理。
此题关键在于:对于一个完整联通块,我们希望把它存储下来,但是又不消耗太多的位置,划分到线段树的每个区间上,只把一个完整连通块区间 \([l,r]\) 存储在一个最深的包含这个区间的节点上,这样对于查询和修改都很方便。有了这个之后,如果可以不丢失信息且保证快速的合并两个区间,我们就可以完成这个题,对于可能被存储到上面位置的连通块只可能是与当前节点边界联通的连通块,我们只需要记下边界处节点的信息即可快速合并。

浙公网安备 33010602011771号