题意:
给定一棵有 n 个点的树,询问树上距离为 k 的点对是否存在。

题解:
​ 因为题目是要求路径长为k的路径条数,所以solve函数返回的是过x节点的长度为k的路径。
而这路径长度是可以用 O(n)O(n)O(n) 的方法求出
点分治,没啥好说的。

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int maxn=2e5+10;struct E{int to,w,next;
}edge[maxn];
int head[maxn],cnt;
int maxp[maxn],dis[maxn],sz[maxn];
bool visited[maxn],judge[10000000];
int sum,rt,q[maxn],nowcnt,temp[maxn];
int n,m;
void getrt(int x,int fa){  sz[x]=1,maxp[x]=0;//maxp初始化为最小值//遍历所有儿子,用maxp保留最大大小的儿子大小for(int i=head[x];~i;i=edge[i].next){int to=edge[i].to;//int w=edge[i].w;if(to==fa||visited[to]) continue;  //被删掉的也不算getrt(to,x);sz[x]+=sz[to];if(sz[to]>maxp[x]) maxp[x]=sz[to]; //更新maxp}maxp[x]=max(maxp[x],sum-sz[x]);if(maxp[x]<maxp[rt]) rt=x;
}void add(int u,int v,int w){edge[cnt].to=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;
}void getdis(int x,int fa){   temp[nowcnt++]=dis[x];for(int i=head[x];~i;i=edge[i].next){int v=edge[i].to;if(v==fa||visited[v]) continue;dis[v]=dis[x]+edge[i].w;getdis(v,x);}
}
int ans[105];
void sol(int x){queue<int> que;for(int i=head[x];~i;i=edge[i].next){int v=edge[i].to;if(visited[v]) continue;nowcnt=0;   //注意置零计数器dis[v]=edge[i].w;getdis(v,x);  //把距离都处理出来for(int j=0;j<nowcnt;j++){  //遍历所有距离for(int k=1;k<=m;k++){  //遍历所有询问if(q[k]>=temp[j]){  //如果询问大于单条路径的长度,就有可能存在ans[k]|=judge[q[k]-temp[j]];}}}for(int j=0;j<nowcnt;j++){  //把存在的单挑路径长度标为true,供下文使用que.push(temp[j]);judge[temp[j]]=true;}}while(!que.empty()){judge[que.front()]=false;que.pop();}
}
void divide(int x){  visited[x]=judge[0]=true;  //删除根sol(x);  //计算经过根节点的路径for(int i=head[x];~i;i=edge[i].next){int v=edge[i].to;if(visited[v]) continue;maxp[rt=0]=sum=sz[v];  //重心设为0,把maxp[0]至为最大值getrt(v,0);getrt(rt,0);  //与主函数相同divide(rt);}
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);memset(head,-1,sizeof head);memset(visited,false,sizeof visited);cin>>n>>m;sum=n;for(int i=1;i<n;i++){int u,v,w;cin>>u>>v>>w;add(u,v,w);add(v,u,w);}maxp[0]=sum=n;  //maxp[0]设为最大值getrt(1,0);  //找重心getrt(rt,0);  //此时siz数组存放的是1为根的时的大小,需要以找出的重心为根重算。for(int i=1;i<=m;i++) cin>>q[i];divide(rt);   //找好重心就可以分治了for(int i=1;i<=m;i++){if(ans[i]) cout<<"AYE"<<endl;else cout<<"NAY"<<endl;}
}

