0%

CF-1023-D. Apple Tree Traversing

思路讲解

题意就是所有点只能经过一次(选择一次),构造出字典序最大的 (dis,u,v)(dis,u,v) 序列,输出这个序列。

注意到,距离是放在第一位的,所以我们肯定优先选择距离最大的。那在树上路径距离最大的是什么?树的直径呗。不过这个树的直径的取法需要优先选择大的起始点和终止点。

然后删除直径后,这张图就不联通了,只要在每个子图中我们遵循这种删除规律即可,最后形成的 ans 数组根据字典序规则排序即可。

以下是样例五的图示展示,第一层删完后,变为了两个子图,这两个子图仍然按照规则选择直径,删除直径上的点,整张图被删完后程序结束。

image

时间复杂度分析

枚举总量为 n+(nl1)+(nl1l2)++(nlclil1)n+(n-l_1)+(n-l_1-l_2)+\cdots+(n-l_c-\cdots-l_i-\cdots l_1),即 n×cl1×cl2×(c1)lcn\times c -l_1 \times c-l_2 \times (c-1)-\cdots-l_c,也就是,其中 nn 为点的数量,lil_i 为第 i 层的直径总数,c 为总层数。枚举总量在逐层下降是因为每层选择的直径上的点会被删除。

n 是给定的,那么我们假设 c 最大,那么 c 最大的情况是什么呢?

c 最大的情况,就是我们每层只能删除一条直径,也就是说该图在删除直径的过程中一直保持着联通状态。把层数卡满的图可以这样构造,注意到,分枝直径的点的数量直径的点的数量/2分枝直径的点的数量≤\lfloor直径的点的数量/2\rfloor,如果大于这个限制,该分枝就要被删除了。

image

那么近似的,我们可以得到。

x+x2+x22++x2c=nx+\frac{x}{2}+\frac{x}{2^2}+\cdots+\frac{x}{2^c}=n

由于x2c\lfloor\frac{x}{2^c}\rfloor必须大于 00,我们知道 2cx<2c+12^c≤x<2^{c+1}

那么不妨令 x=2c+1x=2^{c+1}

2c+1+2c++2=n2^{c+1}+2^c+\cdots+2=n

运用等比数列求和公式。

2×(2c+11)=n2\times(2^{c+1}-1)=n

因此,clog(n)c\approx \log(n)

故该算法的总体时间复杂度为O(nlogn)O(nlogn)

AC代码

https://codeforces.com/contest/2107/submission/318737306

心路历程(WA,TLE,MLE……)