「lych_cys模拟题2018」橘子树

你可能需要一点点简单知识

你可能需要一点点预先知识

设值域上限为M=2105,T=3105

F(n)

筛去n13以内的质因数,此时n剩下的质因数>n13

剩下的n中,可能出现贡献的只有n是完全平方数的情况,O(1)判断即可

复杂度为O(n13)

 

求出i结点长了t时间的时候被收掉的答案

预处理ai,bi的答案ci=F(ai),di=F(bi),复杂度为O(nπ(M13))

那么此时查询的权值就是ait,如果>bi特判掉

否则,显然ci的贡献可以先分离掉考虑进答案

对于剩下的部分,不妨设x=aici,显然x不包含平方因子

考虑xt的合并所产生的贡献,实际上就是gcd(x,t) (让x的单个因子与t匹配一下)

然后对于t剩下的部分tgcd(x,t),由于t3105,可以预处理一下答案

综合一下上面的部分,那么一个点的答案就是cigcd(x,t)2F(xgcd(t,x))

因此查询一个点的复杂度就是gcdO(logT)

 

综合利用上面的方法,勉强可以拿到nmlogT的20分

剩下的部分,可以考虑把树树剖一下,然后每个查询可以化为在dfs序上的若干更新区间Li,Ri,ti

由于题目考虑的实际上是查询总和,因此可以对于每个点计算答案

不妨从1n扫描dfs序,对于每个区间在Li插入ti,在Ri+1删除ti

用一个set来维护ti的顺序,复杂度为O(nlog2n)

在插入/删除set元素的同时,维护每一个Δi=titi1,也就是我们要查询的每个数

查询单点时,由于这样的ΔiT,所以最多包含O(T)种不同的Δi

用另一个set之类的东西维护这些不同的位置,然后暴力查询,复杂度为O(nTlogT)

总复杂度为O(nπ(M13)+nTlogT)左右

   

后记

由于特(智)殊(力)的(缺)原(陷)因

我考场上写了一个树剖+分块+莫比乌斯反演的做法,而且还没调出来,代码是这个,复杂度大概差不多O(nnlogn32)

不提了。。。