![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
点分治
文章平均质量分 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 · 120 阅读 · 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 · 149 阅读 · 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 · 150 阅读 · 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 · 606 阅读 · 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 · 157 阅读 · 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 · 66 阅读 · 0 评论