BZOJ 1500: [NOI2005]维修数列&&洛谷P2042 [NOI2005]维护数列(多标记Treap)

Description

Solution

fhq Treap大boss题

解决此题,你需要:

①内存回收

②线性建树

③强大的DeBUG能力

④强大的DeBUG能力

⑤强大的DeBUG能力…

对于每个节点维护以下信息:

①premx:当前最大前缀和(如无leftson,从自己开始计算)

②rearmx:当前最大后缀和(同上)

③mx:当前区间最大和

④tag:当前区间是否被旋转

⑤is_set:当前区间是否被重置

对于④&&⑤,为了避免上传标记时的额外判断,在标记到达该节点的同时更新该节点信息

对于④tag的下传:

对于⑤is_set的下传:

最后注意空节点预处理和标记传递时的分类即可

另:

BZOJ普通建树可以AC,洛谷要线性建树…

O(nlogn)建树版

对于线性建树:

自己YY的一个写法(其实是HR大爷的单调栈版不会写):

对于一个满二叉堆(满足中序遍历为1~n)

现假设要建立一个大小大于等于n而最小的满二叉堆

求其max.height:

其根节点为:root=(1<<(max.height-1))

DFS建树后再split出前N个再合并回原平衡树即可

另:为维护Treap性质,当前节点rand()=depth*magic_number+cur(magic_number>maxn)

O(n)线性建树Code:(对于初始build与insert均为线性建树):

HR大爷的单调栈O(n)建树版:

 

Compare:

我的O(n)建树版:

2483807 mczhuang 1500 Accepted 52080 kb 4444 ms C++/Edit 7002 B 2017-12-26 19:46:20

我的普通fhq Treap版:

2481249 mczhuang 1500 Accepted 26688 kb 7236 ms C++/Edit 5473 B 2017-12-25 19:28:47

HR大爷的单调栈O(n)建树版:

2475651 child 1500 Accepted 24976 kb 4640 ms C++/Edit 3766 B 2017-12-22 20:06:57
0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments