数据结构:dfs序
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
POJ - 3321 Apple Tree dfs序+线段树 简单题
题意:初始时树上每个节点都有1个苹果,然后对一个节点操作,如果有苹果,就拿走,没苹果,就放上,然后询问以x为根的子树上有多少个苹果。dfs序简单题POJ这题好像没有开O2,vector<int> sons[MAXN];一直TLE,换了邻接表就过了。时间复杂度 O(n)空间复杂度 O(4*n)原创 2017-10-11 22:51:56 · 665 阅读 · 0 评论 -
HDU - 3887 Counting Offspring dfs序+线段树
题意:问对于每个节点,它的子树上标号比它小的点有多少个。dfs序+线段树关于dfs序:dfs序是处理树上问题很重要的一个工具,主要能够解决对于一个点,它的子树上的一些信息的维护,即用来处理子树的问题。 dfs序一般开的空间是n,因为只在入的地方时间戳++,出来的地方时间戳没有额外的++,线段树的每个节点应当是时间戳。这里,因为点在它的子树上,所以在线段树中,故在它的两个时间戳的区间内([p1[i],p2[i]),所以我们只需要从小到大考虑,它的区间里有多少个点已经放入,然后再把它放入即可。时间复原创 2017-10-11 19:14:37 · 668 阅读 · 0 评论 -
Codeforces 620E New Year Tree dfs序+线段树+状态压缩
题意:给定一棵树,每个节点都有颜色,然后询问子树上有多少种不同的颜色。dfs序+线段树+状态压缩由于只有60种颜色(2^60 < 2^63),所以可以直接用二进制压位。即sum[Ind]维护的是该区间的一个状态,从右向左第i位表示第i种颜色在该区间是否出现。然后用上线段树区间修改+区间查询即可。时间复杂度 O(nlogn)空间复杂度 O(4*n)原创 2017-10-13 18:22:55 · 862 阅读 · 0 评论 -
HDU - 6191 Query on A Tree 可持久化字典树+dfs序
题意:给出一颗树,每个节点有一个权值,q个询问,询问以点u为根的子树中的节点权值异或x所得的值的最大值。可持久化字典树+dfs序对子树进行询问很容易想到dfs序,然后变成了线性的询问区间[l,r]内异或x所得的最大值,这个是可以用可持久化字典树来做,类似于主席树,每颗字典树维护的是区间[1,i]的信息,询问的时候,如果sum[r]-sum[l-1]大于0则说明在这个区间内这个值是存在的,然后按照通常的0-1树的做法,每次尽可能访问x&(1<<i)的异或值即可是答案尽可能大。空间复杂度 O(nlogn)原创 2017-10-26 12:43:07 · 997 阅读 · 0 评论 -
HDU - 6203 ping ping ping LCA倍增算法+dfs序+线段树
题意:给出一颗以0为根有n+1个节点的树,给出p个条件,每个条件表示u,v之间有一个坏的节点,根据这p个条件求出树上至少有多少坏点。LCA+dfs序+线段树先跑出dfs序,并对LCA进行预处理。然后把每组条件按照u,v的LCA为第一优先级丢到优先队列里,且对于dfs序有个性质,如果P是U的祖先,则 p1[P] <= p1[U] <= p2[U] <= p2[P],故每次对于每个LCA(u,v),u,v :先判断 u,v是否存在被标记的祖先,如果都没有说明需要新标记一个点为坏点,即把LCA(u,v原创 2017-10-16 15:37:44 · 864 阅读 · 0 评论