数据结构细节集散地
emmmm。。。数据结构的大码量经常死在一些小错误上(比如一个字母,等号),然后导致一查查半年。这里汇总一下错误吧。
1、线段树操作进行二分操作时,mid用的是当前块的左右区间(t[p].l),不是查询区间的lr,错过几次
2、树剖中,(好吧其实还是线段树),向下递归,第二个判断区间相交的if不能用else代替。
if(mid>=l)
res+=ask(l,r,t[p].ls);
if(mid<r)
res+=ask(l,r,t[p].rs);
3、树剖的计数器很烦。。。根节点是0(坑惨了),然后的计数(build里)从1开始,然后建树的时候计数器++(或者直接++计数器)。。。
t[x].ls=++num;
t[x].rs=++num(num=0);
num=1;
t[x].ls=num++;
t[x].rs=num++;
4、记得当年翟哥因为把“==”打成“=”整整改了三天
5、l和r的分治一定要打完一行检查一行,要不然能查死掉
6、区间长度,左区间mid-l+1,右区间没有+1(可能是计算机int型的计算机制吧)
7、注意预处理(可以暴力预处理的话可能能省很多事)
8、活用STL
9、倍增求LCA中,处理fa数组的时候,外循环是logn范围(1~30),内循环1~n,如果反了会炸裂
10、树的直径:从树任意一个点开始,dfs一次求出最长链,从最长链端在此dfs,求最长链,此时链长就是直径。
11、单调队列中的元素其对应在原来的列表中的顺序必须是单调递增的。所以可以直接pop掉过时的元素
12、树剖中,对链的查询,一次只动一个点,查它的总和,是用dfs序更新。(着重注意dfsn的顺序)
int q_s(int x,int y) { int res=0; while(top[x]!=top[y]) { if(dep[top[x]]<dep[top[y]]) swap(x,y); res+=ask_s(dfsn[top[x]],dfsn[x],1); x=fa[top[x]]; } if(dep[x]<dep[y]) swap(x,y); res+=ask_s(dfsn[y],dfsn[x],1); return res; }
13、变量名万万不能混用(树剖出过锅,这最近又出锅了)
14、并查集一定要初始化并查集一定要初始化并查集一定要初始化并查集一定要初始化并查集一定要初始化并查集一定要初始化并查集一定要初始化