编程细节总结(不定期更新)

最近总是犯一些奇奇怪怪的小错误,忍无可忍,总结如下(不定期更新,看我的犯错频率了qwq)。

1.线段树初始化尽量将所有参数初始化好(留下个add没初始化,出了问题半天查不出来)。

2.树剖中,两点往上跳时交换两点顺序的条件不是基于两点本身深度的比较,而是基于两点所在链顶点深度的比较(调了三个晚上,看了以前的程序才发现问题)。传送门

3.二分图匹配,如果用网络流解决,记得几个数组都要开n+m大小

4.Treap初始化过程中结点size要初始化为1(不是0);pushup维护size时是左右size之和+1(不是左右size之和,与线段树混淆)。

5.离散化与线段树搭配时,注意线段树下标对应的是离散化后的下标,不要转换两次又回去了(尽管是不容易犯的错误,但是我还是犯了)。传送门

6.用treap维护序列时,如果要O(logn)计算某个结点在treap中的排名,当然要维护每个结点的父亲,如果题目同时要求有翻转操作,那么每次算排名记得先从上至下push_down一次,再向上找到父亲结点。

7.Dijkstra的写法:不要从priority_queue中取出d后再更新dist,而应该塞进去的时候就更新,不然不仅常数大,而且复杂度会有问题:大概从O(mlogm)变成了O(mlog(nm))?几乎翻了个倍。

8.sort函数的cmp函数的写法:int cmp(int x,int y){return x<y;}或者return x-y;反正无论如何不能写return x<=y;!!!原因不是特别清楚,某位大佬说是因为这样没办法定义!=,要么大于要么小于。此外,这样不仅导致TLE,还会RE。

9.图论:如果建图发现一个点只有有限种状态,而且直接建图不方便解决(比如成环不好处理),那么就把每个点拆开建状态图,有时有奇效^_^。传送门

 

posted @ 2017-11-22 23:17  xuzihanllaa  阅读(274)  评论(0编辑  收藏  举报