[笔记] 易错点集合
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来表示,那是作死....