点分治
文章平均质量分 52
Jozky86
这个作者很懒,什么都没留下…
展开
-
P2634 [国家集训队]聪聪可可(点分治做法)
P2634 [国家集训队]聪聪可可 题意: 一颗n个点的树,问其中两点之间的边上数的和加起来是3的倍数的点对有多少个? 输出这样的点对所占比例 题解: 因为是求三的倍数,我们num来记录%3=0,1,2的数量,对于u得到的d[],累加num[3-d[]]的数量。 其实就是常规的点分治模板 代码: #include <bits/stdc++.h> #include <unordered_map> #define debug(a, b) printf("%s = %d\n", a, b)原创 2021-08-19 15:16:33 · 139 阅读 · 0 评论 -
P4149 [IOI2011]Race
P4149 [IOI2011]Race 题意: 给一棵树,每条边有权。求一条简单路径,权值和等于 k,且边的数量最小。 题解: 用t[i]:长度为i的路径包含的最少边数 按照子树顺序,依次用dep[u]+t[K-d[u]]更新ans,更新t数组,最后遍历子树恢复t数组 代码: 85分代码,不知道哪错了 //#pragma optimize("Ofast") #include <bits/stdc++.h> #define MAXN 4000005 #define MAXK 10000007 #d原创 2021-08-18 22:01:47 · 176 阅读 · 0 评论 -
Acwing 252. 树
Acwing 252. 树 题意: 给定一个有 N 个点(编号 0,1,…,N−1)的树,每条边都有一个权值(不超过 1000)。 树上两个节点 x 与 y 之间的路径长度就是路径上各条边的权值之和。 求长度不超过 K 的路径有多少条。 1≤N≤104, 1≤K≤5×106, 0≤l≤103 题解: P4178 Tree,和这个题题意是一样的,但是本题的数据范围更大,本题k<=5e6,且空间只给了10MB,树状数组的方法是不行,需要用容斥 我们cal直接记录以u为出发点的所有路径长度,用数组d来存,对原创 2021-08-18 20:07:47 · 169 阅读 · 0 评论 -
点分治(树分治)
介绍: 将原问题分解成若干相同形式,相互独立的子问题,各个击破 一般用来解决有关树上路径的统计和询问 题目: P4178 Tree 给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量。 做法: 暴力做法;(O(n2)) 点分治做法: 选择一个点作为分治中心,令其为rt做dfs。对于一条路径path(u,v),其要么经过rt(即lca(u,v) = = rt),要么在某个子树sub(son[rt])中 把问题形式化为: solve(T,rt) = 统计T树中经过rt且长度<原创 2020-10-22 16:55:45 · 743 阅读 · 5 评论 -
P3806 【模板】点分治1
模板题 P3806 【模板】点分治1 题目描述 给定一棵有 n 个点的树,询问树上距离为 k 的点对是否存在。 详讲 关于点分治具体内容可以看这个 这里主要是详细讲讲代码: getrt是用来求重心,我们利用树型dp的思维来做,即找到该节点所有的子树,找到最大的哪一颗即可 void getrt(int u,int pa)//求重心 { size[u]=1; maxp[u]=0; for(int i=head[u];i;i=E[i].nxt) { int v=E[i]原创 2020-10-22 17:20:33 · 188 阅读 · 0 评论 -
P4178 Tree
P4178 Tree 题意: 给定一棵 n 个节点的树,每条边有边权,求出树上两点距离小于等于 k 的点对数量。 题解: 点分治的模板题是求等于K的路径条数 本题是求小于等于K的路径条数,我们只需要改变统计答案即可 原本统计答案是对一个路劲长度len,判断K-len在之前的子树中出现多少次,用f数组来记录,直接查看f[k-len]等于多少即可 现在统计答案是对一个路径长度len,判断小于等于K-len的数在之前的子树中出现多少次,统计区间数量,我们可以用树状数组来实现,对于每个len我们插入数组f[]其中,原创 2021-02-23 00:04:18 · 83 阅读 · 0 评论
分享