dfs序入门 CF上的几道题

来源:互联网 发布:亚马逊索评软件 编辑:程序博客网 时间:2024/05/29 17:19

dfs序就是把一个点的所有子节点映射到某个连续子区间来进行一定操作,用线段树或者其他做法降低时间复杂度,和树链剖分类似(当然要更简单)

由于我太菜了,做了好几道题终于感觉自己算是入门了

第一题:

CF 343D(线段树时间戳)

三个操作:
1 v:把v和v的所有儿子染色
2 v:把v和v的所有父亲取消染色
3 v:查询某个节点颜色
做法:利用染绿色的性质,如果某个节点在某个时间t1被染绿,在时间t2被取消,那么当且仅当t1>t2时这个时候他被染色
代码

第二题

CF 396C(线段树)

两个操作:
1 v x k:把v的儿子中距离v长度i的加上x-k*i
2 v:查询v的值
做法:我本来是想直接建线段树的,结果发现自己太菜写不出来。。做法:两个线段树,每次操作,T1中子树加上x+k*height[v],T2中子树加上k,然后查询的时候直接输出T1.query-T2.query*height[v]就行了
代码

第三题

CF 383C(线段树)

每次v增加x,那么它的所有儿子就减小x(孙子再+x,往复这样)
两个操作:
1 v x:v增加x
2 v:查询v的值
做法:我的做法和题解不一样,他是把height是奇数和偶数的分开了,我是直接做,把奇偶节点分别标号,把pushdown和pushup全都写的很复杂。。
代码

第四题

CF 375D(莫队)

一棵树,树上有颜色,查询区间内次数大于等于k次的颜色有几种
看上去好难好难啊。。结果能莫队(本来我知道能莫队还想线段树求大于k的个数来着orz)
代码

0 0