竞赛讨论区 > 【每日一题】2021年3月26日题目精讲
头像
王清楚
编辑于 2021-03-26 15:34
+ 关注

【每日一题】2021年3月26日题目精讲

题号 NC19995
名称 [HAOI2015]树上操作
来源 [HAOI2015]
每日一题三期汇总贴~

图片说明
如果你在题库做题时遇到了喜欢的题目,欢迎推荐给邓老师~ 点击查看详情
欢迎给每日一题投稿,投稿需要提供牛客题库里的题目+题解 投稿有牛币奖励,可发站内信给王清楚或联系QQ 234186389
每日一题QQ群:659028468

题解

这个题用述链剖分的话是模板题,题解也很多,我这里给大家介绍dfs+线段树的做法。
dfs序在去年4月7日的每日一题 里有介绍,11月9-13日也有过dfs序专题,没有做过的同学们可以查看学习。
将树的dfs序记下来之后,对子树的修改就变成了对区间的修改,如果只有这个修改的话我们可以使用只记录进栈序列的dfs序(严谨的,只有进栈的序列叫做dfn序,但是一般情况下大家是混着叫的),然后每个子树对应的区间维护出来用线段树处理即可。
但我们要查询每个点到根的路径和,这个路径并非一个连续的区间,在线段树上没法查。
这时我们把dfn序换成出栈入栈各记录一次的dfs序,入栈的权值为正,出栈时权值记为负,根到点x的点权和就等于区间[1,x入栈位置]的区间和,因为不在根到x路径上的点都是进栈又出栈的点已经一正一负抵消掉了。
这个时候线段树的维护要注意,因为区间加变成了区间内对应入栈的节点做加法,对应出栈
的节点做减法,所以对于线段树中的每个区间,都要记录其做加法的点和做减法的点都有多少,这样就能用lazy标记维护区间和了。
总的来说就是:在记录出栈和入栈的dfs序上,建立线段树,入栈对应正数,出栈对应负数;修改一个子树的对应区间修改操作——区间内正数点加上一个值,负数点减去一个值;查询操作就是查询从区间最左端点到待查的x入栈位置的区间和。
欢迎各位大佬来做题写题解,也欢迎大家踊跃在当日讨论贴中提问!

活动奖励:

在牛客博客中写出题解,并回复地址
审核通过可获得(依据题目难度和题解的内容而定)

本道题目4月2日中午12:00之前写的题解有获得牛币资格~

.牛币兑换中心

牛客博客开通方式

  1. 如何开通牛客博客:https://www.nowcoder.com/discuss/202952
  2. 如何使用博客搬家功能:进入博客--->设置--->底部博客搬家
  3. 如果你对牛客博客有任何意见或建议:牛客博客意见反馈专贴

全部评论

(5) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