ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

一些简单的分治

2022-05-19 20:34:07  阅读:185  来源: 互联网

标签:一个点 简单 分治 ge Bessie 一些 FJ deg dis


分治

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有