首页 > 其他分享 >Tree Queries

Tree Queries

时间:2024-02-29 16:55:25浏览次数:15  
标签:nxt 序中 Tree DFS 访问 Queries 节点 out

应用DFS序非常好的一道题目

首先考虑暴力如何做,我们先考虑删除的点\(a\)在\(x\)下方,那么就相当于移除\(a\)的子树,由于与子树有关,所以可以想到DFS序

设\(in[a]\)表示DFS序中\(a\)第一次出现的位置,\(out[a]\)表示DFS序中\(a\)第二次出现的位置

当\(x\)固定的时候,如果删除的\(a\)是\(x\)的孩子,那么就相当于DFS序中\([in[a],out[a]]\)的点不可以再访问;如果\(a\)是\(x\)的祖先,设\(nxt[a]\)表示\(a\)到\(x\)的路径中\(a\)的下一个节点,那么就相当于DFS序中\([1,in[nxt[a]]-1]\)和\([out[nxt[a]]+1,n<<1]\)的点不能再访问。我们对每一个\(a\)都讨论这些序列,那么最后就能得出能访问的节点

设\(f[i]\)表示当访问到\(x\)的时候,DFS序中下标\(i\)所代表的节点到\(x\)的距离,由于不可能开\(n\)个\(f[n<<1]\),所以我们考虑实时更新

当即将从\(x\)访问其儿子\(u\)时,假设我们已经更新好了\(x\)的\(f\)

那么对于一个点\(a\),如果\(a\)是\(u\)的孩子,那么\(a\)到\(u\)的距离相当于\(a\)到\(x\)的距离减一;否则相当于加一。这个操作就可以用线段树完成

我们维护好了\(f\)后,假设已经求出仍然能够访问的节点,就利用线段树查询区间最大值就好了

还有一个问题,如果快速求出\(nxt\)数组?其实我们没必要像可持久化那么做,想一下dfs的过程,当dfs到\(x\)这个节点的时候,系统栈里面存储的是从根节点到\(x\)的路径上所有的节点(即\(x\)的所有祖先),如果我们每次在\(x\)即将访问其儿子\(u\)之前,令\(nxt[x]=u\),就可以维护\(nxt\)数组了,这个想法真的是非常妙

注意代码里面,结构体中开一个vector是需要手动clear的

标签:nxt,序中,Tree,DFS,访问,Queries,节点,out
From: https://www.cnblogs.com/dingxingdi/p/18044751

相关文章

  • CF383C Propagating tree 题解
    题目链接:CF或者洛谷比较朴素的题,注意到这个涉及到子树变化,我们考虑优先处理出\(dfs\)序,方便处理。注意到第一个问题较为繁琐,我们着重解决下第一个问题。在树上问题,我们这种间隔点常常使用\(deep\)进行区分。根的\(deep\)为奇数,那么对自己子树范围内的奇数\(deep\)......
  • Codeforces 264E Roadside Trees
    首先考虑时间增长的问题,设第\(i\)棵树的种植时间为\(t_i\)。那么第\(x\)棵树比第\(y\)棵树高就是\(h_x+(t_y-t_x)>h_y\),也就是\(h_x-t_x>h_y-t_y\)。所以可以直接用\(h_i-t_i\)当作第\(i\)棵树的高度,即\(h'_i\leftarrowh_i-t_i\)。对于增加,考虑......
  • [LeetCode] 2583. Kth Largest Sum in a Binary Tree
    Youaregiventherootofabinarytreeandapositiveintegerk.Thelevelsuminthetreeisthesumofthevaluesofthenodesthatareonthesamelevel.Returnthekthlargestlevelsuminthetree(notnecessarilydistinct).Iftherearefewerthan......
  • [ABC303Ex] Constrained Tree Degree 题解
    AtCoder题面洛谷题面如果每个点的度数都知道了,那问题就转化成了P2290[HNOI2004]树的计数,直接求Prufer序列的个数即可,因为一个度数为\(d_i\)的点在Prufer序列中的出现次数是\(d_i-1\),所以答案是:\(\frac{(n-2)!}{\prod_{i=1}^{n}(d_i-1)!}\)。可以把\((n-2)!\)放到......
  • 题解 CF725G Messages on a Tree
    updateon2023.8.9修正了一些错误。\(\texttt{link}\)第\(i\)条信息的传输可以表示成\(x_i\)走到\(x_i\)的某一祖先再走回\(x_i\)的路径。所以答案只和\(x_i\)的这一祖先有关,记为\(f_i\),则\(ans_i=t_i+2\timesdep_{x_i}-2\timesdep_{f_i}\)。若\(x_i\)在\(f......
  • Link-cut tree 略解
    一些前言每次做树剖时打开题解...使用LCT简单维护即可。内心:???code好√8短啊又很奇怪有种不知道却又高端大气的感觉这次来说清楚LCT到底是个什么东东问题引入例题传送门有一棵树,需要支持操作:修改节点\(u\tov\)路径值查询节点\(u\tov\)路径值很明显,这是......
  • P4666 [BalticOI 2011 Day1] Growing Trees题解(平衡树思想)
    自己第一道不看题解写出来的紫题,庆祝一下(没初始化种子导致调了30min)这是一个fhq-treap的题解思路来源:首先看题目,因为是序列上的问题,不难想到是一道数据结构题。首先看到操作C:对于这种操作,我们可以用平衡树解决,具体方法是,将树split成\(<min,min\lex\lemax,>max\)这......
  • Vue3学习(十九) - TreeSelect 树选择
    写在前面我知道自己现在的状态很不好,以为放个假能好好放松下心情,结果昨晚做梦还在工作,调试代码,和领导汇报工作。天呐,明明是在放假,可大脑还在考虑工作的事,我的天那,这是怎么了?Vue页面参数传递1、任务拆解页面跳转时带上当前电子书id参数ebookId新增/编辑文档时,读取电子书id......
  • LeetCode] 2476. Closest Nodes Queries in a Binary Search Tree
    Youaregiventherootofabinarysearchtreeandanarrayqueriesofsizenconsistingofpositiveintegers.Finda2Darrayanswerofsizenwhereanswer[i]=[mini,maxi]:miniisthelargestvalueinthetreethatissmallerthanorequaltoqueries[......
  • Vue3学习(十八) - TreeSelect 树选择
    写在前面本以为可以在家学习一天,结果家里来了客人拜年,就没学习上,有点小遗憾吧。昨天完成从分类管理的前后端代码复制出文档管理的前后端代码,遗留问题是只能选择一级父分类。值得说的是,昨晚的遗留的问题修复了,开心。遗留问题点击父文档,弹出警告,从报错来看那意思就是parent应该......