Shq's zz 错误汇总

这里就是 Shq 在敲代码的时候犯的一些 zz 错误

没加 mutable

这个是一个简单的 ODT (从 yijan 大爷那里学的

(这里只粘出锅的代码了(

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
struct Node{
int l, r;
// mutable int key;
int key; // wrong

Node(int l, int r = -1, int key = 0) : l(l), r(r), key(key) {}

bool operator < (const Node & x) const {
return x.l > l;
}
};

void reverse (int l, int r) {
std::set<Node>::iterator R = split(r + 1), L = split(l);
for(; L != R; ++ L) L->key ^= 1;
}

然后

img

??? 黑人问号

发现自己没加 mutable 关键字( 顺便赶紧学习了一波 mutable 的用法 (

交错语言

在快乐使用 python 爆掉几个高精题之后没有切换语言,递交 C++ 代码导致 CE

在比赛即将结束时容易自闭

== 与 =

  1. 并查集初始化
1
for (int i = 1; i <= len; i++) siz[fa[i] == i] = 1;
  1. if 语句判读相等
1
if (x = 1) return 1;

忘记取模

  1. 错排没有取模
1
for (int i = 3; i <= len; i++) F[i] = (i - 1) * (F[i - 1] + F[i - 2]);
  1. 阶乘没有取模
1
for (int i = 2; i <= len; i++) fac[i] = fac[i - 1] * i;

输出负数自闭..

忘记调用初始化

将初始化各种结构的代码放在 init(args) 中,然后忘了调用 init(args);

常见于各种 dp,并查集,数论代码中

初始化不完全

  1. 错排没有只初始化了 D[1]D[2] 然后算 D[0] 就自闭
  2. 在函数中定义一个变量不赋初值可能会是奇怪的数字,尤其是在主程序中定义了一个没有写构造函数的结构体

数组开小

  1. ZR比赛数组开小........当场暴毙
  2. 暴力倍增线性基被卡空间

提交代码没删调试

调代码的时候在代码中留下了一堆 printf 调试信息.......提交的时候没删或者少删就直接自闭

比较好的办法就是在交代码之前测一下样例或者使用其他方式调试

倒序循环与 i++

  1. 乘法逆元
1
for (int i = len - 1; i >= 2; i++) inv[i] = ((i + 1) * inv[i + 1]) % MOD;

⑧说了,康代码吧.....令人智熄

错误使用 unordered_map

下方代码第十行中的 hash[t] 应改为 hash.count(t)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 比赛过世
std::unordered_map<ll, ll> hash;
ll BSGS(ll a, ll b, ll mod) {
if (a % mod == 0) return -1;
if (b % mod == 1) return 0;
a %= mod, b %= mod;
hash.clear();
ll q = ceil(sqrt(mod));
for (ll i = 0, t = b; i <= q; i++, t = (t * a) % mod) hash[t] = i;
for (ll i = 1, f = pow(a, q, mod), t = f; i <= q; i++, t = (t * f) % mod)
if (hash[t]) return i * q - hash[t];
return -1;
}
/* C++11 */

最短路没有注意范围

同余最短路题目中 dist 数组初始化时过小

1
2
3
4
5
6
inline void init () {
for (int i = 0; i < x; i++) {
node[i].dist = 0x3f3f3f;
node[i].used = false;
}
}

高维数组传参没有传范围

显然下面是错的:

1
void times (int **t, const int **y);

这两个也是错的:

1
2
void times (int *t[], const int *y[]);
void times (int t[][], const int y[][]);

这个才是对的:

1
void times (int t[N][N], const int y[N][N]);

大概是 n 维数组传参要固定后 n-1 维的大小,便于寻址

模数写错

10^9+7 998244353

虚树不清空

虚树不清空 爆零两行泪

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void dfs3 (int u) {
if (siz[u])
for (auto i : e[u]) {
dfs3(i);
if (siz[i]) siz[i] = 0, ans++;
}
else {
for (auto i : e[u]) {
dfs3(i);
siz[u] += siz[i], siz[i] = 0;
}
if (siz[u] > 0) siz[u] = 0, ans++;
}
e[u].clear();
}
坚持原创技术分享,您的支持将鼓励我继续创作!