首页 > TAG信息列表 > P4178

洛谷 P4178 / POJ 1741 Tree

洛谷传送门 POJ 传送门 一眼点分治。 当递归到结点 \(u\) 时,计算出子结点 \(v\) 的子树内,所有结点和 \(u\) 的距离。然后与之前的合并并计算答案即可。使用树状数组,时间复杂度 \(O(n \log n \log k)\),空间复杂度 \(O(n + k)\)。 code /* p_b_p_b txdy AThousandSuns txdy Wu_Ren

P4178 Tree(点分治)

相比两个点的距离相加等于k, 等于k的倍数而言 这题稍微转换一下思路即可 利用容斥原理去掉重复计算的点对   点击查看代码 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; #define IOS ios::sync_with_stdio(false), cin.

洛谷 P4178 Tree

题链 首先点分治; 由于求解的是小于等于k的个数,于是开一个树状数组维护前缀和即可; #include<bits/stdc++.h> using namespace std; #define LL long long #define MAXN 20009 #define MS 40009 int n,m; struct node{ int to,val; }; vector<node > vc[MS]; int sz[MS],w[MS]; i

P4178 Tree(点分治+树状数组/容斥)

https://www.luogu.com.cn/problem/P4178 思路: 对u遍历每一棵子树,计算出dis,并询问前面子树有多少个点深度小于等于k−d[i] ,查询有多少值<=k-d[i]的,树状数组就好了。询问结束后把这个子树的答案累加进数组。遍历完所有子树后清空当前u的所有子树答案。注意是Dfs清空。 点分治后

P4178 Tree(点分治+容斥)

传送门 先点分值,求重心分治下去 然后考虑如何计算点 u u u的贡献 首先我们暴力计算出 u u u子树中到

P4178 Tree

P4178 Tree 题目描述 给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量。 输入格式 第一行输入一个整数 n,表示节点个数。 第二行到第 n 行每行输入三个整数 u,v,w ,表示 u 与 v 有一条边,边权是 w。 第 n+1 行一个整数 k 。 输出格式 一行一个整数,表示答案

P4178 Tree 点分治

     统计路径只管统计所有的即可 不用考虑减   可以用双指针统计!!! 也可用二分 麻烦一些 也更加满一些 #include<bits/stdc++.h>using namespace std;#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define repp(i,a,b) for(int i=(a);i>=(b);--i)#define ll long long#defin

【P4178】Tree——点分治

(题面来自luogu) 题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入格式 N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k 输出格式 一行,有多少对点之间的距离小于等于k     原本是点分治的模版题,从昨晚调到今晚……这

洛谷P4178 Tree

考虑点分治,对于一个子树,求出每个点到根的距离并排序,用双指针扫描,但这样会把来自同一个儿子的路径也统计上去,再对每个儿子做一遍,减去即可。   #include<cstdio>#include<cstring>#include<algorithm>#include<queue>using namespace std;typedef long long ll;const int N=40005;