2019-9-12做题记录
1、Peaks加强版(Kruskal重构树,主席树)
$Kruskal$重构树的模板题。
$Kruskal$重构树:在合并两个联通块的时候,建一个新点,当原来两个代表元的父亲,作为新联通块的代表元。
查询的时候在叶子上跳到能到达的最远祖先,在叶子的$dfs$序里面查$k$大就行了。
2、【LOJ#6073】距离(主席树)
树链剖分$+$可持久化的套路。
3、【BZOJ4771】七彩树(主席树)
好听的名字和好学的题目。
按照虚树的思想,我们把同一颜色的点拎出来,按$dfs$序排序,然后在每个点$+1$,在相邻点$LCA$处$-1$,这样任意时候我们只要查子树和,就知道了子树里的颜色数。
如果不离线,我们直接按深度优先搜索序插入线段树,维护子树和。把线段树变成主席树,就可以在线了。
4、【BZOJ5304】[HAOI2018]字串覆盖(后缀数组,主席树,倍增)
又是蛤省省选神仙题。
很显然贪心是从左到右能选就选。
对$sa$数组建主席树,值域是它原来的位置。
询问的时候先$rmq+$二分确定区间,找到第一个合法的,再在主席树上反复找后继,这样是$O(n/|P|*logn)$的,当$|P|$很小的时候是不行的。
当$P\le 50$,我们可以预处理答案。直接对每一个$|P|$构建一棵树,每一个位置向它的前驱(一个位置$x$,使得向后$|P|$位后形成的字符串和当前位置向后|P|位形成的字符串相等且不交)连父边,我们在主席树上找到第一个合法的位置,然后找一条向下的长链,预处理即可。
5、【BZOJ4408】[FJOI2016]神秘数(主席树维护贪心)
如果只有一次询问,我们该怎么做?
我们先排个序,如果没有$1$,$1$就是神秘数,如果有$1$,我们应该怀疑$2$是不是神秘数,如果下一个不是$2$,那就不是了。
但是可以发现,这样是假的,因为还可以再来一个$1$,然后两个$1$拼成一个$2$。
这样的话,我们每次只要把小于等于$1$的找到,然后看看下一个是不是$sum+1$,如果不是,就不是了,如果是的话,说明$[1..2sum+1]$都是可以的,直接把$sum$变成$2sum+1$。这个过程是一个$log$的
多次询问的话,用主席树找前驱代替排序,再加一个$log$,总共就是两个$log$的。
这类数据结构维护贪心的问题第一要从最简单的贪心入手,第二再从数据结构入手。就比如说,这道题我一开始想到了用主席树来维护分治信息,是不行的。
6、【BZOJ4242】水壶(克鲁斯卡尔重构树,BFS)
目测是$IOI$题啊。
首先很显然,最小瓶颈生成树上查两点上最值。
$dijkstra$染色就可以了,具体见[JXOI2018]旅行者。
7、【BZOJ3712】Fiolki(并查集重构树)
建出$Krustra$重构树,然后我们知道,深度大的优先反应,同深度的优先级高的先反应。
按照这个双关键字排序,每次维护剩余的量,然后依次做就可以了。
8、【BZOJ2460】元素(贪心,线性基)
就是找一些数,插入线性基,都成功,并且最大化它们的和。
先排个序,然后依次插入线性基即可。
此外,我想到了$aysn$神仙比赛题,那题的条件和“当且仅当不存在一个非空子集,那些矿石的元素序号按位异或和相等”的使用方法是一样的,即都可以成功的插入所有元素,也就是说,如果我做过这道题,很可能就做出了那道比赛题了。