0202听课笔记


点分治

重心 G G G, ∣ G ∣ ≤ 2 |G|\le2 G2

重心子树 s i z e ≤ n / 2 size\le n/2 sizen/2

求一次 O ( M ( n ) ) O(M(n)) O(M(n)),时间复杂度 O ( M ( n ) log ⁡ n ) O(M(n)\log n) O(M(n)logn)

边分治

选一条边分成两块。

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

所以不能直接边分治。要增加虚点,使得每个点的度数不超过 3 3 3
0202听课笔记_第1张图片
左上的菊花三度化转化成右下的图。其中如果边上有信息可存在实线的边中。

三度化后一定找到一条边满足性质: 2 3 n + 1... \frac 23n+1... 32n+1... (没听清。)

例题

  • 路径问题:

    • 1. 1. 1.容斥
    • 2. 2. 2.逐个加入。如果逐个加入的时候对已加入进来的子树 s i z e size size和(最大值)有依赖,则不能逐个加入。复杂度不对。
    • 3. 3. 3.Huffman树合并:每次合并两个最小的儿子。带个 log ⁡ \log log
  • 例题:每个节点有个括号,问有多少有向路径构成了合法的括号序列。

    • 点分治。然后随便统计。(关键点到某个点构成的路径抵消后肯定是若干右括号+若干左括号,那么数量相同的全是左括号就能和全是右括号的匹配起来)
  • 例题:无边权求距离为 1 1 1 n n n的点对。

    • 点分治。容斥一下。 ∑ i < j p i p j = ( ∑ i p i ) 2 − ( ∑ i p i 2 ) 2 \sum_{ii<jpipj=2(ipi)2(ipi2)
  • 例题:树上背包问题。选联通块,使得 ∑ v i ≤ V \sum v_i\le V viV且使 ∑ w i \sum w_i wi最大。要求时间复杂度 O ( n V log ⁡ n ) O(nV\log n) O(nVlogn)

    • 点分治。 先考虑强制根,直接树形DP不行,无法合并两棵子树背包。方法是在DFS序上DP。0202听课笔记_第2张图片
    • r u r_u ru表示 u u u的子树DFS区间的右端点+1。那么 d p ( i , j ) dp(i,j) dp(i,j)表示 i i i点之后选了 j j j容量的最大值。那么 i i i点选了就可以继续往后 i + 1 i+1 i+1选;否则必须跳过此子树,直接到 r i r_i ri。但这样只能算必须选根节点的方案,所以套一下点分治就完了。
  • 例题:HDU CCPC2018 L The Hanged man。每个点有代价和权值(同上一题),求选出来的点不相邻时,容量等于 1 1 1 V V V所有值时的最大价值。 V ≤ 10000 V\le 10000 V10000 n ≤ 100 n\le 100 n100

    • O ( n 2 V ) O(n^2V) O(n2V)。在点分树的DFS序上DP。 d p ( i , j , S ) dp(i,j,S) dp(i,j,S)表示前 i i i个物品,容量是 j j j,然后 S S S表示某个物品选没选。所以我们喜提 O ( n V 2 n ) O(nV2^n) O(nV2n)的算法。
      但发现点分时如果到下一颗子树上一棵子树是没必要存状态的。唯一需要的就是当前点到根的路径上关键节点,有 l o g log log个,所以只需要 O ( n V 2 log ⁡ n ) = O ( n 2 V ) O(nV2^{\log n})=O(n^2V) O(nV2logn)=O(n2V)

点分树

建出点分治的树。

  • 例题:给出树,点权 b i b_i bi,多个询问,给出 x , r x,r x,r,求 ∑ d i s ( v , x ) ≤ r b v \sum_{dis(v,x)\le r}b_v dis(v,x)rbv
    • 点分树每个地方存一存 树状数组搞一搞。存个vector。可修改。
  • 例题:给出树,节点有黑白颜色,询问最远黑点之间的距离。有修改颜色。
    - 无边权可以欧拉序括号序列线段树。
    - 带边权只能点分树。开multiset。难。
  • 例题:修改 a i a_i ai,查询 m i n u ∑ i a i ⋅ d i s ( i , u ) min_u\sum_{i}a_i\cdot dis(i,u) minuiaidis(i,u) d e g i ≤ 20 deg_i\le20 degi20
    • 本人博客:[ZJOI2015]幻想乡战略游戏
  • 还有两道例题…(未写,拖更)

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

  • 例题:区间加,区间求 ≤ x \le x x的数的个数。
    • 直接每个块维护OV,查询整块二分,零散的暴力;修改的话整块打标记,散块重构。块的大小取 n log ⁡ n \sqrt{n\log n} nlogn 时,总时间复杂度为 O ( M n log ⁡ n ) O(M\sqrt{n\log n}) O(Mnlogn )。分析的时候 l o g log log里的 l o g log log忽略。
  • 例题:区间加,区间求第 k k k大。
    • 二分套前面的题,多一个 l o g log log,复杂度为 O ( M n log ⁡ n ⋅ log ⁡ n ) O(M\sqrt{n\log n}\cdot\log n) O(Mnlogn logn)。被出题人卡了。所以要考虑优化。
    • 将块大小设为 n log ⁡ n \sqrt n\log n n logn,每次修改复杂度为 O ( n log ⁡ n ) O(\sqrt n\log n) O(n logn)
    • 二分答案,每次查询(此处查询指二分后的查询有多少比 x x x小)有 n / log ⁡ n \sqrt n/\log n n /logn个整块,这部分复杂度为 O ( n ) O(\sqrt n) O(n )单次;
    • n log ⁡ n \sqrt n\log n n logn个零散点,这部分复杂度为 O ( n log ⁡ n ) O(\sqrt n\log n) O(n logn)单次。必须想办法优化掉零散点的复杂度。
    • 方法是预先把零散的两个快归并起来成为一个块,那么只需要在这上面二分就行了。
    • 最后总时间复杂度为 O ( m n log ⁡ n ) O(m\sqrt n\log n) O(mn logn)
  • 根号平衡1:维护一个集合,支持 O ( 1 ) O(1) O(1)插入一个数, O ( n ) O(\sqrt n) O(n )查询k小。
    • 离散化后值域分块,维护第 i i i个块里面有多少数,查询的时候从第一个块开始往右跑,做多走过 O ( n ) O(\sqrt n) O(n )个整块和 O ( n ) O(\sqrt n) O(n )个零散的数。
  • 根号平衡1:维护一个集合,支持 O ( n ) O(\sqrt n) O(n )插入一个数, O ( 1 ) O(1) O(1)查询k小。
    • 值域分块,后对每个数维护一下其在哪个块里面,对于每个块维护OV,那么修改只会改变 O ( n ) O(\sqrt n) O(n )个数所从属的块。
    • 查询的时候定位到其所属于的块,然后找到其在其块中对应的值。

暂时写到这,下面的还没看第二遍,第一遍听的云里雾里。
- 0202听课笔记_第3张图片0202听课笔记_第4张图片

莫队

时间复杂度 O ( m n + n n ) O(m\sqrt n+n\sqrt n) O(mn +nn )
0202听课笔记_第5张图片

  • 例题:0202听课笔记_第6张图片

    • 莫队直接做。
  • 例题:在某个区间内出现次数第k1少的价值是多少,可能多个不同的价值出现次数均为第k1少,输出其中第k2小的,保证输入合法。注意内存限制。

    • 莫队,做法待更。
  • 例题:在这里插入图片描述

    • 没听见,待更
  • 例题:求区间逆序对个数。

    • 二次离线莫队。传送门。大概懂了
  • 例题:[MtOI2019]手牵手走向明天0202听课笔记_第7张图片,神题,待更

树上莫队

待更

无删除莫队

freopen博客

其他题

  • 例题:0202听课笔记_第8张图片
  • 例题若干(未记载)

https://www.cnblogs.com/suwakow/protected/p/12262195.html放一下大佬博客。

你可能感兴趣的:(0202听课笔记)