E
题意是让你求满足 \(lcm(i,j,k)\geq i+j+k\) 的三元组个数。
我们通常都有一个直观感觉,lcm应该是各数之积级别的,换句话说, 不满足 \(lcm(i,j,k)\geq i+j+k\) 的三元组个数应该不太多,考虑用总的个数减去不合法的个数。
\(lcm(i,j,k)< i+j+k\) ,因为k是三元组中最大的数,所以 \(lcm(i,j,k)< i+j+k< k+k+k< 3k\)。又由于lcm一定是k的倍数,所以lcm的值只可能是k或者2*k。
1.lcm=k
i,j只要是k的约数即可,对于一组询问,答案为
初始给每个位置赋初值为约数个数,对询问按照左端点排序,枚举左端点,每枚举一个就把当前枚举值的倍数的约数个数-1,那么询问 \([l,r]\) 就是区间的 \(\binom{a_{i}}{2}\)的和,线段树即可。
这部分 \(O(w\log w)\),其中w是值域=200000。
2.lcm=2k
设k的唯一分解中2的幂次是x,那么lcm=2k相当于要求i和j其中有一个的唯一分解中2的幂次是x+1。
枚举2k的所有约数作为i,如果2k中唯一分解中2的幂次是x+1,那么j只要满足在i和k之间且是2k约数即可。否则j的唯一分解中2的幂次必须是x+1。对于这两种情况都不难统计固定k之后,对于每一个合法的i,有多少个j符合我们设置的条件。这里要枚举1-2w的所有数的约数并存下来,还要对每个数的约数求出作为i的贡献并存下来,时空均是1个log的。
在之前的讨论中没有考虑l的限制,加入l的限制的话,用前缀和差分即可。
和前一种情况类似,对询问按照左端点排序,枚举左端点,每枚举一个左端点t就对t的倍数去掉t作为i对答案的贡献。这里具体实现可以把所有数放进优先队列(关键字为大于t的最小因数),t增加时查询当前堆顶是否有关键字等于t的元素,把t的贡献去除,再把关键字改为下一个约数后放回。快速查询下一个约数可以用链表。
总复杂度 \(O(w\log^{2} w)\)。
F
原题等价于建一个虚点向所有叶子连边,边权为 \(\frac{w}{2}\)。求直径。
在加上这些边之后,两点的最短距离只有两种可能,即原树上的简单路径或者在两点的子树中找深度最小的叶子,先到达叶子,然后走新加的边到另一个叶子,再到终点。
考虑点分,先处理过重心的所有路径。
直径可以写成这个样子:
如果类似于树链剖分一样,选择拥有最浅的叶子的儿子为重儿子,树将被剖成若干条链,其中对于同一条链上所有节点,“子树内深度最小的叶子”相同。那么,对于两个点,如果他们所属的链已经确定, \(\min(dep(i)+dep(j),dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)-(dep(i)+dep(j))+w)\) 就只与 \(dep(i)+dep(j)\) 有关。而且前者随之递增,后者随之递减。而 \(dep(i)+dep(j)\) 的取值范围是 \([dep(i所属链链顶)+dep(j所属链链顶),dep(i所属链链底)+dep(j所属链链底)]\) 如果取不到折点(即 \(\frac{dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)+w}{2}\)),答案就是 \(dep(i所属链链顶)+dep(j所属链链顶)\) ,否则是\(\frac{dep(i所属链链底)+dep(j所属链链底)+w}{2}\)。判断条件是
\[dep(i所属链链顶)+dep(j所属链链顶)\leq \frac{dep(i所属链链底)+dep(j所属链链底)+w}{2} \]这等价于
\[(dep(i所属链链顶)-\frac{dep(i所属链链底)}{2})+(dep(j所属链链顶)-\frac{dep(j所属链链底)}{2})\leq \frac{w}{2} \]把所有剖后的链按照 \(dep(链顶)-\frac{dep(链底)}{2}\) 排序,那么对于每一条链,一个前缀与它的贡献就是\(dep(i所属链链顶)+dep(j所属链链顶)\),转化为查找前缀最小值。剩下的和它产生的贡献是 \(\frac{dep(i子树内深度最小的叶子)+dep(j子树内深度最小的叶子)+w}{2}\) ,与前者类似转化为查找后缀最小值。
复杂度:点分之后树剖,每条链按照特征值排序之后维护前后缀最小值,再枚举每条链,求出对答案的贡献,复杂度 \(qn\log n\)。