虚树 [SDOI2011]消耗战 板题,基本上是对着网上的板子敲的 #include <bits/stdc++.h> using namespace std; inline int read() { int out = 0; register char cc = getchar(); while ( ...
分类:
其他好文 时间:
2021-03-01 12:59:52
阅读次数:
0
UOJ87 mx的仙人掌 这里没有用传统的方点外接圆点的做法,而是方点虚树上儿子跳到方点所在环上单调队列处理,本质上是一样的. code //爽! #include<bits/stdc++.h> using namespace std; typedef long long ll; const int ...
分类:
其他好文 时间:
2021-02-06 12:15:50
阅读次数:
0
战略游戏 题目要求求删除后能使一些点不连通的点的个数。 删点可以想到点双树。 建出原图的点双树。 一条路径x,y上的点如果被删除,则x,y不能互相到达。 如果把圆点的权值设为1,方点的设为0,则答案就是虚树的点权和。 实际上,不用把虚树建出来。可以使用一个经典结论。 如果把一个点的权值放在父亲边上, ...
分类:
其他好文 时间:
2020-07-24 21:52:20
阅读次数:
74
虚树对于多次询问的时候有这优化复杂度的好处,其原理就是只保留有用节点和必须保留的有用节点的lca 先求一遍dfs序后,用栈模拟操作,根据lca是否在栈中确定是否要将lca加入栈,因为重构了树,因此原来的边的信息需要进行更换 对于本题,新的边其实就是路径上的边权的最小值,这是因为随便切掉一个边就能把他 ...
分类:
其他好文 时间:
2020-07-22 16:20:10
阅读次数:
75
一些有意思,但是没地方提交的题。 1 每个点有一个颜色,求树上所有颜色不同点对的距离和。 做法一 不同点对的距离和 \(=\) 总距离和 \(-\) 相同颜色的点对距离和。 对每个颜色建立虚树,然后算就得了。 做法二 首先同样进行第一步转化。 考虑使用线段树合并维护一个子树中每种颜色有多少个,深度之 ...
分类:
其他好文 时间:
2020-07-03 23:28:35
阅读次数:
82
题意 给定一棵树,点有黑/白颜色,每个点给定一个$w_i$,若某白点$i$子树超过了$w_i$个黑点,则白点会被标记。$m$次修改点颜色,每次回答有多少被标记的点 做法 对操作分块 对块内修改节点建虚树,则每次修改一个点,影响的是该点至根路径 将虚树上同一条边代表的原树上的节点一起处理 \(O(n\ ...
分类:
其他好文 时间:
2020-05-31 13:19:22
阅读次数:
57
首先建立好trie,由于问题询问的结点和不超过2e5,可以用虚树解决 bug百出。。调试了一上午 /* 对给定串建立trie,标记上终止结点,d[u]表示结点u的深度 对于每个询问,标记k个串对应的终止结点,然后建立虚树 虚树里维护size[u],fa[u],所有size[u]=L的点都是符合要求的 ...
分类:
其他好文 时间:
2020-05-01 15:12:41
阅读次数:
69
虚树,顾名思义,就是假的树. 在树形dp中有很大的优化作用. 虚树主要针对于树中关键点的询问.我们仅仅对关键点及其lca建一棵树.这样只要保证sigmak在时间复杂度内即可. 以下是建树的模板 q=read(); for(int i=1;i<=q;++i) { num=read(); for(int ...
分类:
其他好文 时间:
2020-03-14 12:36:13
阅读次数:
50
我记得我学过虚树啊 除了做过的题目有提交的痕迹 脑子空空如也。 今天一定要复习好虚树 我没剩多少时间了。 1.虚树是干嘛的? 对于一道题目 我们发现其每次询问树上的一些点集的某种定义下的答案 通常我们不需要再次遍历整棵树来寻找答案 可以利用题目中给出的这些点集建立一颗不存在的树 即称虚树。 2.如何 ...
分类:
其他好文 时间:
2020-03-14 01:21:11
阅读次数:
51
题目描述 题解 考虑把式子化一下,因为只有一个式子跟第二棵树有关,所以我们可以考虑把前面的式子化成跟 $\text{lca}$ 没有关系,即 $\frac{1}{2}(dp_u+dp_v+dis(u,v))$ 。因此我们可以利用边分治,每次把两边的点黑白染色,构成虚树,然后做 $\text{dp}$ ...
分类:
其他好文 时间:
2020-02-26 21:06:14
阅读次数:
60