
dfs序
文章平均质量分 80
Frozen_Guardian
已退役菜鸡Acmer
展开
-
洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)
题目链接:点击查看题目大意:设 TTT 为一棵有根树,我们做如下的定义:设 aaa 和 bbb 为 TTT 中的两个不同节点。如果 aaa 是 bbb 的祖先,那么称“aaa 比 bbb 更为厉害”。设 aaa 和 bbb 为 TTT 中的两个不同节点。如果 aaa 与 bbb 在树上的距离不超过某个给定常数 xxx,那么称“ aaa 与 bbb 彼此彼此”。给定一棵 nnn 个节点的有根树 TTT,节点的编号为 111 到 nnn,根节点为 111 号节点。你需要回答 qqq 个询问,询问给原创 2021-08-23 21:26:40 · 490 阅读 · 4 评论 -
2021HDU多校10 - 7084 Pty loves string(KMPnext树+主席树+dfs序)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss,需要回答 qqq 次询问,每次询问给出一对 (x,y)(x,y)(x,y) ,意思是用 sss 的前缀 s[1:x]s[1:x]s[1:x] 和后缀 s[n−y+1:n]s[n-y+1:n]s[n−y+1:n] 拼起来后得到一个新的字符串 ttt,问 ttt 在 sss 中的出现次数题目分析:考虑对于一对询问 (x,y)(x,y)(x,y) 得到的 ttt,存在 s[l:r]=ts[l:r]=ts[l:r]=t,设断点为 x′=l+x原创 2021-08-20 21:43:59 · 530 阅读 · 1 评论 -
2021牛客多校7 - xay loves trees(dfs序+主席树-标记永久化)
题目链接:点击查看题目大意:给出两棵以点 111 为根节点的有根树,现在要求满足条件的最大集合:在第一棵树中,集合内的任意两个点都必须满足祖先关系,即 uuu 是 vvv 的祖先或 vvv 是 uuu 的祖先,且集合内的点在第一棵树上是联通的在第二棵树上,任意两个点不能满足祖先关系题目分析:CodeForces - 1529E 的加强版,题面仅仅增加了在第一棵树中的点需要保证联通这一个条件写在前面,明明都发题解了,还疯狂交滑动窗口的 ** ,浪费评测机资源了属于是官方题解:需要注意的是:原创 2021-08-08 01:12:01 · 329 阅读 · 0 评论 -
牛客 - 红蓝图(克鲁斯卡尔重构树的dfs序上建主席树)
题目链接:点击查看题目大意:给出一张 n 个点和 m 条边组成的无向图,每条边都有边权和颜色,颜色分为红色和蓝色,现在有 q 次相互独立的操作,每次操作会询问 ( x , t ) ,问删除掉所有权值大于 t 的红色边和所有权值小于 t 的蓝色边后,x 所在的连通块的大小是多少注意,两个点联通,既需要存在着红色的可达路径,也需要存在着蓝色的可达路径题目分析:如果去掉蓝色边的限制,只考虑 “删除掉权值大于 t 的边后,点 x 所在的连通块的大小是多少” ,这就是个标准的克鲁斯卡尔重构树的dfs序问题原创 2020-10-16 11:38:48 · 384 阅读 · 0 评论 -
CodeForces - 571D Campus(数据结构综合)
题目链接:点击查看题目大意:题目分析:数据结构的题目写起来真好玩~(debug到吐)考虑离线,题目实质上就是维护两个森林,然后对同一个序列进行的赋值操作,如果是对单一的森林进行加边删边然后连通块内求值修改之类的话,不难想到克鲁斯卡尔重构树,但两个森林的话该怎么办呢注意到第一个森林中对连通块的操作是加法,第二个森林中对连通块的操作是置零任取一个点 x 进行讨论,假设现在不考虑第二个森林的贡献,也就是忽略掉第二种操作和第四种操作,并且在每次操作后都记录一下点 x 的值,更具体的,设 va原创 2020-10-14 18:18:31 · 264 阅读 · 0 评论 -
CodeForces - 1417F Graph and Queries(克鲁斯卡尔重构树的dfs序上建线段树)
题目链接:点击查看题目大意:给出一个 n 个点 m 条边组成的无向图,每个点初始时都有一个权值 val,满足:每个点的 val[ i ] 各不相同 val[ i ] ∈ [ 1 , n ]现在有 m 次操作,每次操作分为以下两种类型:1 x:询问点 x 所在的连通块内 val 的最大值,设 val[ y ] 最大,输出 val[ y ],且进行赋值操作:val[ y ] = 0 2 x:将第 x 条边删除题目分析:难点比较多,且也很具有误导性,第一个难点就是如何处理连通块内的最大值问题,原创 2020-10-14 10:19:08 · 1082 阅读 · 0 评论 -
牛客 - Colorful Tree(dfs序+LCA)
题目链接:点击查看题目大意:给出一棵 n 个节点构成的数,每个节点都有一个颜色,现在需要执行 m 次操作,每次操作分为如下两种类型:Q x:回答所有颜色为 x 的节点构成的连通子图含有的最少边数 U x y:将点 x 的颜色修改为 y题目分析:一种没见过的模型,想了一下午没想明白原理,是我菜了,所以只记录一下如何实现吧求出整棵树的 dfs 序,将每个颜色的节点按照 dfs 序维护,对于每个节点 x 来说,设 l 为 dfs 序小于 x 的最大节点,r 为 dfs 序大于 x 的最小节点,mm原创 2020-10-07 17:28:45 · 773 阅读 · 0 评论 -
洛谷 - P4197 Peaks(Kruskal重构树+dfs序+主席树)
题目链接:点击查看题目大意:有n座山峰,每座山峰有他的高度 h[ i ] ,有些山峰之间有双向道路相连,共m条路径,每条路径有一个困难值,这个值越大表示越难走。现在有q组询问,每组询问询问从点v开始只经过困难值小于等于x的路径所能到达的山峰中第k高的山峰,如果无解输出−1。题目分析:因为有困难值的限制,所以可以对整个图跑克鲁斯卡尔重构树,如果对点 v 来说,只能走小于等于 x 的路径,可以树上倍增找到权值小于等于 x 的,深度最浅的祖先,显然这个祖先子树中的所有点都是可...原创 2020-08-23 19:35:55 · 406 阅读 · 0 评论 -
牛客多校4 - Ancient Distance(树上倍增+dfs序+线段树)
题目链接:点击查看题目大意:给出一棵 n 个节点且以点 1 为根节点的的树,现在给出一个 k ,需要在树上选择 k 个关键点,使得 n 个点到达根节点的路径上,出现的最近的关键点的距离的最大值最小,现在需要输出 k 分别为 1 ~ n 时的答案之和题目分析:首先理解题意,这个题目中有且仅由一个思维点需要转换过来,那就是直接计算 k 值下的答案是很难计算的,但是我们可以在某个答案下,贪心去计算 k 的值怎么理解上面这段话呢?对于某个答案 x 来说,因为 x 是题目中所有距离最大值的最小值,换句话说原创 2020-07-26 02:40:52 · 339 阅读 · 0 评论 -
牛客多校2 - Cover the Tree(dfs序)
题目链接:点击查看题目大意:给出一棵无根树,问能否选择数量最少的链,使得所有的路径都被覆盖到题目分析:读完题后不难看出,假设叶子结点的个数为 x,那么答案就是 x / 2 向上取整然后说结论,dfs序依次拿出叶子结点后,第 i 个叶子结点和第 i + x/2 个匹配就可以了,证明如下:代码:#include<iostream>#include<cstdio>#include<string>#include<ctime>#i.原创 2020-07-14 01:18:39 · 375 阅读 · 0 评论 -
HDU - 5788 Level Up(主席树+dfs序+树状数组)
题目链接:点击查看题目大意:给出一棵有向树,每个节点都有一个初始的权值 a[ i ] ,和一个通过计算得到的权值 mid[ i ] ,mid 数组的计算方法如下:mid[ u ] 为结点 u 及其子树中所有a[ i ] 的中位数,现在问如果可以令其中一个节点的 a[ i ] 变为 1e5,如何选择可以使得所有节点的 mid[ i ] 之和最大题目分析:乍一看题目可能比较复杂,但是一步一步分析下来可能就能找到突破口了首先是子树,对于子树上进行操作,我们可以跑出整棵树的dfs序,这样就将子树上的操.原创 2020-06-19 01:55:48 · 333 阅读 · 0 评论 -
CodeForces - 1328E Tree Queries(dfs序/LCA)
题目链接:点击查看题目大意:给出一棵以点 1 为根节点的树,接下来有 m 次询问,每次询问给出 k 个点,题目问我们能否找到一个点 u ,使得从根节点到点 u 的简单路径,到 k 个点的每个点的距离都小于等于 1题目分析:我的第一反应是用lca,仿照bfs那样,逐层询问每两个点之间的lca,但是不太会操作,队友和我说可以随便找一条最长的链然后检查,不过复杂度顶不住,赛后补题的时候,想到了...原创 2020-03-27 02:44:54 · 680 阅读 · 0 评论 -
HDU - 6203 ping ping ping(LCA+dfs序+线段树)
题目链接:点击查看题目大意:给出一棵由n+1个节点组成的数,节点编号为0~n(这个无关紧要,预处理时所有节点以及n都自增1即可转换为正常的模型了),现在给出m组节点u和v,问若想让m组u和v都断开连接,则最少需要去掉几个点题目分析:首先我们知道,若想让u和v断开连接,最优解肯定是切断其lca,毕竟是最近公共祖先嘛,当然切断u和切断v也可以满足断开连接,但并不是最优解,因为切断lca之后,l...原创 2019-11-12 14:19:09 · 240 阅读 · 0 评论 -
HDU - 5692 Snacks(dfs序+线段树)
题目链接:点击查看题目大意:中文题目,不多赘述题目分析:因为要求路线上权值和最大,我们可以用前缀和的思想来储存,故我们需要来维护最大值,可以用线段树来维护最大值,若想用线段树的话,前提必须是线性区间,所以我们将树用dfs序转换成线性区间,然后就可以用线段树来维护最大值了。注意,这个题有个坑点,因为最大值已经爆int了,所以inf要设成1e18,因为这个调了一整天。。。自闭上代码吧,...原创 2019-08-20 10:12:25 · 306 阅读 · 0 评论 -
CodeForces - 620E New Year Tree(线段树+dfs序+状态压缩)
题目链接:点击查看题目大意:给出一棵无向树,每个节点都有一种颜色,接下来时m次操作:1 x y:将x及其子树染成y的颜色 2 x:查询x及其子树上共有多少种不同的颜色题目分析:看完这个题的第一反应就是直接暴力跑跑试试,因为树的话时间复杂度是logn,暴力的话也才nlogn,可是等WA了一发后我才意识到,logn级别的是二叉树才能实现的时间精度,如果最差的情况,树是一条直线分布,那时间复...原创 2019-08-18 23:06:37 · 263 阅读 · 0 评论 -
HDU - 5877 Weak Pair(离散化+树状数组+dfs序)
题目链接:点击查看题目大意:给定一个n个节点的树,每个节点都有权值,现在定义weak pair(u,v)需要满足的两个条件:u是v的祖先; ;问给定的树中有多少个weak pair;题目分析:我们可以将问题转化一下,要求,可以两边同除,得到,即用dfs序从根节点跑一边树,记录截止到任意子节点为止,之前有多少个小于等于的父节点即可,用树状数组或线段树维护数量就行,这里偷个懒用树状数组...原创 2019-08-18 20:04:24 · 267 阅读 · 0 评论