P3806 【模板】点分治1相关推荐

  1. 洛谷 - P4721 【模板】分治 FFT(分治NTT)

    题目链接:点击查看 题目大意:给出序列 g1,⋯,ng_{1,\cdots,n}g1,⋯,n​,求 f0,⋯,nf_{0,\cdots,n}f0,⋯,n​ 规定 fi=∑j=1ifi−jgjf_i=\ ...

  2. P4721 【模板】分治 FFT

    传送门 文章目录 题意: 思路: 题意: 思路: 写一下式子,发现每个fif_ifi​只有左边的fff对他有影响,所以考虑分治FFTFFTFFT来解决这个问题. 先递归左边,让后计算对右边贡献,再递归 ...

  3. P3806来波点分治

    分治: 一,一棵树上的路径可以分两种:1.经过根节点的:2.不经过根节点的 二,若把根节点删去,则可以生成若干棵一根节点的儿子为根结点的子树,对于这些树来说,其上的路径也可以分为两种:1.经过根节点的 ...

  4. [洛谷P4721]【模板】分治 FFT

    题目大意:给定长度为$n-1$的数组$g_{[1,n)}$,求$f_{[0,n)}$,要求: $$ f_i=\sum_{j=1}^if_{i-j}g_j\\ f_0=1 $$ 题解:直接求复杂度是$O ...

  5. Luogu 4721 【模板】分治 FFT

    还不会这题的多项式求逆的算法. 发现每一项都是一个卷积的形式,那么我们可以使用$NTT$来加速,直接做是$O(n^2logn)$的,我们考虑如何加速转移. 可以采用$cdq$分治的思想,对于区间$[l ...

  6. LuoGuP4721:【模板】分治 FFT

    Pre 式子变换需要注意一下 Solution 注意到\(f(x)g(x)+f_0=f(x)\) 其实开始我没看出来,后来发现仔细分析一下就可以了. 然后式子变换 \(f(x)=\frac{f_0}{ ...

  7. 凸包模板(分治 or Graham扫描法)

    问题概述:空间上有很多点,现在要用一个凸多边形将所有点全部包住,求哪些点在这个凸多边形上 输入样例:                                             对应输出: ...

  8. 点分治题单(来自XZY)

    点分治题单(来自XZY) 静态点分治 [x] 洛谷 P3806 [模板]点分治1 [x] 洛谷 P4178 Tree [x] 洛谷 P2634 [国家集训队]聪聪可可 [x] 洛谷 P4149 [IO ...

  9. 【学习笔记】分治FFT

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 分治FFT 1. Luogu P4721 [模板]分治 FFT 2. 2020 ICPC Mac ...

  10. FTT NTT 分治FFT

    FFT study from: http://www.orchidany.cf/2019/02/19/FFT1/ https://www.cnblogs.com/zwfymqz/p/8244902.h ...

最新文章

  1. 用Java求一个三位数,该三位数是与其每位数字的阶乘之和
  2. 在肚子上开个通到胃大洞,牛瘤胃微生物组是这样研究的
  3. Apress Pro Android 2
  4. 改善代码可读性的5种方法
  5. 理解 Delphi 的类(十) - 深入方法[13] - 在 interface 区声明的方法
  6. 聚焦BCS|新华财经:奇安信董事长齐向东:网络安全市场规模10年将增长10倍
  7. 大数据智能营销有什么优势
  8. element-ui + 腾讯地图
  9. Android4.4添加系统服务(aidl接口服务)
  10. c语言FD_SET头文件,select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
  11. 如何高效学习 - 斯科特·扬
  12. selenium使用webdriver自动化浏览器打不开无法输入网址
  13. 真爱趁现在电视剧全集在线观看 html,真爱趁现在
  14. cmake:解决MSVC下/MT 编译paho.mqtt.c的问题
  15. 专利电子申请网个人缴费流程
  16. LeetCode 417. 太平洋大西洋水流问题--BFS
  17. rabbitMQ系列高级整合应用rabbitTemplate
  18. 线性代数入门(3) – 几何
  19. Ubuntu22.04使用笔记本电脑安装摄像头步骤
  20. 编程方法分享-删除WorkNC编程时不想要的刀路

热门文章

  1. 爬虫之requests模块中cookies参数的使用
  2. 解决kalilinux: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/
  3. 视频程式化的基于帧差异的时间损失
  4. 第五篇:并发控制-隔离
  5. 【裴蜀定理】[HAOI2011]向量
  6. Hadoop实战(6)_搭建Apache Hadoop的Eclipse开发环境
  7. centos7 安装apache+php+memcache
  8. znet zbus 子项目
  9. 仿QQ空间用一个tableview显示多种自定义cell
  10. wget使用代理下载