点分治
嘉伟森的猫
NYU Shanghai本科,MBZUAI机器学习硕士,深度学习/强化学习菜鸡
展开
-
Codeforces 1101D GCD Counting(点分治)
传送门题意:给一棵n个点的数以及n个点的点权,一条路径(x,y)合法当且仅当从x到y的路径上所有点权的gcd大于1(一条路径也可以是一个点),问所有合法路径经过的点的数量最大的经过了多少点。题解:就是求最长的合法路径再+1。这种在树上询问路径的可以优先考虑点分治。每次分治到一个重心,把每条链的链上gcd分解质因数,去和之前这些质因数对应的最大链长加起来再+1,然后这些质因数对应的最大链长都更新一下。注意每次先把一棵子树中的链记下来,先询问再更新(避免同一棵子树内的两条链更新答案)。还是要注意先加原创 2020-07-03 15:09:08 · 238 阅读 · 0 评论 -
hdu 4812 D Tree(点分治)
传送门题意:询问一棵树上是否存在点对满足这两个点的最短路径上所有点的点权之积mod M之后等于K。若存在,则输出满足条件的字典序最小的一对点。已知M=1e6+3。题解:一般询问树上是否存在某种“合法”路径,可以考虑点分治。如果一对点(u,v)满足,设当前重心为p,链[u,p)的点权之积为a,链[v,p)的点权之积为b,则,则。对于每个重心,相当于用某棵子树中的点与其他子树中的点匹配,用cov数组记录一下可以匹配到的点的最小编号即可。(因为M不大,所以逆元可以递推存到inv数组)注意:1. b原创 2020-06-03 13:32:37 · 185 阅读 · 0 评论 -
POJ 1741(点分治)(模板)
传送门题意:统计树上距离不超过K的点对数量题解:点分治,求树的重心,统计有多少条经过重心的合法路径,再对子树进行相同操作(递归处理),总复杂度O(nlog(n)log(n))。为什么是这个复杂度?因为以重心为根的树至少有两棵子树,所以分治的层数不超过log(n)。每次统计时,设当前树的大小为size,那么排序的复杂度为size*log(size),双指针扫描为size,所以复杂度取size*log(size)。每一层分治的总复杂度为,所以整个算法复杂度为nlog(n)log(n)。注意点:1原创 2020-06-01 14:48:56 · 291 阅读 · 1 评论