树分治
例题
多次查询是否存在距离为 \(k\) 的点对
代码
求树上点对距离小于等于 \(k\) 的数量
代码
求树上点对距离为 \(3\) 的倍数的数量
代码
P5306 [COCI2018-2019#5] Transport - 洛谷
\(n\) 个城市, \(n-1\) 条路, 每条路都有消耗 \(w\) 单位油, 每个城市都可以加 \(v\) 单位油.
问有多少有序对 \((u,v)\) 满足, 起始油量为 \(0\) 的车, 可以从 \(u\) 出发, 抵达 \(v\).
点分治
当以 \(rt\) 为根时, \(w_i\) 表示 \(rt\) 到 \(i\) 的点权和, \(d_i\) 表示 \(rt\) 到 \(i\) 的边权和
①从 \(i\) 到 \(rt\), 对路径上任意点 \(j\) 都有 \(w_i-w_j\ge d_i-d_j\).
可以把式子化为 \(w_i-d_i-(w_j-d_j)\ge0\) 等价于 \(w_i-d_i-\max(w_j-d_j)\ge0\)
那么我们只需要子树中最大的 \(w_j-d_j\) 即可.
②从 \(rt\) 到 \(i\), 此时起点不一定是 \(rt\), 可以是其他子树的一个点 \(k\), 设从 \(k\) 到 \(rt\) 剩余 \(x\) 单位油, 则 对路径上任意点 \(j\) 都有 \(x+w_{fa_j}\ge d_j\), 变换一下得 \(x+w_{fa_j}-d_j\ge0\), 那么我们只需要子树中的最小的 \(w_{fa_j}-d_j\) 即可.
代码
| C++ | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | |
P3060 [USACO12NOV] Balanced Trees G - 洛谷
\(n\) 个点的树, 每个点有左括号或右括号, 在一条简单路径的括号能匹配的情况下, 最大嵌套层数是多少?
考虑从 \(i\) 到 \(rt\), 有两种, 此时记左括号权值为 \(1\), 右括号权值为 \(-1\)
①以左括号开头, 符合条件的一定要每个前缀都 \(ge0\), 我们需要维护这个前缀的最小值 \(Lmi\), 每次取 \(\min(Lmi+a_{to},0)\) 即可. 为了计算答案我们需要左括号的最长前缀 \(Lmx\) 和左括号多的数量 \(Ldis\).
②以右括号开头, 我们将前缀的值取反, 符合条件的一定要每个前缀都 \(ge0\), 我们需要维护这个前缀的最小值 \(Rmi\), 每次取 \(\min(Rmi-a_{to},0)\) 即可. 为了计算答案我们需要左括号的最长前缀 \(Rmx\) 和右括号多的数量 \(Rdis\).
考虑计算答案, 一定是 \(Ldis=Rdis\) 的情况下 \(\max(Lmx,Ldis+Rmx)\)
代码
| C++ | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | |