1、罗马游戏:
左偏树模板。
小根堆:合并选小的做根,记为$r1$,然后把$r2$合并到$r1$右边(原$r1$左边长,右边短),然后更新父亲,判断长度关系交换儿子,更新长度。
删除用$fhq_treap$的删除方式。
查找用并查集的方法,但是不带路径压缩。
2、棘手的操作:
联通块内最小值用左偏树维护,全局最小值用$multiset$维护。
3、城池攻占:
把所有的骑士一块处理,因为每一个骑士只会加入军团一次、死掉一次,所以如果我们只维护这些事件,复杂度是正确的,很容易想到左偏树。
注意到无论加一个数、还是乘一个正数,左偏树内(维护的集合)内的相对大小不变。所以我们可以通过打懒标记(类似$fhq_treap$)的方式维护加、乘。
到一个点时直接把小于防御值的骑士弹出左偏树宣告死亡,然后把还在左偏树里的元素打上修改懒标记即可,
维护懒标记要像$fhq_treap$那样$merge$,$pop$时$pushdown$。
4、【APIO2012】派遣:
选定管理者之后,选的点一定是这个子树里面,尽可能多。所以选小的,合并直接把超过预算的大的部分弹出左偏树即可。
5、Roads in Yusland
$aysn$给我推荐的神仙题,$yyb$也写了。结果想了很长时间都没有做出来。晤,果然我还是太弱了。
是一个带反悔的贪心操作。
从下至上考虑,对于每个点的父边,把不能到达这条边的链弹去,此时,堆中的元素都是可以覆盖到这条边的,我们找到一个权值最小的从下面上来的覆盖这条边的链,然后把它算到答案中去,并且把它自己和堆中存的链全都减去它的权值,意思是:万一有一天,发现一个比它更优的链,不仅可以完成把这条边覆盖,还可以把更上面的边覆盖,就把现在选的这条边去掉,选更优秀的。
要是知道了过程,正确性应该不难理解吧。
6、Dynamic Ranking
去年就会做的题,今天重写一下,就当复习了。
对于不带修改的情况:
如果序列长度为$n$,那我们需要$n$棵线段树,它们是对于值域建的,第$i$棵主席树代表数$a_1,a_2,...,a_i$形成的集合,在序列上,后一个等于在前一个的基础上挂一条链,这样查找的时候,我们只要关心第$r$棵和第$l-1$棵,在值域上二分,最后确定下点,这个过程中,两个数的指针是一起同向动的。
扩展到带修改的情况:
我们还是需要$n$棵线段树,但是第$i$棵主席树代表$a[i],a[i-lowbit(i)]...$形成的集合,建主席树的时候,就不存在一个是另一个的基础关系了,所以要把$a_i$插入到$i,i+lowbit(i)...$中,查找的时候,要确定组成前缀和最多的$log[l-1]+log[r]$个主席树的位置,直接在上面检查二分的值域是否合法,这些指针也是一起同向动的。
7、【BZOJ2588】Count On a Tree
在树链上找$k$大,我不知道怎么处理(以为要树链剖分),但是看了题解,才发现我是会的,这状态。。。发现和江苏的一道字符串题的套路是一样的。
$x$在$fa[x]$的基础上加上$x$的权值,找的时候确定四棵线段树,分别是$u,v,LCA(u,v),fa[LCA(u,v)]$,然后通过这些检验就可以了。
8、【BZOJ3123】森林
第7题的操作下带一个合并操作,那么直接启发式合并就行了。但是这是一个无根树,怎么启发式合并呢?
选一个维护联通块的$size$,然后让小联通块的接点的父亲是大联通块,这样每次只需要对小联通块内的每个点重建一条链即可。
9、【BZOJ3932】任务查询系统
一眼主席树,用扫描线的方法,每次只关心变化,处理询问直接在第$x$棵线段树上二分即可。
10、【BZOJ3295】动态逆序对
曾经被我用分块卡过去了,复杂度根号$log$里套根号,现在想想块的大小还可以更优。。。。
然后$aysn$写神仙主席树,把我$D$了,呜呜呜。
现在看看好像很水,带修改主席树,正难则反(正好像不是很难,但我习惯这种思维了),每次加入一个数,查前面有多少数比他大,后面有多少个数比他小,复杂度是两个$log$的。
11、【BZOJ4571】美味
按位考虑,把每次把查找的范围缩小在一个区间里。
原文地址:https://www.cnblogs.com/shxnb666/p/11495106.html