![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树
gerayking
默默努力,享受过程,不问前程
展开
-
点分治+FFT-CodeChef-PRIMEDST
题目链接CodeChef-PRIMEDST思路采用点分治统计所有的路径,但是如果是朴素的路径相乘复杂度是O(n^2),所以采用FFT加速多项式乘法达到(nlogn)的复杂度,总体复杂度就是(nlognlogn)的复杂度。做题步骤:点分治处理统计当前子树的路径进行FFT累加路径,放进桶里重复重心的所有子树重复2,3,4步骤清空桶,继续点分治统计答案代码实现#include<bits/stdc++.h>using namespace std;#define ll l原创 2020-05-29 11:19:45 · 214 阅读 · 0 评论 -
点分治-luogu4149
题目链接luogu4149思路点分治的裸题,每次计算距离的时候带入一个深度,开一个judge数组开记录距离为k的最小步数时多少,每次更新即可,具体看代码。代码实现#include<bits/stdc++.h>using namespace std;#define ll long longconst int N = 2e5+10;int head[N],tot;int maxp[N],siz[N],tmp[N*10],cnt,d[N];int sum,rt;bool vis原创 2020-05-28 14:43:10 · 89 阅读 · 0 评论 -
点分治-luogu2664
思路这题是个很好的点分治题目。首先明确我们的目的,既然使用了点分治,那么就需要O(n)的时间内处理出重心rt以及“rt的儿子”的答案。考虑重心的一个子树的根节点,如果这个点v的颜色是第一次出现,那么它对其他不在该子树的点的答案的贡献(包括rt)就是size[v]然后我们再考虑这个子树,注意刚刚我们考虑的是子树的根节点,现在考虑的是整个子树对其他“rt儿子”的贡献。假设该子树的根节点是v,从v~rt上有num种颜色,那么对其他节点的贡献就是num*(size[rt]-size[v])整体的步骤:原创 2020-05-28 14:42:47 · 100 阅读 · 0 评论 -
点分治-luogu2634
题目链接luogu2634思路经典的点分治算法,点分治是logn层,考虑O(n)处理路径问题,核心代码是下面这部分int calc(int u,int v){ dis[u]=v%3; tmp[0]=tmp[1]=tmp[2]=0; getdis(u,0); return tmp[1]*tmp[2]*2+tmp[0]*tmp[0];}void divide(int u){ //先统计所有答案 ans+=calc(u,0); vis[u]=1原创 2020-05-28 14:41:20 · 106 阅读 · 0 评论 -
点分治-CF161D
题目链接CF161D-luogu思路套用点分治的思想先处理出每个节点的距离记录桶中的个数更新答案更新桶下一轮分治清空桶代码实现#include<bits/stdc++.h>using namespace std;#define ll long longconst int N = 5e4+10;int head[N],tot;int maxp[N],siz[N],rt,sum,dis[N],cnt;int tmp[N],rec[N],ans,n,k;bool原创 2020-05-28 14:40:28 · 163 阅读 · 0 评论