【题解】Solution Set - NOIP2024集训Day9 树上问题

【题解】Solution Set - NOIP2024集训Day9 树上问题

https://www.becoder.com.cn/contest/5457


「BJOI2014」大融合

LCT 板板?

https://www.luogu.com.cn/article/cdrlflnf

主要是目标没有理的很清楚,总的来说也不算很难想。

目标其实就是要维护当前连通块深度最小的点(并查集),以及每个点当前的 siz(树剖/dfn+bit)


「CF19E」Fairy

先跑一棵生成树出来,并对其二分图染色。

对于删除的那一条边:

  1. 如果是非树边,只需判整张图是不是有且只有这一条边是矛盾的。(由此我们还可以知道非树边做为答案最多只能有一条。

    不管怎么说这都是好处理的,这里不赘述。

  2. 如果是树边,首先断开后两个连通块内内部的非树边必须合法。剩下的横跨两个连通块的非树边,要么全矛盾,要么全不矛盾。

    这样的话,我们不妨先把非树边按照其两端是否矛盾分类,便于后续处理,然后再分讨一下。

    1. 横跨两个连通块的非树边,全不矛盾。其实就是不存在矛盾边的情况,特判一下。

      如果是的话,那么所有的树边都是合法的。

    2. 横跨两个连通块的非树边,全矛盾。我们先把所有不矛盾的边和树上的链合在一起所构成的环合并成起来。

      最后的情形就是一堆连通块,和一堆矛盾的边。首先如果某一条矛盾边的两端同属一个连通块,那么整个 2.2 都是不能成立的,先特判一下。

      现在我们的问题就转化为,给定一棵生成树,和一堆非树边,每条非树边对应这棵树上的一条条链。最后的答案就是这些链的交集。

      好的,这又是一个典问题。直接树剖(当然沿用 「BJOI2014」大融合 这道题里面的 dfn+bit 也可以,不过还要算 lca,不如直接树剖了),然后链加 1,最后查询每一条边是不是被覆盖了矛盾的非树边次,就好了。

      关于一开始那个合并的操作,实际上就是限定链上的这些边不能选,我们直接链上 \(-\inf\) 就好了。

至此,这道题就做完了,哇哈哈哈哈哈(没想到被我切了吧。😅


Nauuo and Binary Tree

首先可以 \(O(n)\) 拿到所有点的 \(dep\)。不会了。

然后按照深度从小到大开始对每一层的点确定其父亲。

posted @ 2024-08-16 08:29  CloudWings  阅读(25)  评论(0编辑  收藏  举报