闲扯
噫,好,我上当了。
今天的 $T1$ 标题叫树链剖分,按理说肯定正解不是它,但我还是打了。。。
$T2$ 打表的时候出了点问题,最前面两个是直接放在两个端点的,不是用来切的,做题的时候想到了,但打代码就忘了。。。不过虽然规律找错了,但是差别不大,只错了一个点,还有就是 $10^{1000}$ 次方有 $1001$ 位。。。
$T3$ 写的暴力,不过貌似打炸了。。最近做题打暴力的能力欠缺啊。。
题面
$T1$
Solution
对于 $n\leq 10^5$ 的点,我们可以直接上树剖。
根据 $dfn$ ,我们可以知道,一个节点的祖先节点的编号一定是离自己越近就越大的,所以就直接维护最大值即可。
对于 $n\leq 10^6$ 的点,就不能这样了,肯定会 $TLE$ 。
先考虑直接指定有哪些点被选中时怎么做。
因为深度越大,节点的优先级越高,所以我们可以从下往上来统计每个点的管辖范围。
这相当于把这棵树分为几个连通子树,每一个子树的根节点就是这个子树中所有节点的答案。
明显,我们可以用并查集来维护连通性和相应的根节点。
那么动态加点怎么做?
如果我们是顺着来,那么加入一个新节点后,我们需要把它从原来的子树中切出来,不是很好维护。
既然顺着不行,那我们就试试反着来
考虑先维护好加入所有边之后的情况。
如果要查询,可以直接查所在子树的根结点。
如果要修改,那么等价于把一条点给删去。那么它所控制的范围就会并入它父节点所在子树的根结点的管辖范围。这个可以直接把下面的合并到上面去,可以用并查集轻松维护。
这样,问题就变得很简单了。
$ps:$ 数据有锅,可能重复加入同一个节点。对于后面的操作,我们直接忽略掉,不然会对答案造成影响。
Code
1 |
|
$T2$
Solution
打表,我们可以发现,除开前 $5$ 个数之外,后面的数就变得很有规律了。
从第 $6$ 个答案开始,序列就变成了很多段连续的自然数。
观察首尾,可以发现在结尾处的点编号都是 $2^k+1$ ,而对应的答案是 $2^{k+1}+1$ 。
再简单推一下,可以发现这一段中所有数的答案都可以写成 $2^{k+1}+n$ 。其中 $k$ 是第一个使 $2^{k+1}+1$ 大于 $n$ 的数。
然后就可以直接从前向后枚举,找到第一个 $k$ ,然后计算答案即可。
因为极限数据是 $10^{1000}$ ,所以我们需要打个高精度。但是注意我们找到的 $k$ 可能会使 $2^{k+1}+1$ 的位数变为 $1001$ 位,所以高精数组需要用 $1001$ 位。
Code
1 |
|
$T3$
Solution
加入一个点 $y$ ,等价于给 $y$ 到根的路径上所有边加一个权值。
设这条边是 $f\to u$ ,那么加的权值就是 $F(dist[u])-F(dist[f])$ 。
询问时查询 $x$ 到根路径上的所有边权值之和,即差分之和。
对于 $F$ ,我们用线性筛预处理,可以快速求解。
时间复杂度: $O(D+n\log^2 n)$ 。
Code
1 |
|
总结
做题还是不够熟练,经验不够。