OSDN Git Service

Update virtual-tree.md
author心旷神怡 <greyqz@126.com>
Wed, 3 Oct 2018 01:18:00 +0000 (09:18 +0800)
committerGitHub <noreply@github.com>
Wed, 3 Oct 2018 01:18:00 +0000 (09:18 +0800)
docs/ds/virtual-tree.md

index 742411d..1d8582e 100644 (file)
@@ -1,59 +1,61 @@
-## 引子:BZOJ - 2286 消耗战
-
-### Description
-
-在一场战争中,战场由 $n$ 个岛屿和 $n-1$ 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为 $1$ 的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他 $k$ 个岛屿上有丰富能源,为了防止敌军获取能源,我军的任务是炸毁一些桥梁,使得敌军不能到达任何能源丰富的岛屿。由于不同桥梁的材质和结构不同,所以炸毁不同的桥梁有不同的代价,我军希望在满足目标的同时使得总代价最小。
-
-侦查部门还发现,敌军有一台神秘机器。即使我军切断所有能源之后,他们也可以用那台机器。机器产生的效果不仅仅会修复所有我军炸毁的桥梁,而且会重新随机资源分布(但可以保证的是,资源不会分布到 $1$ 号岛屿上)。不过侦查部门还发现了这台机器只能够使用 $m$ 次,所以我们只需要把每次任务完成即可。
-
-### Input
-
-第一行一个整数 $n$,代表岛屿数量。
-
-接下来 n-1 行,每行三个整数 $u,v,w$,代表 $u$ 号岛屿和 $v$ 号岛屿由一条代价为 $c$ 的桥梁直接相连,保证 $1\le u,v\le n$ 且 $1\le c\le 10^5$。
-
-第 $n+1$ 行,一个整数 $m$,代表敌方机器能使用的次数。
-
-接下来 $m$ 行,每行一个整数 $k_i$,代表第 $i$ 次后,有 $k_i$ 个岛屿资源丰富,接下来 $k$ 个整数 $h_1,h_2,\cdots ,h_k$,表示资源丰富岛屿的编号。
-
-### Output
-
-输出有 $m$ 行,分别代表每次任务的最小代价。
-
-### Sample Input
-
-```text
-10
-1 5 13
-1 9 6
-2 1 19
-2 4 8
-2 3 91
-5 6 8
-7 5 4
-7 8 31
-10 7 9
-3
-2 10 6
-4 5 7 8 3
-3 9 4 6
-```
-
-### Sample Output
-
-```text
-12
-32
-22
-```
-
-### HINT
-
- 对于 $100\%$ 的数据,$2\le n\le 2.5\times 10^5,m\ge 1,\sum k_i\le 5\times 10^5,1\le k_i\le n-1$。
-
-### Source
-
-[Stage2 day2](http://www.lydsy.com/JudgeOnline/problemset.php?search=Stage2%20day2)
+## 引子
+
+???+ note "BZOJ - 2286 消耗战"
+    
+    ### Description
+    
+    在一场战争中,战场由 $n$ 个岛屿和 $n-1$ 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达。现在,我军已经侦查到敌军的总部在编号为 $1$ 的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望。已知在其他 $k$ 个岛屿上有丰富能源,为了防止敌军获取能源,我军的任务是炸毁一些桥梁,使得敌军不能到达任何能源丰富的岛屿。由于不同桥梁的材质和结构不同,所以炸毁不同的桥梁有不同的代价,我军希望在满足目标的同时使得总代价最小。
+    
+    侦查部门还发现,敌军有一台神秘机器。即使我军切断所有能源之后,他们也可以用那台机器。机器产生的效果不仅仅会修复所有我军炸毁的桥梁,而且会重新随机资源分布(但可以保证的是,资源不会分布到 $1$ 号岛屿上)。不过侦查部门还发现了这台机器只能够使用 $m$ 次,所以我们只需要把每次任务完成即可。
+    
+    ### Input
+    
+    第一行一个整数 $n$,代表岛屿数量。
+    
+    接下来 n-1 行,每行三个整数 $u,v,w$,代表 $u$ 号岛屿和 $v$ 号岛屿由一条代价为 $c$ 的桥梁直接相连,保证 $1\le u,v\le n$ 且 $1\le c\le 10^5$。
+    
+    第 $n+1$ 行,一个整数 $m$,代表敌方机器能使用的次数。
+    
+    接下来 $m$ 行,每行一个整数 $k_i$,代表第 $i$ 次后,有 $k_i$ 个岛屿资源丰富,接下来 $k$ 个整数 $h_1,h_2,\cdots ,h_k$,表示资源丰富岛屿的编号。
+    
+    ### Output
+    
+    输出有 $m$ 行,分别代表每次任务的最小代价。
+    
+    ### Sample Input
+    
+    ```text
+    10
+    1 5 13
+    1 9 6
+    2 1 19
+    2 4 8
+    2 3 91
+    5 6 8
+    7 5 4
+    7 8 31
+    10 7 9
+    3
+    2 10 6
+    4 5 7 8 3
+    3 9 4 6
+    ```
+    
+    ### Sample Output
+    
+    ```text
+    12
+    32
+    22
+    ```
+    
+    ### HINT
+    
+    对于 $100\%$ 的数据,$2\le n\le 2.5\times 10^5,m\ge 1,\sum k_i\le 5\times 10^5,1\le k_i\le n-1$。
+    
+    ### Source
+    
+    [Stage2 day2](http://www.lydsy.com/JudgeOnline/problemset.php?search=Stage2%20day2)
 
 ## 虚树 Virtual Tree
 
 
 那么步骤是这样的:
 
-- 将 3 个关键点$6,4,7$(我故意打乱了)按照 dfs 序排序,得到序列$4,6,7$
-- 将点$1$入栈
-- 取序列第一个作为当前节点,为$4$。再取栈顶元素,为$1$。求$1$和$4$的$LCA$:$LCA(1,4)=1$。
+- 将 3 个关键点 $6,4,7$(我故意打乱了)按照 DFS 序排序,得到序列 $4,6,7$
+- 将点 $1$ 入栈
+- 取序列第一个作为当前节点,为 $4$。再取栈顶元素,为$1$。求$1$和$4$的$LCA$:$LCA(1,4)=1$。
 - 发现$LCA(1,4)=$栈顶元素,说明它们在虚树的一条链上,所以直接把当前节点$4$入栈,当前栈为$4,1$
-- 取序列第二个作为当前节点,为$6$。再取栈顶元素,为$4$。求$6$和$4$的$LCA$:$LCA(6,4)=1$。
-- 发现$LCA(6,4)!=$栈顶元素,进入判断阶段。
-- 判断阶段:发现栈顶节点$4$的 Dfs 序是大于$LCA(6,4)$的,但是次大节点(栈顶节点下面的那个节点)$1$的 Dfs 序是等于$LCA$的(其实 Dfs 序相等说明节点也相等),说明$LCA$已经入栈了,所以直接连接$1->4$的边,也就是$LCA$到栈顶元素的边。并把$4$从栈中弹出。
+- 取序列第二个作为当前节点,为 $6$。再取栈顶元素,为$4$。求$6$和$4$的$LCA$:$LCA(6,4)=1$。
+- 发现$LCA(6,4)\neq$栈顶元素,进入判断阶段。
+- 判断阶段:发现栈顶节点$4$的 DFS 序是大于$LCA(6,4)$的,但是次大节点(栈顶节点下面的那个节点)$1$的 DFS 序是等于$LCA$的(其实 DFS 序相等说明节点也相等),说明$LCA$已经入栈了,所以直接连接$1->4$的边,也就是$LCA$到栈顶元素的边。并把$4$从栈中弹出。
 - 结束了判断阶段,将$6$入栈,当前栈为$6,1$
 - 取序列第三个作为当前节点,为$7$。再取栈顶元素,为$6$。求$7$和$6$的$LCA$:$LCA(7,6)=3$。
-- 发现$LCA(7,6)!=$栈顶元素,进入判断阶段。
-- 判断阶段:发现栈顶节点$6$的 Dfs 序是大于$LCA(7,6)$的,但是次大节点(栈顶节点下面的那个节点)$1$的 Dfs 序是小于$LCA$的,说明$LCA$还没有入过栈,所以直接连接$3->6$的边,也就是$LCA$到栈顶元素的边。把$6$从栈中弹出,并且把$LCA(6,7)$入栈。
+- 发现$LCA(7,6)\neq$栈顶元素,进入判断阶段。
+- 判断阶段:发现栈顶节点$6$的 DFS 序是大于$LCA(7,6)$的,但是次大节点(栈顶节点下面的那个节点)$1$的 DFS 序是小于$LCA$的,说明$LCA$还没有入过栈,所以直接连接$3->6$的边,也就是$LCA$到栈顶元素的边。把$6$从栈中弹出,并且把$LCA(6,7)$入栈。
 - 结束了判断阶段,将$7$入栈,当前栈为$1,3,7$
 - 发现序列里的 3 个节点已经全部加入过栈了,退出循环。
 - 此时栈中还有 3 个节点:$1, 3,7$,很明显它们是一条链上的,所以直接链接:$1->3$和$3->7$的边
@@ -593,7 +595,7 @@ int main (int argc, char const* argv[])
 
 ## BZOJ - 3572 世界树
 
-丧心病狂啊
+(丧心病狂啊)
 
 代码: