脑残错误大合集
无他,只是发现自己最近因为脑残导致的错误实在太多,遂怒撰
不过发现装修好博客之后确实更爱写文章了,怎么回事呢。。。
一、long long类型:
1、声明
首先,能define int long long的就尽量开一下。
我目前没有因为这个爆过空间,但还是在此羡慕一下能用vscode的小伙伴们,可以直接看空间。
但不开long long有时候不会WA而是会TLE,怎么回事呢。。。
更离谱的,把所有变量全声明成ll,TLE;define int long long,AC
what the …… ?
2、使用
声明了long long 之后一定要记得用 %lld 读入输出,要不然和没开没有区别,我目前因为这个爆过很多次零了。而且直接把“d”define成“lld”是不行的,怎么回事呢。。。
3、调试
如果在调题的时候发现老是输出很大很长奇奇怪怪的数,考虑是不是用%lld输出却没有define int long long。
“谎报军情,拖出去斩了” —— ACLove
二、输出格式
1、换行
写\n啊啊啊!我爆过很多次零也是因为这个。
“你就说你整篇代码能不能凑出一个\n”“你就说这道题爆零了是不是你的问题” ——ACLove。
2、有的题会加一些奇奇怪怪的限制条件,对输出的格式有不一般的要求,要仔细看好。
三、代码细节
主要就是最近学的新东西,板子老是敲错然后怎么调都调不出来
1、kruskal:注意什么时候用边m,什么时候用点n。
void kruskal() {
sort(e + 1, e + m + 1, cmp);//排序从一到m
for (int i = 1; i <= n; i++) fa[i] = i;//并查集初始化是从一到n
for (int i = 1; i <= m; i++) {//枚举从一到m
int r1 = find(e[i].x);
int r2 = find(e[i].y);
if (r1 == r2)
continue;
fa[r1] = r2;
ans += e[i].z;
tot = max(tot, e[i].z);
cnt++;
if (cnt == n - 1)
break;
}
}
2、树状数组:
void add(int x, int y) {
for (int i = x; i <= n; i += lowbit(i)) {
c1[i] += y;
c2[i] += y * x; //注意这里是乘x,我老是写成乘i,怎么回事呢。。。
}
}
并查集(虽然不是新东西了但还是老写错,怎么回事呢。。。)
int find(int x){
return fa[x] == x ? fa[x] : fa[x] = find(fa[x]); //要写路径压缩
}
trie树的cnt要初始化为1
如果初始为零,会导致能过样例以及能过你自己手搓的小样例,但交上去就爆零
二分图要开二倍空间!!!
四、其他细节
1、如果有多组测试数据,记得每次要memset初始化
2、链前建双向边要开二倍空间!
3、虽然很脑残,但边数是m不是n……
4、1ll * (1 << i)(错误) ;(1ll << i) (正确)。
五、undefined behavour
1、如果一个布尔函数出现了在某个情况下既没有规定返回1也没有规定返回0的情况(例如:if(某条件) retrun 1,但没写 else return 0),会返回一些未知的东西,会产生很大影响。
2、数组越界有时候不会re而是会wa。
例如:如果声明了一个 f[N],初始化的时候从1循环到N进行初始化,就可能会出问题。。。
3、多测清空