首页 > 其他分享 >『树的直径、重⼼』Day10

『树的直径、重⼼』Day10

时间:2024-08-20 09:06:48浏览次数:13  
标签:子树 siz 路径 Day10 max 即可 直径

Drazil and Morning Exercise

\(f\) 可以换根求。

对于一段乱序序列,你不好求其中 max - min 的限制。

根据重心的性质,如果你让重心为 root,那么向下 \(f\) 一定单减。

这样,你就对每个点在末尾的情况,树上倍增找到最大的点,树上差分即可。

现在想到了好像可以线段树合并,那么你当前点就作为 min,直接在 ds 里面找一个 max 即可。

他们并查集怎么做的没看懂好像。

Weighed Tree Radius

转化:设 \(d=\max \{ dis(x,y)+a_x+a_y \}\),那么 \(r=d/2\)。

证明显然?因为中间路径上边权是 1,你一定可以调整使得 Root 在路径中间,否则肯定是只能选择 \((x,x)\) 作为直径。

或者说,\(d\) 的定义就很有直径的性质,在 \(d\) 上取中点一定会让 max 距离更小。

所以定义一个广义直径即可,然后动态树直径即可,考虑维护直径端点。

树的重心

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

式子很好推,注意到 \(S\) 的大小并不好维护,一会是 \(siz\) 一会是 \(n-siz\)。

而且你需要保证 \(S\) 是在子树外面的。

首先 \(n-siz\) 是好算的,只可能出现在上链上,进入时更新,回溯时取消即可,现在来看 \(S\)。

不妨先全局给 \(siz\) 加入,每次维护子树进入和出去后的差,就可以知道这个子树的 \(S\) 信息,减去即可。注意全局的 siz 也要更新的。

最后,对 \(x=rt\) 的情况特判。

Logistical Questions

求导来决定向哪里走,点分治保证复杂度。

晚测:NOIP2015 运输计划

一眼二分答案。

把长度满足的路径直接去掉,我们显然需要去掉剩下的所有路径的公共路径,并且取最大的一条。

包含所有路径可以树上差分判断,注意用 dfn 代替递归实现要快好几倍。还有,树剖求 lca。

标签:子树,siz,路径,Day10,max,即可,直径
From: https://www.cnblogs.com/LCat90/p/18368682

相关文章

  • 【题解】Solution Set - NOIP2024集训Day10 树的直径、重⼼、中⼼
    【题解】SolutionSet-NOIP2024集训Day10树的直径、重⼼、中⼼https://www.becoder.com.cn/contest/5464「CF516D」DrazilandMorningExercise首先,我们可以换根求出所有点的\(f\)。然后不会了……思考一下,一条直径提供的到底时什么。实际上,一条直径上的点取到\(f\)......
  • 【算法模板】计算几何:旋转卡壳求凸包直径
    旋转卡壳算法是一种几何算法,主要用于在二维平面上求解与凸包相关的最优问题。该算法利用凸包顶点的顺序性和对称性,通过模拟两个卡壳(calipers)沿着凸包边界的旋转来寻找最优解。常见的应用包括计算凸包的直径(即最远点对之间的距离)、最小包围矩形(最小面积矩形),以及最小宽度(宽度......
  • 代码随想录Day10
    232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的元素booleanempty()如果队列为......
  • toString()方法 day10
    /*Object类学习:是java中所有的共同的父类,包括数组1、Object类是属于java.lang包下的,将来使用的时候不需要导包2、构造方法只有一个无参的构造方法3、方法都不是静态的,以为着要有对象才可以调用成员方法:publicinthashCode()......
  • 匿名内部类day10
    /*匿名内部类:语法定义格式:new抽象类/接口(){//要重写的方法}*/abstractclassDemo1{publicabstractvoidfun1();//publicabstractvoidfun2();}//classXXXextendsDemo1{//@Override//......
  • 接口类型的方法调用,使用匿名内部类day10
    /*接口类型的方法调用,使用匿名内部类匿名内部类:语法定义格式:new抽象类/接口(){//要重写的方法}*/interfaceInter1{voidfun1();}//classInter1ImplimplementsInter1{//@Override//publi......
  • 内部类 day10
    /*内部类:将一个类A定义在一个类B中,这个类A称之为内部类分类:成员内部类:将类定义在一个类中的成员位置上局部内部类:将类定义在一个方法中*/classOuter1{inta1=10;privateinta2=11;publicstaticinta3=12;class......
  • 成员内部类day10
    /*内部类常用的修饰符:static被静态的修饰可以直接通过类名.创建对象newOuter2.Inner1()private私有的需要在创建个方法来访问*///classOuter2{//staticinta1=10;//privatestaticinta2=11;//publicstaticinta3......
  • 权限修饰符 day10
    packagecom.shujia.day10.bao5;/*权限修饰符:publicprotected默认的private同一类中√√√√同一包子类,其他类√√√不同包子类......
  • 类,抽象类,接口作为方法参数类型的传参 day10
    /*形式参数基本类型:引用类型:类:当你看到一个类作为方法参数类型的时候,将来调用时需要传递该类及其该类的子类对象抽象类:当你看到一个抽象类作为方法的参数类型的时候,将来调用时需要传递继承该抽象类的具体子类对象......