-----数据结构(data structure)-----
TouchDreamer
这个作者很懒,什么都没留下…
展开
-
点分治入门
重心分解(Centroid Decomposition) 首先要找到树的中心,树的重心的定义是:删除该中心结点得到的最大子树的顶点数最少的顶点就是树的重心。运用dfs的方法很容易实现,代码为: void get_hvy(int u, int fa){ siz[u] = 1, maxx[u] = 0; for(int i = head[u]; i != -1; i = e[i].ne...原创 2019-10-23 16:37:19 · 378 阅读 · 0 评论 -
SPOJ 375 Query on a tree(树链剖分)
题目分析 本题主要是修改树上线的cost值,还有询问2点之间的最大的cost.因为本题数据量大,并且修改和查询次数多,因此我们需要使用线段树进行操作。因此我们需要对树进行剖分,并将每个点对应的线段进行更新即可,根节点没有对应线段,因为n个节点的树只有n-1条边,因此统一将线段与连接2端的深度较大的点对应。至于树链剖分的理解有一个很不错的博客博客地址,多看看配合在草纸上画出对应图形就能正确理解了。原创 2016-07-28 13:15:36 · 294 阅读 · 0 评论 -
HDU 3966 Aragorn's Story
题目分析 树链剖分基础题。2种操作:第一种:询问节点C的敌人数。另一种为改变a到b的路径上所有节点的敌人数。 #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int原创 2016-07-28 18:59:29 · 194 阅读 · 0 评论 -
POJ 2763 Housewife Wind
题目分析 题目很水,理解了很简单,就是套模板。 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 100005; #define mid (L+R)/2 #define lson o<<1, L, mid #defi原创 2016-07-28 19:01:57 · 226 阅读 · 0 评论 -
HDU 5458 Stability (2015 ACM/ICPC Asia Regional Shenyang Online)
题目分析 这道题真的不是很好写,树链剖分本来就是个很恶心的东西,这个程序里面还要倒着来,调bug调了一上午发现自己的while写成了if。整个人都不好了,不过也还好,才一上午。树链剖分可以处理2点之间路径上的一些东西,而且速度很快,本题也不例外,同样是处理这些东西。因为最初给你一些边,但是这些边组成的图可能不是一棵树因此没有办法做树链剖分,很明显我们要想办法将图转化为树,这道题我们首先将所有边塞原创 2016-07-29 14:07:33 · 353 阅读 · 0 评论 -
HDU 5221 Occupation(树链剖分)
题目分析 很明显这道题是一道树链剖分的题目,这个中间用线段树处理的让我感觉老是很怪异!!可能没有这样处理过线段树吧!对于第一种操作,很明显就是树链剖分的简单处理,对于第二种操作只需要更改相对应线段树中的值就可以了,对于第三种由于轻重链剖分对于每棵子树上的东西都需要处理,但是每棵子树上所有节点所在的区间是连续的,因此转化为了线段树的区间更新,其他的都不难写了。还有一点我们用w[]表示树中的节点在线原创 2016-07-30 13:08:55 · 214 阅读 · 0 评论 -
HDU 4578 Transformation(最恶心的线段树)
题目分析 这道题首先可以发现第三种操作和第二种操作都是很简单的,这里我就不多说了,但是对于加操作就有点需要特殊处理了(a+b)3=a3+3a2b+3ab2+b3(a+b)^3 = a^3+3a^2b+3ab^2+b^3很明显这样就可以推出来了,因为a3,a2,aa^3,a^2,a都是已知的,因此可以处理了,注意先处理(a+b)3(a+b)^3然后处理(a+b)2(a+b)^2再处理(a+b)(a原创 2016-11-03 18:21:20 · 236 阅读 · 0 评论 -
树状数组入门之POJ 2352 Star
树状数组BIT(Binary index tree) 对于树状数组而要我们可以发现树状数组的那个图就是线段树的去掉所有右孩子节点得到的,因此树状数组相当于在线段树上做了一个优化,相当于去掉了一个常数,并且空间上也进行了优化,线段树通常需要比原来大小开4倍,但是树状数组就不用,但是树状数组只提供2种操作,一个就是询问1到x的所有数的和,另一个就是对单点进行更新,其他操作较为复杂。 操作一int s原创 2016-11-04 10:53:54 · 228 阅读 · 0 评论 -
二叉树各种递归非递归层次遍历
二叉树结构体typedef struct BitNode{ char data; struct BitNode *lchild, *rchild; BitNode(){ lchild = rchild = NULL; } }BitNode, *BiTree; 注意这里面的下方的BitNode代表(struct BitNode),BiTree代表(s原创 2017-09-17 23:07:17 · 331 阅读 · 0 评论