原题地址
花了一两天真正的熟悉了Treap,对于一个东西,本蒟蒻认为,不应该要会,还应会熟练的写,【像哈狗写这个只需十分钟】
好吧,话归正题 先推荐另类解法 戳进去
此题解法很多BIT , 权值线段树 ,各种平衡树(准备抽空写)。。。。 是一道很棒的模板题。
这道题我们把每次全体加的工资和减的弄到一个变量,姑且叫为w,把当前操作的数叫为k,当我们加工资时,肯定不会有员工退役把。。。所以直接将w 加上 k就行了
如果是减工资,就有可能有员工退役了,我们就应进行一次删除操作了。。。
那么如何删除呢?
先把w减去k,然后遍历。
我们遇到的节点的值 + w 如果大于等于工资下限的话,那么肯定只有可能左儿子中有小于工资下限的吧,那么就跑到它左儿子那里去。如果遇到节点的值是小于工资下限的,那么它右子树有可能有小于工资下限的,那么就一直左旋(这样就能不断地把大的旋上来),直到右节点的值是Null或当前节点的值是大于等于工资上限的,然后删除左儿子(子树)( 即把左边变为Null),如果当前节点也是小于工资上限的话也把当前节点赋为Null。。
至于加入新的节点的话,前面的w跟他毛关系不沾对吧,就把他的值减去w就行啦!
#include
#include
#include
#include
#include
#include
#include
#include
#include
that is all.Thank you for watching.