题意:

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

分析:

  这个题的询问和点数都不多(但是显然暴力是不太好过的,即使有人暴力过了)

  这题应该怎么用点分治呢。显然,一个模板题,我们直接用套路,每次找重心,对于这个重心处理,过当前点的符合要求的路径。

  我们可以看到这个最大长度1e7,开数组是开得下的,所以维护一个数组(或者bitset也行)来保存之前的子树中到根距离的长度,之后访问到每个子树时,先查询,再记录,最后删除标记,将所有的点都统计完之后,答案便被保存到了数组中,直接按照题意输出即可。

代码:

 #include<bits/stdc++.h>
using namespace std;
const int N=,inf=1e7;
struct node{int y,z,nxt;}e[N<<];
int n,m,c=,h[N],mx[N],siz[N],d[N],rem[N],sm;
int t[inf],jd[inf],vis[N],que[N],q[N],rt,ans;
void add(int x,int y,int z){
e[++c]=(node){y,z,h[x]};h[x]=c;
e[++c]=(node){x,z,h[y]};h[y]=c;
} void getrt(int x,int fa){//负责找重心
siz[x]=;mx[x]=;
for(int i=h[x],y;i;i=e[i].nxt)
if((y=e[i].y)!=fa&&!vis[y]){
getrt(y,x);siz[x]+=siz[y];
mx[x]=max(mx[x],siz[y]);
} mx[x]=max(mx[x],sm-siz[x]);
if(mx[x]<mx[rt]) rt=x;return ;
} void dfs(int x,int fa){//负责求点到子树中点的距离
rem[++rem[]]=d[x];
for(int i=h[x],y;i;i=e[i].nxt)
if((y=e[i].y)!=fa&&!vis[x])
d[y]=d[x]+e[i].z,dfs(y,x);
} void calc(int x){ int p=;//负责处理x点为根的子树
for(int i=h[x],y;i;i=e[i].nxt)
if(!vis[y=e[i].y]){
rem[]=;d[y]=e[i].z;dfs(y,x);
for(int j=rem[];j;j--)
for(int k=;k<=m;k++)
if(que[k]>=rem[j])
t[k]|=jd[que[k]-rem[j]];
for(int j=rem[];j;j--)
q[++p]=rem[j],jd[rem[j]]=;
} for(int i=;i<=p;i++) jd[q[i]]=;
} void solve(int x){//负责每次找重心,层层分治
vis[x]=jd[]=;calc(x);
for(int i=h[x],y;i;i=e[i].nxt){
if(vis[y=e[i].y]) continue;
sm=siz[y];mx[rt=]=inf;
getrt(y,);solve(rt);
} return;
} int main(){
scanf("%d%d",&n,&m);
for(int i=,x,y,z;i<n;i++)
scanf("%d%d%d",&x,&y,&z),add(x,y,z);
for(int i=;i<=m;i++) scanf("%d",&que[i]);
mx[rt]=sm=n;getrt(,);solve(rt);
for(int i=;i<=m;i++)
if(t[i]) puts("AYE");else puts("NAY");
return ;
}

点分治

