摘要:
点分治算法很容易常数写大?不开O2就被卡常。 很裸的点分治,从选出的根开始往其余的子树搜,看一下当前经过的路径长度tot,k-tot是否在set中,在就找到了长度为k的路径。唯一要注意下的就是,当前子树经过的路径长度不能直接丢到set里,要搞一个临时的tpset来暂存下,搜完这棵子树再把这个tpse 阅读全文
摘要:
忽然感慨,现在可以随便用__gcd这种函数了。 点分治一下就好了,最开始点分治的时候忘记选重心,T了一发。 考虑对于当前点,所有其他点到当前的路径,长为0的t[0]个,长为1的t[1]个,长为2的t[2]个。(取模后长度)那么我们对于一个点x来说,经过他的路径的总数为t[0]*t[0] + t[1] 阅读全文
摘要:
分块算法通常能跟暴力相结合,从而在较为优秀的时间内解决一个常规方法难以解决的问题,很神奇。 我们考虑将序列分块,每个块内按照身高排序。 对于修改操作,我们对于左右的边界所在的块,排回原序后,暴力修改,再按照身高排回来。O(sqrt(n)logn)。对于中间的整块,打一个标记来修改。O(sqrt(n) 阅读全文
摘要:
实际上跟哈希没有关系,跟分块也没关系。 sum[p][k]表示取模p,余k的所有下标位置的和。up为sqrt(n)。显然我们可以在O(nsqrt(n))的时间内预处理出sum数组。对于p不超过up的询问直接输出即可。 如果出现修改操作,我们只要单独修改被修改位置对整个sum数组的影响即可。复杂度为O 阅读全文
摘要:
之前只做过分块做法,补一下树状数组做法。 我们先考虑一个问题,如何求从[1,x]这一区间内元素不同的个数?显然我们只要从到到位,遇到一个新的元素,就在对应位置+1,然后使用树状数组求前缀和即可。 这里我们需要去求[x,y],所求区间的左端点也会发生变化。我们先按照[1,x]的方法预处理出这个前缀和数 阅读全文
摘要:
先二分答案,check(x)表示[1,x]的数中,不是完全平方数整数倍数的数的个数。第一个check(x)为Ki的数x即为答案。 考虑如何求出check(x)。我们考虑通过容斥原理,去从x中删掉为平方数整数倍数的数的个数。 所以res = x - (单个素数的平方的整数倍的数)+(两个素数乘积的平方 阅读全文