树上操作
zjyang12345
Keep calm&carry on
展开
-
LCA--ST表+欧拉序
预备知识:存图的几种方式 链接欧拉序与dfs序区别一.ST表+欧拉序①原理:欧拉序(前序遍历得到的序列,叫dfs序,但数字可以重复出现,一进一出,叫欧拉序),会发现根结点总在中间,而根结点是该段序列深度最小的点因此两个点的LCA,就是在该序列上两个点第一次出现的区间内深度最小的那个点即转化为区间RMQ问题,可以用ST表。当然你可以再写一棵线段树(如果有修改操作)...原创 2019-04-30 09:56:28 · 1105 阅读 · 1 评论 -
树链剖分--化树为线,化线为树
前置技能:LCA线段树/树状数组dfs序树上差分(有些用到,比如求每个LCA落在几条路径上)洛谷日报--差分树形DP(有些用到)参考1(图便于理解数组作用)参考2(讲解更细致)一.原理核心:将无规则的树形结构变成有规律的序列,再用数据结构(线段树,树状数组等)高效维护。如以下功能:update(赋值或四则运算)、query任意两点间路径上的点...原创 2019-05-11 08:54:35 · 241 阅读 · 3 评论 -
POJ 3237 Tree /BZOJ 2157旅游 -- 树链剖分边权处理+取反
类似SPOJ QTREE模板题,还是要注意跳过LCA!!!(因为用最深的点权维护边权,LCA其实是上一个点的边权,不管update还是query)只不过多了个取相反数操作关于区间取相反数,如果是维护区间和,就加个负号;但如果是维护最大值,应该最大值最小值互换。注释部分,表示按位取反如何维护最值(与本题无关)①POJ 3237 Tree#include <stdio...原创 2019-05-17 20:56:40 · 217 阅读 · 0 评论 -
LOJ 147 DFS序+ST表求LCA+树上差分
题目链接理解链接①先用dfs序或欧拉序把树转成区间,因为dfs序是前序遍历,根节点总在前面,而子树结点数,可以dfs时回溯求得,因此dfs序可以轻松维护子树的信息。②然后用树状数组维护每个点到根的距离(通过前缀和求),这题用树状数组因为只涉及区间加减的修改,复杂度常数比线段树小。(但树状数组局限性大,不支持乘除等复杂的修改)③最后如何求两点距离?树上差分(通俗理解,前缀和or子树和...原创 2019-05-11 08:53:12 · 599 阅读 · 0 评论 -
个人赛C 柠檬树2--树链剖分+维护最值出现次数/LCA
给一棵树,维护上面两点最短路径中结点的最大值及最大值出现次数#include <stdio.h>#include<string.h>#include<algorithm>using namespace std;const int maxn = 300010+10;#define inf 1000000005typedef pair<int...原创 2019-05-25 16:51:06 · 189 阅读 · 0 评论 -
春节十二响(树剖)
正解应该是启发式合并#include <stdio.h>#include<string.h>#include<algorithm>#include<iostream>using namespace std;typedef long long ll;const int maxn = 200000+10;#define inf 10...原创 2019-05-31 17:23:41 · 172 阅读 · 0 评论