Acwing-252-树(点分治)
链接:
https://www.acwing.com/problem/content/254/
题意:
给定一个有N个点(编号0,1,…,N-1)的树,每条边都有一个权值(不超过1000)。
树上两个节点x与y之间的路径长度就是路径上各条边的权值之和。
求长度不超过K的路径有多少条。
思路:
点分治, 就是将一棵树根据他的重心分成多颗子树求解.
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 1e4+10;
const int INF = 1e9;
struct Edge
{
int to;
int dis;
};
vector<Edge> G[MAXN];
int Size[MAXN], Cnt[MAXN];
int Vis[MAXN], Dis[MAXN];
int root, maxroot;
int n, k, cnt, treesize;
LL ans = 0;
void GetRoot(int u, int fa)
{
Size[u] = 1;
int num = 0;
for (int i = 0;i < G[u].size();i++)
{
int to = G[u][i].to;
if (to == fa || Vis[to] == 1)
continue;
GetRoot(to, u);
Size[u] += Size[to];
num = max(num, Size[to]);
}
num = max(num, treesize-Size[u]);
if (num < maxroot)
{
root = u;
maxroot = num;
}
}
void GetDis(int u, int fa)
{
Cnt[++cnt] = Dis[u];
for (int i = 0;i < G[u].size();i++)
{
int to = G[u][i].to;
if (to == fa || Vis[to] == 1)
continue;
Dis[to] = Dis[u] + G[u][i].dis;
GetDis(to, u);
}
}
LL Cal(int u, int val)
{
cnt = 0;
Dis[u] = val;
GetDis(u, 0);
LL sum = 0;
int l = 1, r = cnt;
sort(Cnt+1, Cnt+1+cnt);
while (l < r)
{
if (Cnt[l]+Cnt[r] <= k)
sum += r-l, ++l;
else
--r;
}
return sum;
}
void Dfs(int u)
{
ans += Cal(u, 0);
Vis[u] = 1;
for (int i = 0;i < G[u].size();i++)
{
int to = G[u][i].to;
if (Vis[to] == 1)
continue;
ans -= Cal(to, G[u][i].dis);
treesize = Size[to];
maxroot = INF;
GetRoot(to, 0);
Dfs(root);
}
}
int main()
{
while(~scanf("%d%d", &n, &k) && (n||k))
{
ans = 0;
for (int i = 1;i <= n;i++)
G[i].clear();
memset(Vis, 0, sizeof(Vis));
memset(Size, 0, sizeof(Size));
memset(Cnt, 0, sizeof(Cnt));
int u, v, w;
for (int i = 1;i < n;i++)
{
scanf("%d%d%d", &u, &v, &w);
u++, v++;
// cout << u << ' ' << v << ' ' << w << endl;
G[u].push_back(Edge{v, w});
G[v].push_back(Edge{u, w});
}
treesize = n;
maxroot = INF;
GetRoot(1, 0);
Dfs(root);
printf("%lld\n", ans);
}
return 0;
}
Acwing-252-树(点分治)的更多相关文章
- AcWing 252. 树 (点分治)打卡
题目:https://www.acwing.com/problem/content/254/ 题意:求一棵树上,路径<=k的有多少条 思路:点分治,我们用两个指针算solve函数,首先对算出来的 ...
- hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)
题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...
- 洛谷P3248 树 [HNOI2016] 主席树+倍增+分治
正解:主席树+倍增+分治 解题报告: 传送门! 首先看到这题会想到之前考过的这题 但是那题其实简单一些,,,因为那题只要用个分治+预处理就好,只是有点儿思维难度而已 这题就不一样,因为它说了是按照原树 ...
- 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护
线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...
- POJ 1741 Tree 树的分治
原题链接:http://poj.org/problem?id=1741 题意: 给你棵树,询问有多少点对,使得这条路径上的权值和小于K 题解: 就..大约就是树的分治 代码: #include< ...
- hdu 4871 树的分治+最短路记录路径
/* 题意:给你一些节点和一些边,求最短路径树上是k个节点的最长的路径数. 解:1.求出最短路径树--spfa加记录 2.树上进行操作--树的分治,分别处理子树进行补集等运算 */ #include& ...
- hdu 4670 树的分治-求点对的个数
/* 树的分治 因为树的点权值可达到10^15,注意手动扩栈,还有int64 题意:给你一棵树,给你一些素数,给你每个点一个权值且每个权值均可由这些素数组成.现在定义任意任意两点的价值为他们路径上的权 ...
- bzoj3648: 寝室管理(环套树+点分治)
好题..写了两个半小时hh,省选的时候要一个半小时内调出这种题目还真是难= = 题目大意是给一棵树或环套树,求点距大于等于K的点对数 这里的树状数组做了一点变换.不是向上更新和向下求和,而是反过来,所 ...
- UVALive 7148 LRIP(树的分治+STL)(2014 Asia Shanghai Regional Contest)
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=6 ...
- 【BZOJ-4435】Juice Junctions 最小割树(分治+最小割)+Hash
4435: [Cerc2015]Juice Junctions Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 20 Solved: 11[Submi ...
随机推荐
- 【LOJ】#3093. 「BJOI2019」光线
LOJ#3093. 「BJOI2019」光线 从下到上把两面镜子合成一个 新的镜子是\((\frac{a_{i}a_{i + 1}}{1 - b_{i}b_{i + 1}},b_{i} + \frac ...
- IDEA自动生成的注释模板
使用效果如下: * * @功能描述 : $params$ * @return $returns$ * @author xuetao */ 其中 $params$的表达式如下: groovyScript ...
- LC 200 Number of Islands
问题描述 Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is ...
- GIL全局解释器
' GIL是一个互斥锁:保证数据的安全(以牺牲效率来换取数据的安全) 阻止同一个进程内多个线程同时执行(不能并行但是能够实现并发) 并发:看起来像同时进行的 GIL全局解释器存在的原因是因为CPyth ...
- 《深入理解 java 虚拟机》学习 -- 内存分配
<深入理解 java 虚拟机>学习 -- 内存分配 1. Minor GC 和 Full GC 区别 概念: 新生代 GC(Minor GC):指发生在新生代的垃圾收集动作,因为 Java ...
- 3-Perl 基础语法
Perl 基础语法Perl借用了C.sed.awk.shell脚本以及很多其他编程语言的特性,语法与这些语言有些类似,也有自己的特点.Perl 程序有声明与语句组成,程序自上而下执行,包含了循环,条件 ...
- 解决maven依赖包下载慢的问题
修改maven 目录下setting.xml配置文件 在mirrors中添加如下配置即可 <mirror> <id>alimaven</id> <name&g ...
- 动画方案 Lottie 学习(一)之基础
参考 lottie系列文章(一):lottie介绍 lottie系列文章(二):lottie最佳实践 lottie系列文章(三):动画设计规范 lottie系列文章(四):源码分析——svg渲染
- JS基础_打印99乘法表
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- json字符串对象
1.将字符串转为json对象:JSON.parse(); 2.json对象转字符串:JSON.stringify(); <!DOCTYPE html> <html> <h ...