@pinkex
2019-02-25T11:41:37.000000Z
字数 2642
阅读 440
一棵以1为根的树,每次挂一个叶子,并且每次都有一次机会交换两棵不相交的子树(原树并不变),问每次交换后的最大直径。
先不考虑链的情况。
假设在某一次询问中,我们交换(x, y)对应的子树,然后一条直径在交换后的(y, z)对应的子树里。
容易知道,原树中(x, y)的lca一定是(x, z)的lca的祖先。
而且显然x是叶子节点。否则为什么不交换(x子树中最深的点,y)呢?
而我们又可以发现,将y向上到lca(x, y)路径上的深度为dep(lca(x, y)) + 1的点与x交换显然会更优。
答案?容易发现,是y中深度最大的点到lca(x, y)的距离加上dis(lca(x, y), lca(x, z))加上dis(x, z)减1。那么我们其实完全可以把y中深度最大的点把y代替,把问题转化一下。
我们可以维护这样一个东西来简化原问题:
维护一个三元组(x, y, z)。
满足这个三元组(x,y, z)的三点距离和最大;这里的距离和代表的是聚集到一个点的最小距离和。(即虚树上的边数)
答案是三点距离和减1。
每次新加一个叶子w,那就判断一下无序三元组(x, y, z),(x, y, w),(x, z, w),(y, z, w)到底哪个答案大,就更新一下。
但是(x,y,z)的虚树如果是一条链怎么办?
动态在数组末尾加0或1,每次询问一段区间,求
容易把数组划分为000...,111...,000...,111...,...这样子。
注意到普遍的情况:
求下式模998244353的值:
这题可以有两种切入方法。
个人比较喜欢的是从函数的角度切入。
另一种方法:
这种方法比较容易想到,直接枚举,即:(忽略一些向下取整)