树链剖分小结
入门的话,这篇还是写的不错的:http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html
个人认为,其实树链剖分并不是一个复杂的算法或者数据结构,只是能把一棵树拆成链来处理而已,换一种说法,树链剖分只是xxx数据结构/算法在树上的推广,或者说,树链剖分只是把树hash到了几段连续的区间上。
因为这东西本身没有功能,具体功能都是靠具体数据结构实现的,所以复杂度就是O(logn * ??)
。如果套上了线段树,就是 O(log^2 n)
。如果套上了树套树,那就是O(log^3 n)
。如果你用树链剖分和树套树写区间第k大,那就是O(log^4 n)
。
另外,树链剖分具体实现的时候是给边重新编号还是给点重新编号,这得根据不同的题目而定,实现的时候要注意顶端那个编号能不能取。
对了,这东西可以顺便求LCA。比如说基于点的剖分,就是剖分到两个点都到同一条重链的时候,比较上端的那个点。
下面是一些例题:
SPOJ375 QTREE 基于边的重编号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
|
bzoj1036 基于点的重编号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
|
bzoj1146 树上第k大 LCA
这是唯一一题LCT
无法做但是树链剖分可做的题目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
|
bzoj2243 树上颜色统计
见http://oi.abcdabcd987.com/bzoj2243
为什么是HLD
因为树链剖分高端洋气的英文名叫做: Heavy-Light Decomposition