树链剖分 模板

关于树链剖分

模板:

 1 const int MAXN = 20010;
 2 struct Edge
 3 {
 4     int to,next;
 5 } edge[MAXN*2];
 6 int head[MAXN],tot;
 7
 8 int top[MAXN];//top[v]表示v所在的重链的顶端节点
 9 int fa[MAXN]; //父亲节点
10 int deep[MAXN];//深度
11 int num[MAXN];//num[v]表示以v为根的子树的节点数
12 int p[MAXN];//p[v]表示v与其父亲节点的连边在线段树中的位置
13 int fp[MAXN];//和p数组相反
14 int son[MAXN];//重儿子
15 int pos;
16
17 int n;
18
19 void init()
20 {
21     tot = 0;
22     memset(head,-1,sizeof(head));
23     pos = 1;//序号其实是从1开始?
24     memset(son,-1,sizeof(son));
25 }
26 void addedge(int u,int v)
27 {
28     edge[tot].to = v;
29     edge[tot].next = head[u];
30     head[u] = tot++;
31 }
32 void dfs1(int u,int pre,int d) //第一遍dfs求出fa,deep,num,son
33 {
34     deep[u] = d;
35     fa[u] = pre;
36     num[u] = 1;
37     for(int i = head[u]; i != -1; i = edge[i].next)
38     {
39         int v = edge[i].to;
40         //因为路径是双向的,所以不能等于父及诶单
41         if(v != pre)
42         {
43             //先递归地找到儿子节点的深度,父节点,子节点数目等信息
44             dfs1(v,u,d+1);
45             //更新u节点的儿子数目
46             num[u] += num[v];
47             if(son[u] == -1 || num[v] > num[son[u]])//求出重儿子
48                 son[u] = v;
49         }
50     }
51 }
52
53 //因为对于轻儿子来说,top[u]=u,对于重儿子来说,如果son[v]!=-1,那么top[v]=top[son[v]]
54 void getpos(int u,int sp) //第二遍dfs求出top和p
55 {
56     top[u] = sp;
57     //先找重儿子
58     if(son[u] != -1)
59     {
60         //把边的位置标记一下
61         p[u] = pos++;
62         //fp相当于是p的反函数?
63         fp[p[u]] = u;
64         //更新重儿子
65         getpos(son[u],sp);
66     }
67     //如果到了叶子节点
68     else
69     {
70         //不再向下dfs
71         p[u] = pos++;
72         fp[p[u]] = u;
73         return;
74     }
75     //更新其他的节点
76     for(int i = head[u] ; i != -1; i = edge[i].next)
77     {
78         int v = edge[i].to;
79         if(v != son[u] && v != fa[u])
80             getpos(v,v);
81     }
82 }
时间: 2024-10-13 23:41:58

树链剖分 模板的相关文章

HDU 3966 Aragorn's Story(树链剖分 模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3966 Problem Description Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who want to invade his kingdom. As Aragorn knows, th

bzoj 1036 [ZJOI2008]树的统计Count 树链剖分模板

1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 18615  Solved: 7598[Submit][Status][Discuss] Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I

BZOJ 2243 染色 | 树链剖分模板题进阶版

BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上还是原树上,把两个区间的信息合并的时候,要注意中间相邻两个颜色是否相同. 这代码好长啊啊啊啊 幸好一次过了不然我估计永远也De不出来 #include <cstdio> #include <cstring> #include <algorithm> using namesp

树链剖分模板+入门题 SPOJ - QTREE

题目链接:[点击进入](http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=13013) 树链剖分并不是一个复杂的算法或者数据结构,只是能把一棵树拆成链来处理而已,换一种说法,树链剖分只是xxx数据结构/算法在树上的推广,或者说,树链剖分只是把树hash到了几段连续的区间上.比如说下面这道题,就是将树分为重链和轻链然后映射到线段树上,然后再在线段树上进行查询和修改等操作.所以树链剖分的重点有两个,一是正确的将树分解成几段并映射到

bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题

[ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I II. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 Input 输入的第一行为一个整数n,表示节点的个数.接下来n – 1行,每行

树链剖分[模板](洛谷 P3384)

洛谷·[模板]树链剖分 写在前面 首先,在学树链剖分之前最好先把 LCA.树形DP.DFS序 这三个知识点学了 如果这三个知识点没掌握好的话,树链剖分难以理解也是当然的. 树链剖分 树链剖分 就是对一棵树分成几条链,把树形变为线性,减少处理难度 概念 dfs1() dfs2() 对剖过后的树建线段树 处理问题 概念 重儿子:对于每一个非叶子节点,它的儿子中 儿子数量最多的那一个儿子 为该节点的重儿子 轻儿子:对于每一个非叶子节点,它的儿子中 非重儿子 的剩下所有儿子即为轻儿子 叶子节点没有重儿子

树链剖分模板

1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <cmath> 5 #include <algorithm> 6 #include <cstring> 7 #include <stack> 8 #include <cctype> 9 #include <queue> 10 #include <s

【树链剖分模板】【SPOJ 375】 Query on a tree

375. Query on a tree Problem code: QTREE You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. We will ask you to perfrom some instructions of the following form: CHANGE i ti : change the cost of

spoj Query on a tree(树链剖分模板题)

375. Query on a tree Problem code: QTREE You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. We will ask you to perfrom some instructions of the following form: CHANGE i ti : change the cost of