Sasha and a Walk in the City

先写一下官方题解

首先原问题有一个很显然的解集:点集中任意两点不存在祖孙关系

所以我们令\(f[v]\)表示以\(v\)为根的子树的点集的数目,这些点集中任意两点不存在祖孙关系

如果一个解集中有一个点是另一个点的祖先,我们画出图

那么这个点上面的点(包括这些点的分支)是肯定不能选择的,所以这个解集的剩下的点只能在这个点的子树里面选择

怎么选择?就是利用\(f\)数组!

枚举\(v\)的每个子树,加上其\(f\)就好了。因为肯定不能同时选择两个及以上的子树,因为现在已经选择了\(v\)了,这样会三点共线

然后把每个点的贡献全部加起来就好了

在说一下我的解法

因为做这道题目的时候很明显的可以发现不要三点共线,然后考虑一颗子树的时候就想到从这颗子树选出一个点集,这个点集是否存在两点的连线的延长线到达根节点(也就是是否存在一个点是另一个点的祖先)是一个很关键的信息

所以我们设\(f[v][0]\)表示没有,\(f[v][1]\)表示有,然后推导看CF的代码吧

posted @ 2024-02-19 17:16  最爱丁珰  阅读(31)  评论(0编辑  收藏  举报