首页 > 其他分享 >CF1904E Tree Queries

CF1904E Tree Queries

时间:2023-12-10 16:57:06浏览次数:30  
标签:访问 询问 Tree DFS 节点 CF1904E Queries operatorname out

给定一棵 \(n\) 个节点的树与 \(q\) 次询问,每次询问给出一个 \(x\) 与一个大小为 \(k\) 的点集 \(a\),要求求出在删去了 \(a\) 中的点后从 \(x\) 出发的最长简单路径的长度。每次询问独立。

\(n, q, \sum k \le 2 \times 10^5\)。

一些记号:

  • \(p_i\) 表示时间戳 \(i\) 对应的节点
  • \(c_u\) 表示节点 \(u\) 的时间戳
  • \(s_u\) 表示节点 \(u\) 的子树大小
  • \(d_u\) 表示节点 \(u\) 的深度
  • \(\operatorname{in}(u) = c_u\),即在 DFS 过程中进入节点 \(u\) 的时间
  • \(\operatorname{out}(u) = c_u + s_u - 1\),即在 DFS 过程中离开节点 \(u\) 的时间
  • \(\operatorname{nxt}(u, v)\) 表示在 \(u \to v\) 的路径上的第二个节点,其中 \(u\) 为 \(v\) 的祖先。

思考「删点」这个过程的本质,可以发现,若以每次询问的 \(x\) 作为根节点,那么删点本质上就是使得某个点以及其子树内的点都无法被访问到,而「子树」这一条件则很容易让我们想到 DFS 序。于是删除点 \(u\) 也就是意味着 DFS 序处在 \([\operatorname{in}(u), \operatorname{out}(u)]\) 的节点无法被访问了。

但是如果以每次询问的 \(x\) 作为根节点,那就相当于每次询问都要重新构造 DFS 序,复杂度肯定是爆炸的,因此我们考虑如何在根节点固定为 \(1\) 的情况下表示上述的过程。

画一个图,我们就很容易得到:对于一个点 \(u\) 以及一个待删除的点 \(v\),我们很容易发现,若 \(v\) 为 \(u\) 的祖先,那么删去 \(v\) 会导致除去 \(\operatorname{nxt}(v, u)\) 所在的子树外,其他的节点,也就是 DFS 序位于 \([1, \operatorname{in}(\operatorname{nxt}(v, u)) - 1]\) 以及 \([\operatorname{out}(\operatorname{nxt}(v, u)) + 1, n]\) 的节点,都无法被访问了。而如果 \(v\) 不是 \(u\) 的祖先,那么跟根不固定的情况没有区别,都是 DFS 位于 \([\operatorname{in}(v), \operatorname{out}(v)]\) 的节点无法被访问到。

那么很容易看出,「删点」这一操作会将可访问的点的 DFS 序划分成个数为 \(\mathcal{O}(k)\) 级别的连续段,而 \(\sum k \le 2 \times 10^5\),因此我们只需要一个能够快速求出每个连续段内的答案的方法即可。

对于一个节点 \(u\),我们设 \(f_i = \operatorname{dis}(p_i, u)\),那么一次询问的答案就是在 \(x\) 可访问的节点对应的 DFS 序中 \(f\) 的最大值。对于根节点 \(1\),很显然有 \(f_i = d_{p_i}\)。对于节点 \(u\) 与它的一个儿子节点 \(v\),不难发现,对于 \(v\) 子树外的点,也即是 DFS 序位于 \([1, \operatorname{in}(v) - 1]\) 与 \([\operatorname{out}(v) + 1, n]\) 的点,其到 \(v\) 的距离为到 \(u\) 的距离 + 1,而对于子树内的点,其到 \(v\) 的距离则为到 \(u\) 的距离 - 1。那么这实际上就是在 \(f\) 上做区间加减的操作,而求答案则对应着区间求 \(\max\) 的操作,因此可以用一棵线段树维护。

那么做法就很简单了。我们考虑将询问离线,然后在 DFS 的过程中计算每个询问的答案。在转移到当前节点儿子的时候就用上述的方法来维护当前的 \(f\) 就可以了。

最后的问题就是如何得到某个询问对应的可访问的连续段。这个是经典的了,我们考虑把不合法的连续段求出来,然后按照左端点为第一关键字排序,再在扫描过程中维护当前可访问连续段的左端点即可。

