题目描述

给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K
输入输出格式
输入格式:

N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k

输出格式:

一行,有多少对点之间的距离小于等于k

输入输出样例
输入样例#1:

7
1 6 13
6 3 9
3 5 7
4 1 3
2 4 20
4 7 2
10

输出样例#1:

5

解题思路

先%一发GhostCai TQL!!!
点分治+树状数组。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>using namespace std;
const int MAXN = 40005;inline int rd() {int x=0,f=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}int f[MAXN],n,K,sum,mx,siz[MAXN],ans;
int head[MAXN],cnt,stk[MAXN],top,rt;
int to[MAXN<<1],nxt[MAXN<<1],val[MAXN<<1];
queue<int> Q;
bool vis[MAXN];inline void add(int bg,int ed,int w){to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt;
}inline void update(int x,int w){for(;x<=K;x+=x&-x) f[x]+=w;
}inline int query(int x){int ret=0;for(;x;x-=x&-x) ret+=f[x];return ret;
}void dfs(int x,int fa){siz[x]=1;for(register int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u] || u==fa) continue;dfs(u,x);siz[x]+=siz[u];}
}void getrt(int x,int fa){int k=0;for(register int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u] || u==fa) continue;getrt(u,x);k=max(k,siz[u]);}k=max(k,sum-siz[x]);if(k<mx) {mx=k;rt=x;}
}void getdis(int x,int fa,int dis){if(dis<=K){Q.push(dis);stk[++top]=dis;ans+=query(K-dis);}else return;for(register int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u] || u==fa) continue;getdis(u,x,dis+val[i]);}
}inline void getans(int x){vis[x]=1;for(register int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u]) continue;getdis(u,x,val[i]);ans+=Q.size();while(!Q.empty()){int now=Q.front();Q.pop();update(now,1);}}for(register int i=1;i<=top;i++) update(stk[i],-1);top=0;for(register int i=head[x];i;i=nxt[i]){int u=to[i];if(vis[u]) continue;dfs(u,x);mx=sum=siz[u];rt=0;getrt(u,x);
//      cout<<u<<" "<<rt<<endl;
        getans(rt);}
}int main() {n=rd();for(register int i=1;i<n;i++) {int x=rd(),y=rd(),z=rd();add(x,y,z);add(y,x,z);}K=rd();sum=mx=n;dfs(1,0);getrt(1,0);getans(rt);cout<<ans<<endl;return 0;
}

 

转载于:https://www.cnblogs.com/sdfzsyq/p/9676891.html

LUOGU P4178 Tree相关推荐

  1. Luogu P4178 Tree (点分治 + 树状数组)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4178 Prob ...

  2. P4178 Tree

    P4178 Tree 题意: 给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量. 题解: 点分治的模板题是求等于K的路径条数 本题是求小于等于K的路径条数,我们只需要改 ...

  3. P4178 Tree (点分治)

    题意: 给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量. 题解: 根点分治模板提很相似,只不过这个题目让你去维护小于等于k距离点的个数,这个时候我们还是要用到桶的思想 ...

  4. 点分治(树分治)详解

    作者: hsez_yyh 链接:https://blog.csdn.net/yyh_getAC/article/details/126696654 来源:湖北省黄石二中信息竞赛组        著作权 ...

  5. Acwing 252. 树

    Acwing 252. 树 题意: 给定一个有 N 个点(编号 0,1,-,N−1)的树,每条边都有一个权值(不超过 1000). 树上两个节点 x 与 y 之间的路径长度就是路径上各条边的权值之和. ...

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

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

  7. c语言typeof 变量,c语言中typeof关键字

    为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量a typeo ...

  8. 【LCT】Tree II(luogu 1501)

    Tree II luogu 1501 题目大意 给出一棵树,让你进行若干操作,操作如下: 1.把两个点路径上的所有点权值加k 2.把两个点路径上的所有点权值乘k 3.把一条边断开,连上另一条边 4.查 ...

  9. 【点分治】Tree(luogu 4178/金牌导航 点分治-1)

    Tree luogu 4178 金牌导航 点分治-1 题目大意 给出一棵树,问你书中路径长度小于等于k的点对个数有多少个 输入样例 5 1 2 3 1 3 1 1 4 2 3 5 1 4 输出样例 8 ...

  10. Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)

    P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...

最新文章

  1. 决策树是如何选择特征和分裂点?
  2. 【转】ROWNUM与ORDER BY先后关系
  3. Leetcode 77.组合
  4. 程序员面试什么最重要?
  5. .NET的Snk使用方法
  6. 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
  7. hdu 1165 坑爹找规律题
  8. desktop docker 无法卸载_Docker容器无法停止或移除-权限被拒绝错误
  9. 计算机怎样用计算法绘制圆弧,计算机图形学圆弧生成算法具体程序实现
  10. 融合存储超越统一存储
  11. 下血本买的!2021Java高级面试题
  12. JHipster简介
  13. 简单分布式系统构建知识
  14. 图像处理_如何保存浮点型数值的图像? (C++ / OpenCV)
  15. 各省能源平衡表(2000-2018年)
  16. 《和平精英》迎来史上最严封号:模拟器过检测、手机外设全部凉凉?
  17. 矩阵乘法的计算和来源
  18. Oracle基础学习
  19. 嵌入式linux驱动-LCD液晶屏驱动
  20. PDF控件PDFToolkit VCL V5.0.0.612发布 | 修复了PDF查看器和打印机

热门文章

  1. C盘空间丢失30G,怎么也找不到
  2. 编译lua5.3.5报错:libreadline.so存在多处未定义的引用
  3. doubango编码及发送流程的疑惑
  4. ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
  5. 管理感悟:不能放任下属,必须定时检查工作
  6. mybatis多数据源配置_springboot+mybatis+aop配置动态数据源
  7. C++ Arduino 串口输出读取整合
  8. php判断长度函数是,php判断字符串长度 strlen()与mb_strlen()函数
  9. java最长同值路径_力扣——最长同值路径
  10. arraylist输出 java_在java中打印ArrayList时输出不同