首页 > 其他分享 >虚树

虚树

时间:2024-09-11 11:36:24浏览次数:6  
标签:sta int top 点集 mathcal 虚树

用以解决树上的和点集相关的问题,将树的大小缩减至 \(\mathcal{O}(|S|)\) 级别。

构建方法即将所有关键点按照 \(\rm dfs\) 序排序,然后再将 \(LCA(s_i,s_{i+1})\) 加入并去重,时间复杂度 \(\mathcal{O}(n\log n)\)。

有线性构建的单调栈方法,没学。

粘个代码

for(int i=1; i<=k; i++)
{
    if(a[i]==1) continue;
    int lca=LCA(sta[top],a[i]);
    if(lca!=sta[top])
    {
        while(dfn[lca]<dfn[sta[top-1]])
            g[sta[top-1]].push_back(sta[top]), top--;
        g[lca].push_back(sta[top]);
        if(dfn[lca]>dfn[sta[top-1]]) sta[top]=lca;
        else top--;
    }
    sta[++top]=a[i];
}
for(int i=1; i<top; i++)
    g[sta[i]].push_back(sta[i+1]);

一些性质

  • 点集 \(S=\{u_0,u_1,\dots,d_{m-1}\}\) 的完整虚树的边权和:

    \[\dfrac{1}{2}\sum\limits_{i=0}^{m-1}dis(u_i,u_{(i+1)\bmod m}) \]

    应用:P3320 [SDOI2015] 寻宝游戏

简单题:

标签:sta,int,top,点集,mathcal,虚树
From: https://www.cnblogs.com/xishanmeigao/p/18407988

相关文章

  • 虚树+树形dp
    虚树实际上是一颗浓缩子树;使用虚树的题目大部分具有查询的点有限,同时虚树构建的信息符合规则;做虚树的题目:步骤为先想出原树的暴力求解做法,然后构建虚树同时向其中添加有用信息(比如边权);虚树的构建过程:虚树的构建大致有两种,但是两种方式都与dfs序有关;首先解释为什么与dfs序有......
  • 虚树
    消耗战首先考虑朴素\(dp\),设\(f_u\)表示使\(u\)的子树内的所有关键点都不与\(u\)连通的最小代价。如果当前在\(u\),\(j\)这个儿子是关键点,那么有转移\(f_u\leftarrowf_u+val_{u\rightarrowj}\);否则有转移\(f_u\leftarrowf_u+\min(f_j,val_{u\rightarrowj})\)。这......
  • 虚树总结
    之前学了一些算法,没有写算法总结,未来会陆续补一些。前置知识:树形\(dp\),\(lca\),\(dfs\)序。我们考虑\([HEOI2014]\)大工程这道题。显而易见,假如这道题只有一次询问,我们可以直接树形\(dp\),快速求出答案,时间复杂度\(O(n)\)。但是,梦想是梦想,现实是现实,这题多组询问,假如一......
  • 虚树
    引入$\color{skyblue}P2495[SDOI2011]消耗战$题意给定一颗$n$个节点的树,每条边有边权。有$m$次询问,每次询问钦定$k$个特殊节点,问使得节点$1$不与任何特殊节点相连通所需要删除的最小总边权是多少。数据范围:对于\(100\%\)的数据,\(2\leqn\leq2.5\ti......
  • 虚树
    虚树VirtualTree浓缩信息,把一整颗大树浓缩成一颗小树。下图中,红色结点是我们选择的关键点。红色和黑色结点都是虚树中的点。黑色的边是虚树中的边。OIWIKI两种建树方式1.第一种构造过程:二次排序+LCA连边(容易理解,常数略大)boolcmp(intx,inty){returndfn[x......
  • 关于虚树
    关于虚树瞎扯某些树上问题,给了巨多节点,而实际上它们之中只有小部分能做出贡献,其余都是些水军,为杀尽OIers的脑细胞做出努力考虑重新种一棵树,浓缩信息,简化节点个数,于是产生了虚树。大概是长这个样子:红色结点是我们选择的关键点,即能够做出贡献的点。红色和黑色结点都是虚树中......
  • 20240806:点分治,虚树选做
    POJ-1741Tree题意:给定一棵树,求多少无序对\((u,v)\)满足\(\text{dist}(u,v)\lek\)。对于树上的路径进行分类:经过根;不经过根。第二类路径点可以通过递归子树求出。对于经过根的路径,可以一遍dfs求出每个点到根的距离\(\text{dis}(u)\)。问题转化为求\(\text{dis}(u)......
  • 虚树【学习笔记】
    为什么要用虚树?例题在某些树上问题中,对于某次询问,我们并不需要用到全部的树上的点:例如,例题中:总点数\(n\le2.5\times10^5\)询问次数\(m\le5\times10^5\)询问的点数\(\sumk_i\le5\times10^5\)我们可以发现其实每次询问均摊下来的询问点数k并不多,但如果每次询问都......
  • 虚树复习 & O(1) 查询 LCA
    放假是不可能做题的。那就写总结把。虚树问题的情境涉及多次树上询问,每次指定一些点,让你计算。此类问题需要我们在线地找到尽可能少的【关键点】进行计算,最好和给的点级别一样。虚树的思想就是这个过程。二次排序一个关键直觉:【指定点】两两的LCA一定是【关键点】。并且......
  • 从 dfs 序求 lca 到虚树到树分块 学习笔记
    前言想象我在口胡三样我都不熟悉的东西并尝试称之为“学习笔记”。其实不过是我自己对于它的一点小理解,甚至可能是错误的!无所谓,口胡!口胡!口胡!口胡!口胡!一些备注\(dfn_u\)为点\(u\)的dfn序,\(nfd_i\)表示第\(i\)个dfs到的点是啥(前者的反数组)dfs序求lca这个很简单,想......