其他分享
首页 > 其他分享> > 一些简单的分治

一些简单的分治

作者:互联网

分治

P6932 [ICPC2017 WF]Money for Nothing gym 101471d

P4183 [USACO18JAN]Cow at Large P

题目大意

给定 \(n\) 个点一棵树,奶牛 \(Bessie\) 在树上的一个点上,初始时每个叶子结点可以放一个 \(FJ\) 也可以不放,每一时刻, \(Bessie\) 和 \(FJ\) 可以同时向相邻的一个点走去,任意时刻如果 \(Bessie\) 和 \(FJ\) 在同一个点或同一条边上,则 \(Bessie\) 会被 \(FJ\) 抓住,否则若 \(Bessie\) 到达叶子节点就会逃走,现在 \(FJ\) 想知道,对于 \(\forall i \in [1,n]\) ,若 \(Bessie\) 初始时处于 \(i\) 号节点,至少要多少个 \(FJ\) 才能抓住她。

题解

发现对于一个点 \(u\) ,很难构造出一组 \(Bessie\) 初始在 \(u\) 时的解。因此考虑能不能直接算出答案。

设 \(g_i\) 表示距离点 \(i\) 最近的叶子节点的距离,\(dis_{x, y}\) 表示 \(x, y\) 两点的距离。那么若 \(dis_{u,i} \ge g_i\) 则子树 \(i\) 内至多有一个点,反之若 \(g_i > dis_{u, i}\) 则子树 \(i\) 内至少要有一个点,这样就只需要考虑有多少个点 \(i\) 满足 \(dis_{u, i} \ge g_i\) 且 \(g_{fa_i} > dis_{u, fa_i}\) ,这样便可以 \(O(n^2)\) 求解。

考虑继续优化,发现瓶颈在与 \(g_{fa_i} > dis_{u, fa_i}\) 这一限制很难满足,若计算所有 \(dis_{u, i} \ge g_i\) 的点则方便很多,不难发现,所有满足这一条件的点 \(i\) 恰好构成以 \(u\) 为根时的许多子树,因此考虑将子树内每个点赋一个权值,使得其加和恰好为 \(1\) ,对于一个子树集合 \(S\) ,有 \(\sum_{x \in S} deg_x = |S| - 1\),那么移项可得 \(\sum_{x \in S} 2 - deg_x = 1\) ,因此将所有点的权值赋为 \(2 - deg_x\) ,然后用点分治求解即可,即对于 \(\forall dis_{u, i} \ge g_i\),令 \(ans_u\) 加上 \(2 - deg_i\) 。

标签:一个点,简单,分治,ge,Bessie,一些,FJ,deg,dis
来源: https://www.cnblogs.com/CTcode/p/divide_couquer.html