点分治
重心,。
重心子树
求一次,时间复杂度
边分治
选一条边分成两块。
但并不是所有图都能均匀分。(如菊花图)
所以不能直接边分治。要增加虚点,使得每个点的度数不超过。
左上的菊花三度化转化成右下的图。其中如果边上有信息可存在实线的边中。
三度化后一定找到一条边满足性质:
例题
- 路径问题:
- 容斥
- 逐个加入。如果逐个加入的时候对已加入进来的子树和(最大值)有依赖,则不能逐个加入。复杂度不对。
- Huffman树合并:每次合并两个最小的儿子。带个。
- 例题:每个节点有个括号,问有多少有向路径构成了合法的括号序列。
- 点分治。然后随便统计。(关键点到某个点构成的路径抵消后肯定是若干右括号+若干左括号,那么数量相同的全是左括号就能和全是右括号的匹配起来)
- 例题:无边权求距离为到的点对。
- 点分治。容斥一下。
- 例题:树上背包问题。选联通块,使得且使最大。要求时间复杂度
- 点分治。 先考虑强制根,直接树形DP不行,无法合并两棵子树背包。方法是在DFS序上DP。
- 表示的子树DFS区间的右端点+1。那么表示点之后选了容量的最大值。那么点选了就可以继续往后选;否则必须跳过此子树,直接到。但这样只能算必须选根节点的方案,所以套一下点分治就完了。
- 例题:HDU CCPC2018 L The Hanged man。每个点有代价和权值(同上一题),求选出来的点不相邻时,容量等于到所有值时的最大价值。,
- 。在点分树的DFS序上DP。表示前个物品,容量是,然后表示某个物品选没选。所以我们喜提的算法。
但发现点分时如果到下一颗子树上一棵子树是没必要存状态的。唯一需要的就是当前点到根的路径上关键节点,有个,所以只需要。
点分树
建出点分治的树。
- 例题:给出树,点权,多个询问,给出,求
- 点分树每个地方存一存 树状数组搞一搞。存个vector。可修改。
- 例题:给出树,节点有黑白颜色,询问最远黑点之间的距离。有修改颜色。
- 无边权可以欧拉序括号序列线段树。
- 带边权只能点分树。开multiset。难。 - 例题:修改,查询,
- 本人博客:[ZJOI2015]幻想乡战略游戏
- 还有两道例题…(未写,拖更)
分块(lxl300页课件dls选讲…)
- 例题:区间加,区间求的数的个数。
- 直接每个块维护OV,查询整块二分,零散的暴力;修改的话整块打标记,散块重构。块的大小取时,总时间复杂度为。分析的时候里的忽略。
- 例题:区间加,区间求第大。
- 二分套前面的题,多一个,复杂度为。被出题人卡了。所以要考虑优化。
- 将块大小设为,每次修改复杂度为
- 二分答案,每次查询(此处查询指二分后的查询有多少比小)有个整块,这部分复杂度为单次;
- 有个零散点,这部分复杂度为单次。必须想办法优化掉零散点的复杂度。
- 方法是预先把零散的两个快归并起来成为一个块,那么只需要在这上面二分就行了。
- 最后总时间复杂度为
- 根号平衡1:维护一个集合,支持插入一个数,查询k小。
- 离散化后值域分块,维护第个块里面有多少数,查询的时候从第一个块开始往右跑,做多走过个整块和个零散的数。
- 根号平衡1:维护一个集合,支持插入一个数,查询k小。
- 值域分块,后对每个数维护一下其在哪个块里面,对于每个块维护OV,那么修改只会改变个数所从属的块。
- 查询的时候定位到其所属于的块,然后找到其在其块中对应的值。
暂时写到这,下面的还没看第二遍,第一遍听的云里雾里。
-
莫队
时间复杂度
- 例题:
- 莫队直接做。
- 例题:在某个区间内出现次数第k1少的价值是多少,可能多个不同的价值出现次数均为第k1少,输出其中第k2小的,保证输入合法。注意内存限制。
- 莫队,做法待更。
- 例题:
- 没听见,待更
- 例题:求区间逆序对个数。
- 二次离线莫队。传送门。大概懂了
- 例题:[MtOI2019]手牵手走向明天
- ,神题,待更
树上莫队
待更
无删除莫队
freopen博客
其他题
- 例题:
- 例题若干(未记载)