代码,时间复杂度大概是 \(\mathcal{O}((\sum k + n) \log n)\)。

标签:访问,询问,Tree,DFS,节点,CF1904E,Queries,operatorname,out
From: https://www.cnblogs.com/forgot-dream/p/17892861.html

相关文章

  • AT_cf17_final_j Tree MST 题解
    题意:给定一颗\(n\)个点的树,点\(i\)有权值\(a_{i}\),边有边权。现在有另外一个完全图,两点之间的边权为树上两点之间的距离加上树上两点的点权,求这张完全图的最小生成树。首先有一个很显然的暴力,把完全图中每两点之间的边权算出来,然后跑一边最小生成树,时间复杂度\(O(n^{2}\lo......
  • CodeForces 1902F Trees and XOR Queries Again
    洛谷传送门CF传送门如果我们能把\(x\toy\)路径上的所有点权插入到线性基,那么可以\(O(\logV)\)查询。但是因为线性基合并只能\(O(\log^2V)\)(把一个线性基的所有元素插入到另一个),所以只能倍增做\(O((n+q)\logn\log^2V)\),过不了。考虑\(O(n\logV)\)预处理出......
  • Linux中的红黑树(rbtree)【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/rbtree.html红黑树(rbtree)在Linux中日期2007年1月18日作者[email protected]红黑树是什么,它们有什么作用?红黑树是一种自平衡的二叉搜索树,用于存储可排序的键/值数据对。这与基数树(用于高效存储稀疏数组,因......
  • 【JavaSE】集合Collection{List(ArrayList, LinkedList), Set(TreeSet, HashSet, Link
    集合单列集合:Collection接口单列集合:一次添加一个元素;如果集合中添加的是类,要重写equals方法,否则比较的是地址,无法正常删除内容相同的元素。单列集合通用遍历方式1.迭代器遍历2.增强for循环遍历增强for循环底层逻辑还是迭代器,字节码文件反编译为java会发现还是迭代......
  • Top Tree 相关理论扯淡
    目录前言TopCluster分解与TopTree从树分块说起簇、簇操作、树的簇表示法基于重量平衡的静态TopTree动态TopTree簇与TopTree的性质静态TopTree的应用树上信息合并链上修改与查询子树修改与查询维护动态直径例1:【2023集训队互测Round12】不跳棋维护动态重心维护动......
  • [ARC164E] Segment-Tree Optimization 题解
    题目链接题目链接题目解法一个自认为比较自然的解法这种一段序列切成两部分的问题首先考虑区间\(dp\)令\(f_{l,r}\)为\([l,r]\)能构成的最小深度,\(g_{l,r}\)为在\(f_{l,r}\)最小的情况下最少的最大深度的点的个数转移枚举\(k\)即可需要在下面是叶子的时候处理一......
  • element tree 优化线条树,添加增删改功能
    需求:树状结构,支持操作功能(同级、子级、修改、删除)。根据需求是否展示复选框和操作功能。封装linetree.vue组件:1<template>2<div>3<el-tree:data="list":props=defaultProps:expand-on-click-node="false":default-expand-all="true"4......
  • 树上启发式合并(dsu on tree)
    dsuonTree(树上启发式合并)当遇到处理子树询问,并且无修改时。可以考虑树上启发式合并。算法流程:step1:处理出每个点的\(siz_x\)以及重儿子\(son_x\)。voiddfs(intx,intfa){ siz[x]=1; intMaxson=0; for(inti=0;i<p[x].size();i++){ inty=p[x]......
  • Sourcetree安装详细步骤
    Sourxetree作为免费的Git客户端工具,有许多优点。Sourcetree简化了与Git存储库交互的方式,因此我们可以专注于编码。通过Sourcetree简单又快捷的管理我们的存储库。1.下载https://www.sourcetreeapp.com/2.安装3.创建伪账号进入文件夹%LocalAppData%\Atlassian\Source......
  • 打工笔记----------------------------跨进程控制SysTreeView32树状图控件的问题
    跨进程控制SysTreeView32树状图控件的问题,啥也不说了,直接上代码:publicpartialclassForm1:Form{//定义常量publicconstintWM_LBUTTONDBLCLK=0x020B;//左键双击消息publicconstintWM_RBUTTONDOWN=0x0204;//右键按下消息......