杂题乱写

超级钢琴

有点类似某道考试题的思路

求第 (K) 大/前 (K) 大区间好像都可以用类似的方法去做

钦定每个点只能和前面的点配对形成区间

用一个堆维护当前的位置 (x) ,左右区间 (l,r),最优的转移点 (pos) ,最优的权值 (val)

(st) 表维护前缀和的 (mn)

考虑首先对于每个点扫一遍求出这些东西, 用st表查询就可以方便的做了

然后将这些信息都压进堆中

每次取出的一定是当前最优的区间

然后考虑这个区间取出之后要放入哪些新的区间

就是 (l,mid-1)(mid+1,r) 这两个区间的最优转移点和贡献

所以每次都类似的操作就可以了

在堆中取出(K)个元素就是前(K)大了




最小mex生成树

线段树分治,对值域维护一颗线段树

考虑一条权值为 (w) 的边

将其拍在 (0,w-1)(w+1,mx+1) 的区间上

然后遍历线段树,用可撤销并查集维护此时的联通性

如果到了某个叶子节点,此时的 (size=n), 说明可以不加这个边就将整颗树建好, 输出即可




Yuno loves sqrt technology III

分块黑科技

维护 (vec),(pos)

(vec[i]) 表示(i)这个权值在原序列中出现的所有下标

(pos[i]) 表示(i)这个下标在对应的(vec)中的下标

预处理出每个块之间的答案 (f[i][j]) ,表示 (i)(j) 的答案为 (f[i][j])

然后查询 (l)(r) 时先取出 (l,r) 之间整块的答案作为初始答案

然后考虑两边的散点能否更新答案

对于左边的判断方法就是看 (vec[pos[i]+ans]) 是否小于等于r

右边类似




Treeland and Viruses

显然的思路是建虚树

考虑建出虚树来怎么做

一个 (naive) 的思路是直接暴力BFS

然后考虑如何优化 (BFS) 的过程

直接改成 $dij $就好了

如初见 与初见
原文地址:https://www.cnblogs.com/HISKrrr/p/14629721.html