点分治

重心0202听课笔记_子树,0202听课笔记_子树_02

重心子树0202听课笔记_分治_03

求一次0202听课笔记_时间复杂度_04,时间复杂度0202听课笔记_子树_05

边分治

选一条边分成两块。

但并不是所有图都能均匀分。(如菊花图)

所以不能直接边分治。要增加虚点,使得每个点的度数不超过0202听课笔记_分治_06

0202听课笔记_分治_07


左上的菊花三度化转化成右下的图。其中如果边上有信息可存在实线的边中。

三度化后一定找到一条边满足性质:0202听课笔记_时间复杂度_08

例题

  • 路径问题:
  • 0202听课笔记_分治_09容斥
  • 0202听课笔记_时间复杂度_10逐个加入。如果逐个加入的时候对已加入进来的子树0202听课笔记_子树_11和(最大值)有依赖,则不能逐个加入。复杂度不对。
  • 0202听课笔记_分治_12Huffman树合并:每次合并两个最小的儿子。带个0202听课笔记_子树_13
  • 例题:每个节点有个括号,问有多少有向路径构成了合法的括号序列。
  • 点分治。然后随便统计。(关键点到某个点构成的路径抵消后肯定是若干右括号+若干左括号,那么数量相同的全是左括号就能和全是右括号的匹配起来)
  • 例题:无边权求距离为0202听课笔记_子树_140202听课笔记_子树_15的点对。
  • 点分治。容斥一下。0202听课笔记_分治_16
  • 例题:树上背包问题。选联通块,使得0202听课笔记_子树_17且使0202听课笔记_子树_18最大。要求时间复杂度0202听课笔记_子树_19
  • 点分治。 先考虑强制根,直接树形DP不行,无法合并两棵子树背包。方法是在DFS序上DP。
  • 0202听课笔记_分治_20表示0202听课笔记_分治_21的子树DFS区间的右端点+1。那么0202听课笔记_时间复杂度_22表示0202听课笔记_子树_23点之后选了0202听课笔记_子树_24容量的最大值。那么0202听课笔记_子树_23点选了就可以继续往后0202听课笔记_时间复杂度_26选;否则必须跳过此子树,直接到0202听课笔记_分治_27。但这样只能算必须选根节点的方案,所以套一下点分治就完了。
  • 例题:HDU CCPC2018 L The Hanged man。每个点有代价和权值(同上一题),求选出来的点不相邻时,容量等于0202听课笔记_子树_140202听课笔记_子树_29所有值时的最大价值。0202听课笔记_子树_300202听课笔记_分治_31
  • 0202听课笔记_子树_32。在点分树的DFS序上DP。0202听课笔记_时间复杂度_33表示前0202听课笔记_子树_23个物品,容量是0202听课笔记_子树_24,然后0202听课笔记_时间复杂度_36表示某个物品选没选。所以我们喜提0202听课笔记_子树_37的算法。
    但发现点分时如果到下一颗子树上一棵子树是没必要存状态的。唯一需要的就是当前点到根的路径上关键节点,有0202听课笔记_时间复杂度_38个,所以只需要0202听课笔记_子树_39

点分树

建出点分治的树。

  • 例题:给出树,点权0202听课笔记_分治_40,多个询问,给出0202听课笔记_子树_41,求0202听课笔记_时间复杂度_42
  • 点分树每个地方存一存 树状数组搞一搞。存个vector。可修改。
  • 例题:给出树,节点有黑白颜色,询问最远黑点之间的距离。有修改颜色。
    - 无边权可以欧拉序括号序列线段树。
    - 带边权只能点分树。开multiset。难。
  • 例题:修改0202听课笔记_分治_43,查询0202听课笔记_分治_440202听课笔记_子树_45
  • ​​本人博客:[ZJOI2015]幻想乡战略游戏​​
  • 还有两道例题…(未写,拖更)

分块(lxl300页课件dls选讲…)

  • 例题:区间加,区间求0202听课笔记_时间复杂度_46的数的个数。
  • 直接每个块维护OV,查询整块二分,零散的暴力;修改的话整块打标记,散块重构。块的大小取0202听课笔记_分治_47时,总时间复杂度为0202听课笔记_子树_48。分析的时候0202听课笔记_时间复杂度_38里的0202听课笔记_时间复杂度_38忽略。
  • 例题:区间加,区间求第0202听课笔记_时间复杂度_51大。
  • 二分套前面的题,多一个0202听课笔记_时间复杂度_38,复杂度为0202听课笔记_时间复杂度_53。被出题人卡了。所以要考虑优化。
  • 将块大小设为0202听课笔记_时间复杂度_54,每次修改复杂度为0202听课笔记_分治_55
  • 二分答案,每次查询(此处查询指二分后的查询有多少比0202听课笔记_分治_56小)有0202听课笔记_时间复杂度_57个整块,这部分复杂度为0202听课笔记_子树_58单次;
  • 0202听课笔记_时间复杂度_54个零散点,这部分复杂度为0202听课笔记_分治_55单次。必须想办法优化掉零散点的复杂度。
  • 方法是预先把零散的两个快归并起来成为一个块,那么只需要在这上面二分就行了。
  • 最后总时间复杂度为0202听课笔记_子树_61
  • 根号平衡1:维护一个集合,支持0202听课笔记_时间复杂度_62插入一个数,0202听课笔记_时间复杂度_63查询k小。
  • 离散化后值域分块,维护第0202听课笔记_子树_23个块里面有多少数,查询的时候从第一个块开始往右跑,做多走过0202听课笔记_子树_58个整块和0202听课笔记_子树_58个零散的数。
  • 根号平衡1:维护一个集合,支持0202听课笔记_时间复杂度_63插入一个数,0202听课笔记_时间复杂度_62查询k小。
  • 值域分块,后对每个数维护一下其在哪个块里面,对于每个块维护OV,那么修改只会改变0202听课笔记_子树_58个数所从属的块。
  • 查询的时候定位到其所属于的块,然后找到其在其块中对应的值。

暂时写到这,下面的还没看第二遍,第一遍听的云里雾里。

-

0202听课笔记_子树_70

0202听课笔记_时间复杂度_71

莫队

时间复杂度0202听课笔记_时间复杂度_72

0202听课笔记_分治_73

  • 例题:
  • 莫队直接做。
  • 例题:在某个区间内出现次数第k1少的价值是多少,可能多个不同的价值出现次数均为第k1少,输出其中第k2小的,保证输入合法。注意内存限制。
  • 莫队,做法待更。
  • 例题:
  • 没听见,待更
  • 例题:求区间逆序对个数。
  • 例题:[MtOI2019]手牵手走向明天
  • 0202听课笔记_子树_74

  • ,神题,待更

树上莫队

待更

无删除莫队

​​freopen博客​​

其他题

  • 例题:
  • 例题若干(未记载)