点分治模板理解

点分治:类比序列分治。
N^2枚举:扫了很多重复部分。
分治:共用重复部分,减少信息收集冗余。
log思想进行划分。
单次操作:序列分治:中间点。点分治:树上的节点。
点分治不仅要减少信息收集冗余,还要减少同一信息处理次数。
例如对一个点,不分治会扫n次,分治是log次。
就是一条链/绳,从头到尾剪,不如从中间剪缩短的快。(信息收集量规模减少快)

原文地址:https://www.cnblogs.com/seamtn/p/11498540.html

时间: 2024-07-31 22:26:59

点分治模板理解的相关文章

POJ 1741 树分治(点分治模板题)

POJ 1741 题意:求一棵树中点对<=k的数量. 总结:点分治,搞不太懂..大概敲了一遍 #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<queue> #include<stac

关于点分治的理解

[引言] 由于树具有一般的图没有的特点,所以在竞赛中的应用更广. 在一些树上路径问题中,暴力求解时间复杂度过高,往往需要一些更为高效的算法,点分治就是其中之一. [流程] 1.首先选取一个点,把无根树变成有根树. 那么如何选点呢?    ——树型动规 因为树是递归定义的,所以我们当然希望递归的层数最小. 每次选取的点,要保证与此点相连的结点数最多的连通块的结点数最小,我们把这个点叫做“重心”. 那么找到一颗树的重心有以下算法: (1)dfs一次,算出以每个点为根的子树大小. (2)记录以每个结点

【POJ1741】Tree 树分治 模板咯?

广告: #include <stdio.h> int main() { puts("转载请注明出处[vmurder]谢谢"); puts("网址:blog.csdn.net/vmurder/article/details/44302921"); } 题意: 给你一棵无根树,求有多少点对之间距离<=K. 题解: 树分治. 然后对于一个重心X,我们把它的所有子树中的所有点存到结构体数组中. 结构体中存距离和子树编号. 第一遍sort,我们双指针扫哪些点

bzoj 2152 聪聪可可(点分治模板)

2152: 聪聪可可 Time Limit: 3 Sec  Memory Limit: 259 MBSubmit: 3194  Solved: 1647[Submit][Status][Discuss] Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一般情况下石头剪刀布就好了,可是他们已经玩儿腻了这种低智商的游戏.他们的爸爸快被他们的争吵烦死了,所以他发明了一个新游戏

【Luogu】P3806点分治模板(点分治)

题目链接 wc听不懂lca讲的高等数学专场(一个字都听不懂),然后就自学了点分治. 点分治就是我先处理完跟根有关的东西,然后把根标记掉,把原树拆成若干个联通块,然后分别对每个联通块(每个小树)搞一模一样的操作. 然后要每次求重心,因为点分治复杂度跟递归深度有关. 本题判断的时候偷懒用map,其实自己写的splay也快不到哪里去的样子.qwq. #include<cstdio> #include<algorithm> #include<cstring> #include&

洛谷 P3810 【模板】三维偏序(陌上花开) (cdq分治模板)

在solve(L,R)中,需要先分治solve两个子区间,再计算左边区间修改对右边区间询问的贡献. 注意,计算额外的贡献时,两子区间各自内部的顺序变得不再重要(不管怎么样左边区间的都发生在右边之前),于是就少了一维 https://www.lydsy.com/JudgeOnline/problem.php?id=3262 https://www.luogu.org/problemnew/show/P3810 此题每个操作既是修改又是查询 对于此题,先按一维排序,在solve(L,R)中先solv

POJ - 1741 - Tree - 点分治 模板

POJ-1741 题意: 对于带权的一棵树,求树中距离不超过k的点的对数. 思路: 点分治的裸题. 将这棵树分成很多小的树,分治求解. #include <algorithm> #include <iterator> #include <iostream> #include <cstring> #include <cstdlib> #include <iomanip> #include <bitset> #include

点分治模板题

https://www.luogu.org/problem/P3806 #include<bits/stdc++.h> using namespace std; const int maxn=2e4+10; int head[maxn],ver[maxn],nxt[maxn],edge[maxn]; int tot; int vis[maxn]; // 分治时用来标记哪个重心已经使用过 int ans,size[maxn],root,sum; // 求重心时使用,ans记录目前标记重心最小子树

bzoj 1468 Tree(点分治模板)

1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1527  Solved: 818[Submit][Status][Discuss] Description 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K Input N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下来是k Output 一行,有多少对点之间的距离小于等于k Sample Input 7 1 6 13 6