Luogu P3806 点分治模板1的更多相关文章

  1. 【Luogu】P3806点分治模板(点分治)

    题目链接 wc听不懂lca讲的高等数学专场(一个字都听不懂),然后就自学了点分治. 点分治就是我先处理完跟根有关的东西,然后把根标记掉,把原树拆成若干个联通块,然后分别对每个联通块(每个小树)搞一模一 ...

  2. 洛谷 P3806 点分治模板

    题目:https://www.luogu.org/problemnew/show/P3806 就是点分治~ 每次暴力枚举询问即可,复杂度是 nmlogn: 注意 tmp[0]=1 ! 代码如下: #i ...

  3. 模板·点分治(luogu P3806)

    [模板]洛谷·点分治 1.求树的重心 树的重心:若A点的子树中最大的子树的size[] 最小时,A为该树的中心 步骤: 所需变量:siz[x] 表示 x 的子树大小(含自己),msz[x] 表示 其子 ...

  4. [luogu P3806] 【模板】点分治1

    [luogu P3806] [模板]点分治1 题目背景 感谢hzwer的点分治互测. 题目描述 给定一棵有n个点的树 询问树上距离为k的点对是否存在. 输入输出格式 输入格式: n,m 接下来n-1条 ...

  5. (模板)luoguP3806(树上点分治模板题)

    点分治的写法1: 题目链接:https://www.luogu.org/problem/P3806 题意:给出一颗带边权的树,结点数n<=1e4,每条边有权值<=1e4,有m组询问(m&l ...

  6. Luogu 3806 点分治1

    Luogu 3806 点分治 要分清楚各个函数的作用及互相调用的关系. 因为是无根树,找重心的时候,父亲一边的所有节点也可以看做是一颗子树. #include<bits/stdc++.h> ...

  7. [Luogu 3701] 「伪模板」主席树

    [Luogu 3701] 「伪模板」主席树 这是一道网络流,不是主席树,不是什么数据结构,而是网络流. 题目背景及描述都非常的暴力,以至于 Capella 在做此题的过程中不禁感到生命流逝. S 向 ...

  8. 洛谷P2634 [国家集训队]聪聪可可 点分治模板

    题意 在一棵树上任意选两个点,求它们距离模3为0的概率. 分析 树分治模板 Code #include<bits/stdc++.h> #define fi first #define se ...

  9. POJ1741 tree (点分治模板)

    题目大意: 给一棵有 n 个顶点的树,每条边都有一个长度(小于 1001 的正整数).定义 dist(u,v)=节点 u 和 v 之间的最小距离.给定一个整数 k,对于每一对 (u,v) 顶点当且仅当 ...

随机推荐

  1. TP5之自定义分页样式

    分页样式为 在extend\目录下创建page目录,在page目录下创建Page.php文件,将以下代码放入文件中. <?php namespace page; use think\Pagina ...

  2. 51nod 1103【鸽巢原理】

    思路: 这道题嘛有些弯还是要转的,比如你说让你搞n的倍数,你别老老实实照她的意思去啊,倍数可以除法,取膜 . 因为n个数我们可以求前缀和然后取膜,对n取膜的话有0-n-1种情况,所以方案一定是有的,说 ...

  3. poj3669【bfs】

    题意: 有个**要看流星雨,可是流星雨会砸死他的... 给出n个流星雨下落的坐标,时间,如果那个**在下落坐标或是上下左右就会gg,问你他最短跑到流星雨打不到的地方的时间. 思路: ①:预处理出一个矩 ...

  4. hdoj4027【线段树】

    题意: 给你一个序列,然后给出m个命令, 每个命令有两种:①:在区间内实现开方:②:求一个区间和: 思路: 一开始没思路啊,这个开方又不像加加减减一起来就好了,开方只能自己玩啊,但是仔细一想一个数也才 ...

  5. 鉴于spfa基础上的差分约束算法

    怎么搞?        1. 如果要求最大值      想办法把每个不等式变为标准x-y<=k的形式,然后建立一条从y到x权值为k的边,变得时候注意x-y<k =>x-y<=k ...

  6. 洛谷P4199 万径人踪灭(manacher+FFT)

    传送门 题目所求为所有的不连续回文子序列个数,可以转化为回文子序列数-回文子串数 回文子串manacher跑一跑就行了,考虑怎么求回文子序列数 我们考虑,如果$S_i$是回文子序列的对称中心,那么只要 ...

  7. MAC下如何配置Android手机调试(将测试手机加入到Mac系统的调试列表中)

    第一步: 查看usb设备信息 在 终端输入:system_profiler SPUSBDataType     可以查看连接的usb设备的信息 比如我的usb信息如下(部分内容): 查看到我的Andr ...

  8. 统计Apache或nginx日志里访问次数最多的前十个IP

    1.根据访问IP统计UV awk '{print $1}' access.log|sort | uniq -c |wc -l 2.统计访问URL统计PV awk '{print $7}' access ...

  9. 【转】有了Auto Layout,为什么你还是害怕写UITabelView的自适应布局?

      Apple 算是最重视应用开发体验的公司了.从Xib到StoryBoard,从Auto Layout到Size Class,每一次的更新,都会给iOS应用的开发带来不小的便利.但是,对于绝对多数i ...

  10. the little schemer 笔记(7)

    第七章 Friends and Relations 这是一个set集合吗 (apple peaches apple plum) 不是,apple出现了不止一次 (set? lat) 是真还是假,其中l ...