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 ...
随机推荐
- ROS topic,service和action的使用场景
参考:ROS中关于topic和service的运用场合 Topics 特点: 1.单向,分工明确,处理连续数据流,topic是一种多对多的形式,一个Node可以订阅多个Topic,可以publish到 ...
- PTA (Advanced Level)1035.Password
To prepare for PAT, the judge sometimes has to generate random passwords for the users. The problem ...
- Base64encoder干什么用的
https://baike.baidu.com/item/base64/8545775?fr=aladdin BASE64加密算法.用来给字符串加密的.已经不安全了. 一直以来Base64的加密解密都 ...
- Elasticsearch多集群数据同步
有时多个Elasticsearch集群避免不了要同步数据,网上查找了下数据同步工具还挺多,比较常用的有:elasticserach-dump.elasticsearch-exporter.logsta ...
- centos7下NFS配置
NFS是Network File System的缩写,即网络文件系统.客户端通过挂载的方式将NFS服务器端共享的数据目录挂载到本地目录下. 前言 四台机器: ,218三台机器的/root/filedi ...
- 怎样在 Vue 中使用 事件修饰符 ?
Vue 中可以通过 v-on 来绑定事件监听函数, 不过事件会有许多额外情况, 比如 是否阻止冒泡 / 是否阻止重载 / 是否限制点击次数 / 是否可以通过按键触发 等等. 这时就需要使用到 事件修饰 ...
- 版本控制工具SVN学习
教学视频链接:https://edu.aliyun.com/course/83?spm=5176.10731334.0.0.778e6580zC0Ri0 版本控制工具SVN学习 1,SVN的简介 在实 ...
- loj 2759「JOI 2014 Final」飞天鼠
loj 这题有在一棵树上上升或者下降的操作,稍加分析后可以发现上升操作如果不是一定要做(指高度不足以到下一棵树或者是最后到达\(n\))就不做,下降操作也是如果不是一定要做(指到达下一棵树时高度过高) ...
- 10 Django之Ajax请求
一.什么是Ajax技术? 异步的JavaScript和XML.使用Javascript语言与服务器进行异步交互,传输的数据为XML(更多的使用json数据).Ajax不是一门新的编程语言,而是一种使用 ...
- 第九章、import 和from ...import
目录 第九章.import 和from ...import 一.import和 from ...import ... 二.import模块名 第九章.import 和from ...import 一. ...