diary
11.20
补课,题没调出来,大失败
11.21
补课,题调出来了,大成功。
考虑拆位处理,然后转前缀和变成两个点的贡献,发现每个前缀和对答案的贡献是固定两段区间里的值:
-
如果当前位为 \(0\),则分前面的值为 \(0\) 且退位,前面的值为 \(1\) 且不退位
-
如果当前位为 \(1\),则分前面的值为 \(1\) 且退位,前面的值为 \(0\) 且不退位
用树状数组维护即可。注意讨论不能退位,即当前位为最大值(或位数小于当前位)的情况。
做题前记得先打个暴力,不然题读错了都不知道。
这实际上就是点对的贡献。路径是没用的。
发现所有点与最终答案呈现单调递增的关系(由答案为根),所以一步一步构造。
我们设当前点为 \(u\),考虑所有能成为最大路径的点对:
-
如果有点对经过 \(u\),那么这对点对在 \(u\) 移动时会变大,所以答案即为 \(u\) 为中心时的答案。
-
如果两对点对经过 \(u\),那么这对点对在 \(u\) 移动时会变大,所以答案即为 \(u\) 为中心时的答案。
-
否则,所有最大点对都在同一个子树内,跳到另外的子树中肯定不优,跳进这个子树找答案就可以了。
为了保证时间复杂度,我们采用点分治的方法,每次寻找子树重心跳。
需要注意两点:
-
可能会跳到重复的点,这时肯定无更优点了,直接退出即可。
-
答案可能不会变小,具体表现为原来不是最大的点对变为最大,所以每次要更新而不是直接覆盖。
11.22
遇到这种走路的题目,很多都要使用倍增加速。
例如这道题,一个暴力是记录每个点 \(k\) 步后 \(5\) 场比赛中能到达的最左端,阿Q 只要有一场比赛排名比最左端高就是一组合法解。
由于信息很好合并,可以使用倍增加速。
11.23
原来这里是写了一段整体二分的,再一看怎么没有了,但是我也不想补了。
11.24
一开始从底往上哈希,怎么都哈希不出来。但是我为什么要先想那个不符合直觉的做法呢?其实我是不知道的。
路径固定,考虑哈希判断两段路径形态是否一样。
我们树链剖分,将树剖成若干条链,在链上记录哈希值并二分得到最深能走多远。走不了了再跳轻链。由于最多只会有 \(\log n\) 次跳轻链的过程,所以时间复杂度为 \(O(n\log^2 n)\)。
神秘的离开性质实际上就是树在删除中只能有一个联通块。那么离开的次序(\(u\) 在 \(v\) 前)意味着 \(v\) 作根时,\(u\) 及 \(u\) 的子树要先删完。将这部分点向 \(v\) 连有向边,然后通过判环判断是否无解,若有解解就是那些入度为 \(0\) 的点。
线段树优化建图即可。