T1
字符串基础练习,时间复杂度O(nL)。
T2

BFS 洪水填充,但是如果你直接暴力枚举一个点进行拓展的话显然不对。我们可以通过多源 BFS 来做到O(nm)。
注意这里必须O(nm),记得以后一定要计算复杂度,不然会被卡常。
T3
更唐的做法:
观察一组合法的三元组的格式是怎样的,显然这三元组因为在树上,故必然存在一个点使得到这三个点距离相等(距离不等反而赢了)。如果不认为显然的请列方程计算,你会发现有解情况唯一剩下的都有环。
那么我们可以枚举交点,把它提起来作为根,然后我们枚举距离t,对每一个孩子的子树求其子树内有多少距离根节点为t 的点,记一个孩子子树的合法点个数为ai。
那么答案就是三个不同子树的点进行配对i=j=k∑aiajak。不难发现上述过程光枚举就花了O(n2),这个玩意还是O(n3) 的,我们很成功的只有25 分,而且是O(1) 进行计算很难泵。
然后考虑怎么优化这个答案统计过程,发现及其难以优化。但是发现这具有组合意义,考虑容斥计算。
首先记sum1=i∑ai,那么任意选三个点的方案数就是(3sum1)。显然这个方案包含了同子树的,我们要把他们减去:
- 两个点在一个子树:i∑(2ai)⋅(sum−ai)。
- 三个点在一个子树:i∑(3ai)。
故答案(3sum1)−i∑(2ai)⋅(sum−ai)−i∑(3ai)。
直接开始化简!
- 第一个式子:(3sum1)=6sum(sum−1)(sum−2)。
- 第二个式子:i∑(2ai)⋅(sum−ai)=2ai−(ai−1)(sum−ai)。
- 第三个式子:6ai(ai−1)(ai−2)
第二个式子和第三个式子:
=2ai(ai−1)(sum−ai)+6ai(ai−1)(ai−2)=6ai(ai−1)(3(sum−ai)+(ai−2))=6ai(ai−1)(3sum−2ai−2)
原式即为:
6sum(sum−1)(sum−2)−i∑6ai(ai−1)(3sum−2ai−2)
进一步化简:
61[sum(sum−1)(sum−2)−i∑ai(ai−1)(3sum−2ai−2)]
考虑后式,记sum2=i∑ai2,sum3=i∑ai3。有:
i∑ai(ai−1)(3sum−2ai−2)=i∑(3sum⋅ai2−(3sum−2)ai−2ai3)
进一步化简代回分子式有:
sum(sum−1)(sum−2)−(3sum⋅sum2−(3sum−2)⋅sum−2sum3)
最后化简有:
ans=6sum3−3sum⋅sum2+2sum3
即可O(1) 计算,用 BFS 按层计算,时间复杂度O(nm),推式子时长占到了总时长的 90%,据观察没有人会想我这么唐推这个式子,直接一开始不等距离也是可以直接做的,反而会更简单直接组合数即可。
总结:不要看到式子就星宇大发,一定要冷静观察有没有更好的做法。
T4


赛后总结
T3 太唐了没有分配好时间去做。推完式子发现没时间做了,以后要有时间意识。
卡常,卡常,卡常!