
dfs序
dfs序
昵称很长很长真是太好了
这个作者很懒,什么都没留下…
展开
-
New Year Tree(dfs序+线段树+二进制)
题意: 给出一棵 n个节点的树,根节点为 1。每个节点上有一种颜色 ci。m次操作。操作有两种:1 u c:将以 u为根的子树上的所有节点的颜色改为c。2 u:询问以 u为根的子树上的所有节点的颜色数量。题解:一看题目好像是个dfs序+线段树的板子题,但是需要思考的是,怎么查询一段区间的颜色数目呢?如果把这个问题解决了的话,这个题目也就相应的解决了。看到颜色数目好像并不多,嗷,极好,60(2^60)正好在ll的范围内。我们可以考虑每一位储存一种颜色,返回值为这段区间的**(或)|**。这样子原创 2021-01-15 12:07:37 · 213 阅读 · 0 评论 -
[codeforces] 383C Propagating tree(dfs序+线段树)
题意:给你一棵n个结点的树, 以1为根。每个结点有点权。有m次操作:1.x结点权值 +val,x的儿子权值 −val,x的孙子们 +val,以此类推。2.询问x的点权;题解:我们首先跑一边dfs序,顺便求除每个结点的深度。我们把他分成两颗线段树,深度为奇数的在第一颗上,深度为偶数的在第二课上。我们每次对两颗线段树同时操作。第一颗线段树只进行+操作,第二棵线段树只-操作。当我们询问某个点时,我们只需要判断一下这个点的奇偶,决定查询哪颗树即可。/*Keep on going Never gi原创 2020-11-20 13:53:16 · 202 阅读 · 0 评论 -
求和(dfs序+线段树)
题意:已知有n个节点,有n−1条边,形成一个树的结构。给定一个根节点k,每个节点都有一个权值,节点i的权值为vi。给m个操作,操作有两种类型:1 a x :表示将节点a的权值加上x2 a :表示求a节点的子树上所有节点的和(包括a节点本身)题解:dfs序+线段树用dfs序确定in[x]和out[x]的位置,in是当前结点开始的时间戳,out是回溯到当前结点的时间戳,当查询某结点时,可以快速确定他子树的范围。代码:/*Keep on going Never give up*///#pr原创 2020-11-19 21:50:12 · 250 阅读 · 0 评论 -
CF570D Tree Requests
题意:给定一个以1为根的n个节点的树,每个点上有一个字母(a-z),每个点的深度定义为该节点到1号节点路径上的点数.每次询问 a,b 查询以a为根的子树内深度为b的节点上的字母重新排列之后是否能构成回文串.题解:dfs序+状态压缩+二分查找这个题用到了很多小技巧,比如说异或前缀和等等。我们首先对他跑一边dfs序,记录下每个点的时间戳。把每个层点入度的时间戳放在一起,因为结点到某层,也要保证这一层是他的孩子。所以我们用这个时间戳来确定到底是这一层的哪一段。用二分查找分别找入度结点和出度结点,从原创 2020-11-18 21:18:31 · 139 阅读 · 0 评论 -
选点(dfs序+LIS)
题意:有一棵n个节点的二叉树,1为根节点,每个节点有一个值wi。现在要选出尽量多的点。对于任意一棵子树,都要满足:如果选了根节点的话,在这棵子树内选的其他的点都要比根节点的值大;如果在左子树选了一个点,在右子树中选的其他点要比它小。题解:要满足根节点的值最小,左子树的值大于右子树的值。这样的话我们可以先按照根->右->左的顺序来求出一个dfs序然后求一下LIS即可。/*Keep on going Never give up*///#pragma GCC optimize(3原创 2020-11-17 18:13:42 · 238 阅读 · 0 评论 -
CF1006E Military Problem
题意:给你一棵树,有q次查询,每次查询第n个结点的他的子树按照dfs序第x个元素是什么?题解:一道dfs序的裸的题目。首先需要一个数组存放第i个结点在dfs序中的位置再需要一个数组来存放dfs序的顺序在需要一个数组来存放一个结点子树的大小。(用来判断是否需要输出-1)每次查询首先判断他的子树大小是否符合要求如果符合要求再找到这个结点在dfs序中的位置。然后利用存放dfs序顺序的数组瞬移 k-1 位,输出此元素即可。利用这三个数组,即可再O(n)的时间复杂度下解决问题。/*Keep on原创 2020-11-17 16:51:20 · 155 阅读 · 0 评论