「可持久化数据结构(平衡树、trie树、线段树) 」

这个专题也算是边颓题解边做的做完了。

A. 森林

启发式合并两棵树,树上主席树,复杂度$O(nlog^2n)$,复杂度有保证的原因是因为每次暴力修改的是较小的树合并后一定是原来大小的两倍,那么最多重建log次树,重建一次$O(nlogn)$。

B. 影魔

考虑每个区间做多少贡献不好统计,不妨考虑每个点对区间做了多少的贡献。

用单调栈处理出每个点左右第一个比它大的位置$l_i,r_i$,这个点会为$[l_i,r_i]$这个区间做p1贡献,会为$[l_i,i+1~r_i-1],[l_i+1~i-1,r_i]$做p2的贡献,相邻点还会做p1的贡献。

对于$[l_i,i+1~r_i-1],[l_i+1~i-1,r_i]$这种贡献,考虑两次计算贡献,并通过线段树实现两个端点同时改变的操作,前提是保证一个端点是类似指针的一点一点挪过去的。

具体操作是:对于$[l_i,i+1~r_i-1]$的贡献,把它算到$l_i$身上。开始的时候先把所有左端点只有一个右端点是一个区间的贡献加到$i+1~r_i-1$的线段树上,把区间按照左端点排序,一个指针表示左端点然后一点一点右移,如果以i为左端点的区间统计完了就把以i为左端点的全部贡献从线段树上删掉,复杂度有保证的是因为$[l_i,i+1~r_i-1]$类似的区间是因为有i,而这样的点有n个因此这样的区间也最多有n个。然后再从右往左同理做一遍把$[l_i+1~i-1,r_i]$区间的贡献统计完。

有些需要注意的是有的i没有$l_i$$r_i$,这时会有p2,但不会有p1。

posted @ 2019-12-25 17:27  _xuefeng  阅读(143)  评论(0编辑  收藏  举报