杂题乱写
超级钢琴
有点类似某道考试题的思路
求第 \(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 $就好了