2021-09-11

##20210911题面
在这里插入图片描述
/*
如果我们能知道以任意节点为根 每颗子树中颜色个数,那么就枚举题干
中的"LCA",看哪一个“LCA”能使得答案最大即可,一遍dfs搞定
难点就在统计颜色上
-------------------part1-------------------
先假设整棵树的根是以1为根的,找到每一棵子树是否包含所有颜色
对于两个点x,y,可以在他们两个的节点上+1,在lca(x,y)上-1
然后搞一个dfs序线段树就行 ,运用差分思想就很容易理解
那对于3个点呢?
我们看这样一组样例
1—2
2—3
2—4
1—5
如果在3,4,5都有相同颜色,该如何处理呢?
先手模一下,每个点的标记是什么样子才能使得每一棵子树内所有标记
加在一起时,1~5的标记和都是1:
-1 -1 1 1 1
1 2 3 4 5
然后如果先将3,4进行第一个操作,那么:
0 -1 1 1 0
1 2 3 4 5
然后应该是将5处+1,1处-1
而1正是3,4,5的公共LCA
于是我们思考:是不是应该在接下来的操作中都找到所有点的lca并-1,然后
在自己身上+1呢?
证明:因为如果在自己身上+1,那么需要-1的是所有权值为2的点
而只有所有已涉及点的lca到根节点才会如此,因为直到根节点这部分都是
重叠的,由差分思想转化一下就行了
(如果觉得这段话是废话就直接略过,反正我当时没明白)
由此,我们解决掉了根固定的情况
------------------part2-----------------
然鹅这个题要换根……
当某一棵以1为根的树的 以x为根的子树中某一节点变为根,那么“以x为根
的子树” 在新形态的树中 成了除去原来子树的部分
定义这一部分为“反树”(顾名思义)
也就是说,我们不仅要知道子树的颜色情况,还要知道反树是否包含所有颜色
而真的换根是会超时的,所以反过来想子树统计什么东西才能反向知道反树
的情况。
于是我们考虑记录有没有一种颜色,使得该颜色的点 在子树中全部出现
那么就要求所有颜色相同的点的LCA,在根上打上标记,然后在回溯的时候
把所有经过的点都打上标记,一遍dfs下来没有标记的就说明反树包含全部
颜色
换根问题搞定~
----------------总结----------------------
树上差分,反向思考即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值