LUOGU P4178 Tree
题目描述
给你一棵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相关推荐
- Luogu P4178 Tree (点分治 + 树状数组)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4178 Prob ...
- P4178 Tree
P4178 Tree 题意: 给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量. 题解: 点分治的模板题是求等于K的路径条数 本题是求小于等于K的路径条数,我们只需要改 ...
- P4178 Tree (点分治)
题意: 给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量. 题解: 根点分治模板提很相似,只不过这个题目让你去维护小于等于k距离点的个数,这个时候我们还是要用到桶的思想 ...
- 点分治(树分治)详解
作者: hsez_yyh 链接:https://blog.csdn.net/yyh_getAC/article/details/126696654 来源:湖北省黄石二中信息竞赛组 著作权 ...
- Acwing 252. 树
Acwing 252. 树 题意: 给定一个有 N 个点(编号 0,1,-,N−1)的树,每条边都有一个权值(不超过 1000). 树上两个节点 x 与 y 之间的路径长度就是路径上各条边的权值之和. ...
- 点分治题单(来自XZY)
点分治题单(来自XZY) 静态点分治 [x] 洛谷 P3806 [模板]点分治1 [x] 洛谷 P4178 Tree [x] 洛谷 P2634 [国家集训队]聪聪可可 [x] 洛谷 P4149 [IO ...
- c语言typeof 变量,c语言中typeof关键字
为什么因为一个关键字而专门写一篇随笔呢?因为这个关键字在Linux里面地位非同一般!这个关键字typeof在linux内核里面使用非常广泛! 下面这两个等效声明,用于声明int类弄的变量a typeo ...
- 【LCT】Tree II(luogu 1501)
Tree II luogu 1501 题目大意 给出一棵树,让你进行若干操作,操作如下: 1.把两个点路径上的所有点权值加k 2.把两个点路径上的所有点权值乘k 3.把一条边断开,连上另一条边 4.查 ...
- 【点分治】Tree(luogu 4178/金牌导航 点分治-1)
Tree luogu 4178 金牌导航 点分治-1 题目大意 给出一棵树,问你书中路径长度小于等于k的点对个数有多少个 输入样例 5 1 2 3 1 3 1 1 4 2 3 5 1 4 输出样例 8 ...
- Luogu P2619 [国家集训队2]Tree I(WQS二分+最小生成树)
P2619 [国家集训队2]Tree I 题意 题目描述 给你一个无向带权连通图,每条边是黑色或白色.让你求一棵最小权的恰好有\(need\)条白色边的生成树. 题目保证有解. 输入输出格式 输入格式 ...
最新文章
- 决策树是如何选择特征和分裂点?
- 【转】ROWNUM与ORDER BY先后关系
- Leetcode 77.组合
- 程序员面试什么最重要?
- .NET的Snk使用方法
- 剑指Offer - 九度1367 - 二叉搜索树的后序遍历序列
- hdu 1165 坑爹找规律题
- desktop docker 无法卸载_Docker容器无法停止或移除-权限被拒绝错误
- 计算机怎样用计算法绘制圆弧,计算机图形学圆弧生成算法具体程序实现
- 融合存储超越统一存储
- 下血本买的!2021Java高级面试题
- JHipster简介
- 简单分布式系统构建知识
- 图像处理_如何保存浮点型数值的图像? (C++ / OpenCV)
- 各省能源平衡表(2000-2018年)
- 《和平精英》迎来史上最严封号:模拟器过检测、手机外设全部凉凉?
- 矩阵乘法的计算和来源
- Oracle基础学习
- 嵌入式linux驱动-LCD液晶屏驱动
- PDF控件PDFToolkit VCL V5.0.0.612发布 | 修复了PDF查看器和打印机
热门文章
- C盘空间丢失30G,怎么也找不到
- 编译lua5.3.5报错:libreadline.so存在多处未定义的引用
- doubango编码及发送流程的疑惑
- ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or
- 管理感悟:不能放任下属,必须定时检查工作
- mybatis多数据源配置_springboot+mybatis+aop配置动态数据源
- C++ Arduino 串口输出读取整合
- php判断长度函数是,php判断字符串长度 strlen()与mb_strlen()函数
- java最长同值路径_力扣——最长同值路径
- arraylist输出 java_在java中打印ArrayList时输出不同