[笔记] 易错点集合

1.cena里不能用bits/stdc++.h..... 当然正式考试也不行....
2.不要弄反#ifdef 和 #ifndef .....
3.取模优化原本是这么写的
if(x>=mod) x-=mod;
实际上要这么写:
while(x>=mod) x-=mod;
然后我也不知道有没有起到优化的作用 .....
4.考虑方案选择数相关dp问题时(比如组合数),0有关状态算不算一个方案(比如选0个)
5.乘法可能会爆int的情况下,使用如下代码:
1ll*a*b; (a,b>=1000,000,000)
6.define时若胡乱操作会出问题比如:
#define ml(x) 1<<x
而正确操作如下:
#define ml(x) (1<<(x))
以及等等一些错误操作。

7.高精度计算时注意值为0情况,不能有-0或者长度为0(不输出)的这种智熄操作出现
8.线段树要开4倍原数组大小,树链剖分时不要太吝惜内存,仔细分析数组边界情况和内存使用情况,避免RE/MLE
9.ST表时请注意两重循环的时候

    for(j=1 to 20)
        for(i=1 to n) -> 这重循环,请加上i+(1<<(j-1))<=n的判断,避免越界

10.打完暴力看看搜索是否有后效性,参数是否简洁;考虑记忆化搜索有大机率变成正解
11.涉及位运算和逻辑表达式计算请打上括号.....
12.时间复杂度的考虑上,「先考虑线性」、再才考虑贪心、倍增、最后再考虑数据结构等一系列骚操作......
13.dp滚动数组优化时,请确定把滚动数组清干净.....
14.作这种比较时:
if(a[i]==a[i+1]) ...
请注意i+1有没有越界....

以上是个人不怎么犯的错误
下面是正片

1.请注意题目求的是最大值还是最小值

2.dp无从下手的时候,试着把题目要枚举的条件变为已知放入状态中

3.dp时一定要初始化!!尤其是不可能出现的状态,一定要注意!!

4.dp时初始化好了真的是可以为所欲为的

5.没有这种操作:a+b>a'+b' => a+sqrt(b)>a'+sqrt(b')

6.当要对某个巨大数组清空时,尝试将“全部清空”改为“清空自己需要清空的元素”,可能会使效率提升。

7.若a和b都已对k取模,此时(a-b)%k的值可能低于0。若要大于0则改为(a-b+k)%k,但同时应该注意运算溢出的情况。

8.常数玄学:在函数内进行操作,并且函数的调用过程中参数含缩窄转换,可能会造成巨大常数。如定义变量long long a;,使用函数void fun(int x){ ... },进行如下的调用:fun(a);——实测1e5数据范围下产生的效率差距超过4倍

9.floyd请一定要弄清楚是f[i][i]=0,还是f[i][i]=INF建议忽略松弛中有点相同的情况.....

10.对于非常规最短路问题,建议先考虑使用什么算法,再考虑要不要建图。不少题目直接对算法进行活用,而不需要多余的建图过程。例题:LuoguP1875,LuoguP1119

11.st表初始化的边界问题....

for(int j=1;j<20;j++)
    for(int i=1;i+(1<<j)-1<=n;i++)
        { ... }

12.维护两个滑动窗口单调队列时,请注意数组绝对不要弄混。比如更新B队列时更新了A队列的pos.....

13.清空邻接表时,重置head、next数组和目前指针p
memset(head,0,sizeof(head)), memset(next,0,sizeof(next)), p=1

14.打ISAP时,找相邻点的层次最小值,请一定判断该点的层次最小值是不是变成了-1......

15.关闭ios同步之后请 一定 不要用scanf,否则会出现段错误/诡异输出等玄学错误....

16.犯了如下的窒息操作:

int n;
const int s=1,t=n;

正确操作:

int n,s,t;
 ...
int main() {
    cin>>n;
    s=1,t=n;
    ...
}

17.Treap/SBT:cnt++后记得updata(x)啊.... 插入后记得rotate啊.....

18.坐标类变量,不要用i/j来表示,那是作死....

posted @ 2017-11-01 14:37  NagaseIori  阅读(227)  评论(2编辑  收藏  举报