P4178 Tree
P4178 Tree
题意:
给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量。
题解:
点分治的模板题是求等于K的路径条数
本题是求小于等于K的路径条数,我们只需要改变统计答案即可
原本统计答案是对一个路劲长度len,判断K-len在之前的子树中出现多少次,用f数组来记录,直接查看f[k-len]等于多少即可
现在统计答案是对一个路径长度len,判断小于等于K-len的数在之前的子树中出现多少次,统计区间数量,我们可以用树状数组来实现,对于每个len我们插入数组f[]其中,然后求1~K-len的区间查询
代码:
详细看代码
#include<bits/stdc++.h>
#define MAXN 40005
#define MAXK 20005
using namespace std;int N,K;struct edge{int v,w;edge(int v=0, int w=0):v(v), w(w){}
};vector<edge> adj[MAXN];//
int fw[MAXK];
int lbt(int x){return x & (-x);
}
int getsum(int x){int ans = 0;for(;x>0;x-=lbt(x)){ans += fw[x];}return ans;
}void change(int x, int dv){for(;x<=K;x+=lbt(x)){fw[x] += dv;}
}//
int sz[MAXN];
bool vis[MAXN];
int rt;
void dfs_rt(int u, int fa, int tot){//O(tot)求根 sz[u] = 1;int v, n = 0;for(int k=0;k<adj[u].size();k++){v = adj[u][k].v;if(v==fa || vis[v]) continue;dfs_rt(v, u, tot);sz[u] += sz[v];n = max(n, sz[v]);}n = max(n, tot-sz[u]);if(n*2 <= tot) rt = u;
}void dfs_sz(int u, int fa){//O(tot)求子树sz[u] = 1;int v, n = 0;for(int k=0;k<adj[u].size();k++){v = adj[u][k].v;if(v==fa || vis[v]) continue;dfs_sz(v, u);sz[u] += sz[v];}
}int d[MAXN], cnt = 0;
void dfs_dis(int u, int fa, int dis){//O(tot)d[++cnt] = dis;//记录距离 int v,w;for(int k=0;k<adj[u].size();k++){v = adj[u][k].v;w = adj[u][k].w;if(v==fa || vis[v]) continue;dfs_dis(v, u, dis + w);}
}void dfs_clear(int u, int fa, int dis){//O(tot)清零 if(dis) change(dis, -1);int v,w;for(int k=0;k<adj[u].size();k++){v = adj[u][k].v;w = adj[u][k].w;if(v==fa || vis[v]) continue;dfs_clear(v, u, dis + w);}
}int work(int u, int tot){ dfs_rt(u, 0, tot);u = rt;dfs_sz(u, 0);vis[u] = 1;int v,w;//solve/*求出每个点到根节点的距离,然后记录到数组d然后对于d[i],查询0~K-d[i]区间大小,用树状数组实现 如果d[i]<=K,那么d[i]本身也符合条件 将数组d插入到树状数组当以一个点为根的一轮结束时记得情况数组树状数组 */ int ans = 0;for(int k=0;k<adj[u].size();k++){v = adj[u][k].v;w = adj[u][k].w;if(vis[v]) continue;cnt = 0;dfs_dis(v, u, w);for(int i=1;i<=cnt;i++){if(d[i] <= K) ++ans;ans += getsum(max(0,K-d[i]));}for(int i=1;i<=cnt;i++){change(d[i], +1);}}dfs_clear(u,0,0);//手动清空 //for(int k=0;k<adj[u].size();k++){v = adj[u][k].v;//w = adj[u][k].w;if(vis[v]) continue;ans += work(v,sz[v]);} return ans;
}int main(){cin>>N;int u,v,w;for(int i=1;i<N;i++){cin>>u>>v>>w;adj[u].push_back(edge(v,w));adj[v].push_back(edge(u,w));}cin>>K;cout<<work(1, N)<<endl;return 0;
}
P4178 Tree相关推荐
- Luogu P4178 Tree (点分治 + 树状数组)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P4178 Prob ...
- P4178 Tree (点分治)
题意: 给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量. 题解: 根点分治模板提很相似,只不过这个题目让你去维护小于等于k距离点的个数,这个时候我们还是要用到桶的思想 ...
- 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 ...
- 点分治(树分治)详解
作者: hsez_yyh 链接:https://blog.csdn.net/yyh_getAC/article/details/126696654 来源:湖北省黄石二中信息竞赛组 著作权 ...
- 107. Binary Tree Level Order Traversal II
题目 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from l ...
- 102. Binary Tree Level Order Traversal
题目 Binary Tree Level Order Traversal 层次遍历二叉树 链接 Given a binary tree, return the level order traversa ...
- Python---哈夫曼树---Huffman Tree
今天要讲的是天才哈夫曼的哈夫曼编码,这是树形数据结构的一个典型应用. !!!敲黑板!!!哈夫曼树的构建以及编码方式将是我们的学习重点. 老方式,代码+解释,手把手教你Python完成哈夫曼编码的全过程 ...
最新文章
- EST:李芳柏团队揭示微生物介导的砷氧化耦合硝酸还原
- 论大型信息系统集成项目的整体管理
- 2018秋招面经:斗鱼、滴滴、百度、美团、小米、腾讯
- pywinauto二次封装(pywinnat.py)
- nssl1143,jzoj3493-三角形【排序,数学,几何】
- Redis高级项目实战!北京java编程入门培训
- matlab 作图 虚线太长,matlab 极坐标绘图 在matlab中,用polar画的图形,如何使虚线圆多显示几个?...
- 一个很Low的通讯录管理系统(但是能用)C/C++单链表实现
- 一键自动化部署web架构
- 浅谈css3长度单位rem,以及移动端布局技巧
- Python-web框架 fastapi
- 关于负载均衡一些概念的正确理解
- ae效果英文版翻译对照表_AE 特效中英翻译
- OpenGL with QtWidgets:材质、光照贴图
- python里面pop代码什么意思_python里的pop是什么
- 正则表达式过滤非数字字符串
- linux命令 ln命令 ln -s命令
- NR 5G 组网(NSA和SA)
- 译文 - Recommender Systems: Issues, Challenges, and Research Opportunities
- matlab 动态显示图片,Matlab动态绘图、展示并保存的一种方法
热门文章
- 从数学入手,3招打破机器学习的边界
- 数学课本上的几大变态
- android 只能输入汉字,EditText限制输入的几种方式及只显示中文汉字的做法
- android 栏目编辑,android – 编辑文本导致内存泄漏
- linux accept过程,Linux协议栈accept和syn队列问题
- networkx 画有权图_利用NetworkX画网络图
- linux下找不到libc 库,Linux-覆盖libc open()库函数
- mysql数据库5120_超傻瓜 H3C S5120 限速配置
- 嵌入式linux pcie网卡配置,嵌入式Linux下PCIE数据采集卡驱动开发
- 软件构造学习笔记-实验3