(已经会了东西就略过了)
(下面就是自己新学会的)
1、D维数点的bitset暴力方法(O(D*n^2/w))
每个点开D个bitset,分别排序递推,然后把答案&起来即可
一个trick:bitset按编号分块,多做几次,可以节省内存,例题(传递闭包)
(想想我以前只会O(D*n^2))
2、CDQ分治解决动态凸壳(包)问题
就每次把左边的加点操作直接维护出(两个)凸壳,右边的询问就直接二分
二分就比较相邻两点的斜率与当前二分的斜率是否相同
可以看出CDQ分治可以把动态的问题转化为静态的build和query,就不需要支持快速insert的数据结构了(少写一个set了)
比如动态2维数点可以转化为静态2维数点
3、一个套路题
把点的坐标看成(i,prei)值设为i-prei
就是动态二维数点了,直接CDQ分治啊
修改就改i,nxti,newnxti的pre值就可以了
为什么要写KD树啊,哦,因为之前的那道题要强制在线
没有强制在线就可以CDQ分治啦!!!
4、一个多项式的题(口胡,并不会具体实现,再次只记录一下思路)
已知P数组和 f (f[0]=1)的递推式:求 f 数组的前n项
我们可以先把1~mid的 f 值算出来
然后用它去更新后面的mid+1~r(这个东西有可加性吗???有(想象一下两边a,b都已经算好了a^2,b^2,现在把2*a*b加入,就变成了(a+b)^2),但是不会写啊)
然后分治计算mid+1~r
5、线段树分治求解带删除动态01背包
把每个物品算一个存在的时间区间,然后按时间线段树分治
线段树分治的做法就是覆盖标记,不下传,然后中序遍历线段树,遇到一个标记就插入,出栈的时候就回退
这里的回退就memcpy一下之前的dp状态就可以了
O(nwlogn)
(本来线段树分治还有一些其他的应用的,然后dls没讲,我要TS)
6、线段树分治维护带加边、删边的动态MST
把每条边算一个存在的时间区间
LCT支持只加边的MST,套一个线段树分治就可以了
回退(因为LCT支持删除),就直接把原来加的边删除
7、二项堆
一个很有意思的东西,它其实是一个森林
siz=2^x的二项堆
size=11=8+2+1的二项堆
size=7=4+2+1的二项堆
两个堆合并起来,就像做二进制加法(O(logn))
11=1011
7=0111
18=10010
也就是相同size=2^p的二项堆合并(O(1))形成一个size=2^(p+1)的堆
删除?把根节点去掉后就是两个二项堆合并了
8、二进制分组
竟然和这道题的思路差不多
后缀insert优化的那段就是二进制分组
于是我们想到了,我们可以通过这样的方法来解决强制在线问题
上面的那道题实际上就是一边建树一边查询,一共就建了这样一颗线段树
所以均摊是O(n)的
然后我们在更复杂的题目中会在这棵全局的线段树上每个点维护一些数据结构
这种数据结构就只需要build和query就可以了
如果是O(n)build,那么它的均摊复杂度就是O(nlogn)
参考博客:https://www.cnblogs.com/Miracevin/p/10425809.html
(有一些还没来得及整理的)
9、版本树(占坑)
这个东西好像让二进制分组支持了删除操作,但是没太听懂
10、CF 102354 B(占坑)
(下午为什么画风突然变成DP了???)
11、IOI2013(占坑)
12、IOI2014 holiday(占坑)
13、广义单调性(占坑)