T3 Stark与Riga的卡牌游戏
题面:
题解:
注意到所有的询问都是以攻击力为询问的下标,考虑以攻击力为区间建立线段树;
显然,对于前三个操作,我们都可以将其转化为对线段树上元素的修改;
我们在每个叶子结点放上另一种数据结构,这种数据结构需要帮助我们快速取出最大最小的元素,这个实现的方法有很多,如:
用优先队列建立一个大根堆一个小根堆,分别对应两个垃圾堆用于将其变为可删除堆;
或者用\(set\)维护以\(A\)为下标的\(H\)有序,可快速取出\(*it,it=s.begin()/(--s.end())\),本文使用\(Map\)作为记录权值\(A\)中的元素个数;
对于区间最小最大的询问,我们将它用线段树动态维护,每次修改更新即可;
区间修改在外层线段树打上区间永久化标记,每次取出加上\(lazy\)值,加入新元素减去\(lazy\)值,删除指定元素减去\(lazy\)值;
这个实现的思路就和\(NOIP2016\)蚯蚓一样了\(qwq\)
\(zkw\)线段树优化常数,当然不写也是可以的;
\(code:\)
#include
#include
#include
#include
#include
#include
#include
#include