一些蛇皮的错误总集(持续更新)
# 这篇博客用于记录一些我遇到过的玄学问题.
- double类型用memset会出稀奇,最好手动赋值.
- 输出的时候要换行,不然可能卡到什么奇怪的读入文件缓冲区的地方.
- 数组要稍微开大一点,有时候数组越界不会报错而是会访问到一个奇怪的内存地址.
- splay中查第k小时要先减k的值再赋值node ↓(错误示范)
- 位运算的优先级非常低,不确定运算顺序的时候一定要打括号!!!
- 用线段树记录一些东西可能导致越界时要特判(记录差分数组之类的)
- 似乎函数没打括号/要调用函数的时候没打函数名不会报错(??)
- 做DP的时候赋初始值要想清楚所有能从初始值转移的状态(多维DP赋值的时候不要漏了)
- 在写无旋treap的时候如果没有用#define 定义子树编号,就要手写一下了... ↓(错误示范)
- 在清空数组用memset的时候要注意,是要直接清空整个数组还是清空数组中的某一维.
- 对于一些奇怪的模数形如\(2^{8*sizeof(type)}\)的,比如2^32(一个int类型占4个字节), 2^64(一个long long类型占8个字节) ,可以使用unsigned 类型来进行自动取模(即溢出后直接保留模数内部分)
- 排序后的下标会改变,在调用结构体内变量时要注意是否调用的正确.
- 在一边赋值一边判断的时候要注意运算优先级.
- 在运算的时候保存变量并判断需要大括号防止优先级判断出问题.(错误示范)↓
temp = check(x) > lim
- dijkstra在堆优化的时候不要把priority_queue写成queue了(捂脸qaq)
- 在写线段树的时候不要自己写#\(define\) \(max/min\),这样会在递归的时候反复调用,然后被卡时间.
- 开数组要自己多算几遍,别平时怎么开就怎么开,注意别开小了(其实如果空间够的话也可以开个两倍什么的)特别是差分约束系统中建立虚边的时候空间可能会不够.
- 考试上写完了代码一定要出一两组自己觉得可能有问题的小数据试一下,或者是造一组极限数据检查一下边界什么的
- 如果用结构体作为map的下标一定要重载运算符保证每一个都是不同的,不然会出玄学问题.
- 读入优化,cin和关闭流同步不要同时用,不然可能会出奇怪的读入问题.
- 记忆化搜索在返回不合法方案的时候最好是用一个方案中不会出现的值来判断,否则可能导致重复搜索.
- 在考试交代码之前一定要把样例在过一遍,不要把调试信息忘了.....(我傻傻的因此考试某题爆零...)
- 在用树状数组做题的时候一定要注意是否会访问到\(0\)的下标,如果有一定要将所有的操作都+1,否则在处理lowbit(0)的时候会卡死循环(lowbit(0) == 0)
- 在将一个矩形/线段拆成线段/点的时候最好不要写a[++cnt]=.....,因为这样赋值会先计算右边,然后导致赋值和预想结果不一样
- 构造矩阵的时候不要什么东西都往里面放!!!把要用的变量放进来就够了!!!
- 在将一个数组a和一个指针b做memcpy的时候,应该要写sizeof(数组的变量名),如memcpy(a, b, sizeof(a))