ICode9

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

简单树上问题

2021-04-03 10:04:44  阅读:182  来源: 互联网

标签:rt down le siz times 问题 子树 简单 树上


目录


P1099

直接把直径揪出来从一边到一边扫过去就行了。

记录

P5659

按照字典序贪心,对每个点维护相邻的边的删除顺序, 实际上细节并不多。

记录

P5666

考虑计算每个点作为重心的次数。

首先把随便一个重心拿出来做根, 然后显然 x 要想作为重心就不能切 x 子树里的边。(这一步真 tm 妙

那么剩下的情况就是切边后,

  1. x 和原来的根不在一个连通块里
  2. x 和原来的根在一个连通块里

如图。

louis

以下用 \(siz_x\) 表示以 x 为根的子树的节点个数。

对于切断的边 \(e\), 称上面的那个点为 \(up_e\), 下面的那个点为 \(down_e\)。

设 \(g_x = \max\limits_{y\in son(x)}\{siz_y\}\)。

使用的重心判断方法是去掉其后任意连通块的大小乘 2 后都不超过整棵树的大小。

那么对于情况 1, 如果 x 为重心, 那么

  1. \(2\times g_x\le siz_{down_e}\)
  2. \(2\times (siz_{down_e}-siz_x)\le siz_{down_e}\), 即 \(2\times siz_x\ge siz_{down_e}\)

对于情况 2, 如果 x 为重心, 那么

  1. \(2\times g_x \le siz_{rt}-siz_{down_e}\)
  2. \(2\times(siz_{rt}-siz_{down_e}-siz_x)\le siz_{rt}-siz_{down_e}\), 即 \(2\times siz_x\ge siz_{rt}-siz_{down_e}\)

特别地, 对于根,设其最大子树的根为 u, 次大子树的根为 v, 若删去的边不是 u 里面的也没有把 u 割出去, 那么需要满足 \(2\times siz_u\le siz_{rt}-siz_{down_e}\); 若使 \(siz_u\) 变化了或直接没有了, 显然 u 这个子树是满足条件的, 那么剩下的就是要判断剩下的子树, 即 \(2\times siz_v\le siz_{rt}-siz_{down_e}\)。

可以发现都是值域上区间查询的形式, 不过要差分出正确的数据结构。

具体地, 对于情况 1, dfs 时维护到根的树状数组即可;对于情况 2, 维护全局的树状数组, dfs 时维护到根的树状数组, 利用树上差分差分出子树的树状数组。

挺简单的, 代码也不难写。

记录

标签:rt,down,le,siz,times,问题,子树,简单,树上
来源: https://www.cnblogs.com/tztqwq/p/14613119.html

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

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

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

ICode9版权所有