题面: 传送门 思路: 又是一道虚树入门级的题目,但是这道题的实际难点在于dp 首先,这道题是可以点分治做的,而且因为6s时限随便浪,所以写点分治也不是不可以 但是,dp因为$O\left(n\right)$的高效率,依然最好优先考虑 对于这道题的dp,我们首先记录几个数组: siz[u]表示以u为根(包括u)的子树中,询问点的总个数 minn[u]表示子树中最短的一条由子树根到询问点的路径,maxn[u]则是最长的 sum[u]则代表这棵子树中所有要求路径的长度总和 最小路径和最大路径的dp都…
[题意]给定n个点的带边权树,对于树上存在的若干特殊点,要求任选一个点开始将所有特殊点走遍后返回.现在初始没有特殊点,m次操作每次增加或减少一个特殊点,求每次操作后的总代价.n,m<=10^5. [算法]虚树+DFS序+set [题解]每次询问相当于求两倍虚树路径和. 模拟虚树上dfs序的转移会发现,dfs序相邻(1和n视为相邻)的两点路径值的总和,就是虚树路径和的两倍. 那么只需要用set维护特殊点集合,每次根据前驱后继更改答案. #include<cstdio> #include&l…
题目 洛谷 P4322 [JSOI2016]最佳团体 Description 茜茜的舞蹈团队一共有\(N\)名候选人,这些候选人从\(1\)到\(N\)编号.方便起见,茜茜的编号是\(0\)号.每个候选人都由一位编号比他小的候选人\(R_i\)推荐.如果\(R_i=0\)则说明这个候选人是茜茜自己看上的.为了保证团队的和谐,茜茜需要保证,如果招募了候选人\(i\),那么候选人\(R_i\)也一定需要在团队中.当然了,茜茜自己总是在团队里的.每一个候选人都有一个能力值\(P_i\),也有一个招募费…
Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道.  我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上.  在 2 个国家 a,b 之间建一条新通道需要的代价为树上 a,b 的最短路径.  现在国家有很多个计划,每个计划都是这样,我们选中了 k 个点,然后在它们两两之间 新建 C(k,2)条 新通道. 现在对于每个计划,我们想知道:  1.这些新通道的代价和  2.这些新通道中代价最小的是多少  3.这些新通道中代价最大的是多少   Inpu…
题意 链接 Sol 虚树. 首先建出虚树,然后直接树形dp就行了. 最大最小值直接维护子树内到该节点的最大值,然后合并两棵子树的时候更新一下答案. 任意两点的路径和可以考虑每条边两边的贡献,\(d[x]\)表示到该节点的所有节点的路径和,转移的时候考虑一下两棵子树的siz就行(画一下图就很清楚了) 每次询问可以用个队列记录一下被访问过的元素,清空的时候只清空队列里的点. #include<bits/stdc++.h> #define Pair pair<int, int> #def…
题目链接 要求的和.最大值.最小值好像都可以通过O(n)的树形DP做,总询问点数<=2n. 于是建虚树就可以了.具体DP见DP()函数,维护三个值sum[],mx[],mn[]. sum[]要开longlong!.. //108172kb 2564ms(又是Rank4...) #include <cstdio> #include <cctype> #include <cstring> #include <algorithm> //#define gc(…
题目: 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 a,b 的最短路径. 现在国家有很多个计划,每个计划都是这样,我们选中了 k 个点,然后在它们两两之间 新建 C(k,2)条 新通道. 现在对于每个计划,我们想知道: 1.这些新通道的代价和 2.这些新通道中代价最小的是多少 3.这些新通道中代价最大的是多少 题解: 这道题貌似是虚树的板子题. 为了…
虚树 我们每天都用心思索着,这究竟是为了什么呢?我想我也不知道,只是觉得如果人不思考问题就很无聊. 我觉得虚树不是什么数据结构,就是一种技巧或者工具.它能把树中\(k\)个关键点以\(O(klogk)\)的复杂度变成一棵节点数\(2*k\)以内的树.并且构树的边的信息适用广泛(如最大值,和--) 有两种构树方法:(我这里只讲第一种,第二种男鞋后面看心情) 我们把所有节点按dfn排序,然后相邻两个求的lca加入点中再排序. 用到stack,每个点在加入之前,一直弹栈,直到找到第一个是它祖先的点当做…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3611 https://www.luogu.org/problemnew/show/P4103 虚树的边权就是两端点的 dep 差. 求最短边可以像求最长边一样记录一个 d2[ cr ] 表示 cr 到其子树里最近的关键点的距离. 可以用 vis[ ] 记录哪些点是关键点.在 DP 的 dfs 里清空数组真是舒服. #include<cstdio> #include<cstring&…
虚树第二题.... 同BZOJ2286 #include <map> #include <cmath> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (int i=j;i<=k;++i) #d…