以后再也不敢了合集

· · 科技·工程

$2025.06.06$ 注:请使用 [链接](https://www.luogu.me/article/sattz11n)。 ### $\tt How\ To\ Discover\ Your\ Mistakes\texttt{(HDYM) Ver-6}$ / 以后再也不敢了合集 1. `#define int long long` 爆 $\color{#052242}\tt TLE$ 爆 $\color{#052242}\tt MLE$ 爆 $\color{#FADB14}\tt CE$。威力:$\color{#FADB14}\texttt{-60pts}$。改正方式:`#define ll long long` 和 `const int N=5e5+10`。 2. 不开 `long long` 见祖宗爆 $\color{#E74C3C}\tt WA$ 威力:$\color{#F1C40F}\texttt{-60pts}$。改正方式:**随时**用数学方法求解,防止爆炸,**不建议**使用 `#define int long long`,有玄学错误,是个 $\tt UB$,还是乖乖写好了,关于 $\tt UB$ 详见第 $30$ 条,然后提高组也有卡过 `unsigned long long`,建议手动特判,详见[大佬](https://www.luogu.com/article/agecnzcb)的文章,还有就是 `#define int long long` 在 $\tt Visual \ Studio $ 直接报错,所以不建议使用。同类问题也收录在这里:**位运算 `1<<k`** 爆 `int`,要改成 **`1ll<<k`**,我们发现这个问题经常在位运算优化中出现。 3. `memset(f,0x7f,sizeof(f))` 爆 $\color{#E74C3C}\tt WA$ 爆 $\color{#052242}\tt TLE$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方式:`memset(f,0x3f,sizeof(f))` 或 `memset(f,1,sizeof(f))`,当 `const int N` 的值过大时,记得**手动赋值**,当**此题多测**时,建议**只对要处理的数进行清空**,比如循环 $1$ 到 $n$,而不是到数组极限,即 `memset`。 4. `double` 数组 `memset` 爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方式:用**循环赋值**。 5. `memset` 之后对数组任意元素进行操作爆 `int` 爆 `long long` 爆 $\color{#E74C3C}\tt WA$。威力:$\color{#F39C11}\texttt{-70pts}$。改正方式:用循环赋值一个**不容易炸的数**,或使用更大的存储数据类型,如高精度、`long long`、`__int128` 等,也可以 `memset(f,1,sizeof(f))` (可能有风险)。 6. 在负数二分中使用 `(l+r)/2` 爆 $\color{#9D3DCF}\tt RE$ 威力:$\color{#F1C40F}\texttt{-60pts}$。改正方式:`(l+r)>>1`。 7. 实数二分**精度**不够,爆 $\color{#E74C3C}\tt WA$ 爆 $\color{#052242}\tt TLE$ 爆 $\color{#9D3DCF}\tt RE$。威力:$\color{#F39C11}\texttt{-70pts}$。改正方式:用**数学方法**验算出最佳 `eps` 值,而**非题目中给定的输出误差**,再使用二分次数判定**防止被 `check` 卡** $\color{#052242}\tt TLE$,同样的,**精度不够**还有这几种情况:`sqrt` 函数精度不够高,建议用 `sqrtl`,`abs` 精度不够高,建议用 `fabs`。 8. 不加**大括号**导致的错误运行爆 $\color{#E74C3C}\tt WA$。威力:$\color{#FADB14}\texttt{-50pts}$。改正方式:加括号,可以试试**改改代码风格**。 9. 动态开点点 `id` 设为 $0$ 爆 $\color{#052242}\tt TLE$。威力:$\color{#FADB14}\texttt{-50pts}$。改正方式:设为 $1$,这个**只能记住**,没啥技巧。 10. 多测不清空爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E67E22}\texttt{-90pts}$。改正方式:清空你的变量,可以监测**每一个变量**,看看有没有一次计算也没有发生就**自带数值**的东西。关于多测:我还有一点提醒:就算读入**中途**得到答案,也要**读入完**,不然完了,下一组数据读入了奇奇怪怪的东西。(还有就是 `memset(a,0,sizeof(b));`) 11. 运算优先级搞错爆 $\color{#E74C3C}\tt WA$,这里比较广泛,有**位运算优先级搞错**的,还有 `#define` **玄学优先级**不加括号的,等等。威力:$\color{#F39C11}\texttt{-70pts}$。改正方式:加括号,运算**优先级**为 `[] a++ a--` $>$ `! ~ ++a --a` $>$ `->* .*` $>$ `* / %` $>$ `+ -` $>$ `<< >>` $>$ `> < >= <=` $>$ `== !=` $>$ `&` $>$ `^` $>$ `|` $>$ `&&` $>$ `||` $>$ `a?b:c = += -= *= /= ^= &= |= ^= %= <<= >>=` $>$ `,`。 12. 取模时直接**爆掉 `long long` 或未转换逆元**就使用除法计算取模之后的运算 $\color{#E74C3C}\tt WA$。威力:$\color{#F1C40F}\texttt{-60pts}$。改正方式:**加括号勤取模,要逆元加逆元。** 13. 模数打错爆 $\color{#E74C3C}\tt WA$。威力:$\color{#F39C11}\texttt{-70pts}$。改正方式:给自己出**接近模数的数据**,看看有没有打错,或者复制题面中的模数进行对照。 14. 格式错误爆 $\color{#F5CECD}\tt PE$(格式错误)。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方法:~~先痛骂出题人 $\infty$ 次~~,**对照着样例调试,建议替换不可显字符。** 特别是在早期的 $\tt ABC$ 比赛中,最后一行必须要增加换行,因为没有过滤文末换行以及行末空格。还有就是 $\tt UVa$ 的题目,输入输出格式十分恶心,没有过滤文末换行以及行末空格让人做起题来十分难受。 15. `freopen` 写错爆 $\tt\color{#BFBFBF}FE$(文件错误)。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方法:直接修改,可以试图把**大样例的文件复制过来**,看能不能正常文件读写,下面给一个文件读写的模板,然后还有各种错误示范。 - 示例代码,其中 `filename` 替换为**题目给定**输入输出文件名。 ```cpp freopen("filename.in","r",stdin); freopen("filename.out","w",stdout); ``` - 错误示范 $1$:文件后缀**未设置为 `.in/.out`**,改正方式:用文件读写进行测试,看看能不能正常完成文件读写。 ```cpp freopen("filename.txt","r",stdin); freopen("filename.txt","w",stdout); ``` - 错误示范 $2$:**未开**文件读写。改正方式:最后再用顶上的编译按钮测试一次,看看**编译结果对不对**,-**会不会有控制台输入输出**,同时避免编译错误。 ```cpp // freopen("filename.in","r",stdin); // freopen("filename.out","w",stdout); ``` - **重大高频错误** 错误示范 $3$:大样例测试**没改回去**,建议复制一份大样例到 $\tt D$ 盘,然后再修改名字为 `filename.in`,**直接复制**到还没有删掉 `filename.in` 那个子文件夹的位置,可以避免覆盖大样例与文件名没改回来。 ```cpp freopen("filename1.in","r",stdin); freopen("filename1.out","w",stdout); ``` - 错误示范 $\infty$:**各种打错**,见巨佬的[文章](https://www.luogu.com/article/d2kmjwue),避免方式:**小心为上**。 15. 正负号搞错,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#F39C11}\texttt{-70pts}$。改正方式:出**一些在 $0$ 上下的数据**,看看有没有问题。 16. `cin` **读入超时**爆 $\color{#052242}\tt TLE$。威力:$\color{#F39C11}\texttt{-70pts}$。改正方式:`ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);`,**注意不能与 `fclose(stdout)`** 连用($\tt By$ [大佬](https://www.luogu.com.cn/user/911054))。其实与一些堂食快读一起用也会有问题,会变慢,比如我下面放的快读。 17. 并查集忘记**初始化** $\tt fa$ 数组 爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方式:检测每一次进行运算前 $\tt fa$ 数组是不是对的。 18. 哈希冲突,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#FADB14}\texttt{-50pts}$。改正方式:修改哈希函数,建议**高次方哈希,`mt19937_64` 随机数**,或者加冲突判断,也可以使用链式存储冲突,这里给一些不容易冲突的模数:`const ll HS[]={13331,11451497,191981011457,11452077,19937,19260817};`,[我的帖子](https://www.luogu.com.cn/discuss/1001432)的这道题有着大量的卡模数,建议去尝试一下。然后随机数的话 **`default_random_engine rander;` 也是一个不错的选择**,在 `<cstring>` 和 `<random>` 头文件下,使用方式:定义随机器就是上面的代码,随机就是 `uniform_int_distribution<type>randname(left,right);`,然后调用随机就是 `randname(rander)`。 19. 模拟退火冷却速度过快,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#F39C11}\texttt{-70pts}$。改正方式:检查是否有**随机化答案精度问题**,将退火速度设为 `0.999` 等。 20. $\tt DFS$ 一些会随着递归深入而修改的变量**定义成了全局而非局部**,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方式:这个只能靠记忆,对于会在运行中修改的变量,请定义局部变量,要是爆 $\color{#052242}\tt MLE$ 了那么请优化自己的代码,尽量全局变量,实在不行才局部。 21. 循环变量写错爆 $\color{#9D3DCF}\tt RE$ 爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方式:这个错误应该可以在运行的时候发现,分**批次注释循环块**,找到有问题的循环,修改即可。 22. 变量冲突爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}\color{black}\texttt{ or }\color{52C41A}\texttt{-0pts}$。改正方式:$\texttt{C++}$ 的变量是**取用前面的第一个**,所以有时候不修改也没事,但是你有可能会发现在循环遍历的时候有一些**该遍历的地方没有遍历**,即可以在循环里加一个循环变量检测,看看会有什么问题。 23. 负数下标或数据范围没开够爆 $\color{#E74C3C}\tt WA$ 爆 $\color{#9D3DCF}\tt RE$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方式:加上偏移值,记得输出的时候减去,平时写代码时**试试负数的数据**,注意数据范围。 24. 弗洛伊德 $f_{i,i}$ 没设置 $0$,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方式:加上 $f_{i,i}=0$,平时写代码时**试试写这个的 $\tt HACK$**。 25. 弗洛伊德有**重边**,没取 $\min$,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#FADB14}\texttt{-50pts}$。改正方式:加上 $f_{u,v}=\min(f_{u,v},w)$,平时写代码时试试写这个的 $\tt HACK$。 26. 内存算错,爆 $\color{#9D3DCF}\tt RE$。威力:$\color{#E74C3C}\texttt{-100pts}$。我被这玩意坑了 $\infty$ 分啊,改正方式:每一次开数组**都用计算器算一下内存**,尽量控制在要求的 $\frac{1}{2}$,可以试试将范围比较小的数换一种存储方式,比如 `int` 存储的动态规划数组可以转换成 `char` 存储。附上一个内存表:`int` $\tt 4B$,`unsigned char/signed char/char` $\tt 1B$,`unsigned int/signed int/int/size_t(unsigned int)` $\tt 4B$,`short int/unsigned short int/signed short int/wchar_t` $\tt 2B$,`long long/signed long long/unsigned long long` $\color{red}\tt 8B$,`float` $\tt 4B$,`double` $\color{red}\tt 8B$,`long double` $\color{red} \tt 16B$,`string` $\color{red} \tt 4B\ 12B\ 28B\ 32B\ 40B$(以编译器 `sizeof` 指令为准,建议**不要超过 $10^5$ 个**,部分可以替代成数字表示的形式),这些标红的注意了,比较容易爆炸,而 `map` `pair` 等基于这些的数据结构,也**需要计算**,比较复杂,这里建议用 `sizeof` 测试,还要注意一些题的**特殊数据范围**,比如毒瘤 $\tt 89MB$ 平衡树,还要注意 `Linux` 系统会给你少一点的内存,所以多留一点空间,就会多一点 $\color{52C41A}\tt AC$。(你猜为什么我这条写这么长,都是挂分的代价啊!) 27. 开了**编译选项 `-std=c++11`**,然后因为编译器的内置选项被 `Linux` 爆 。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方法:每一次运行完之后关掉编译选项再试一次,或者开虚拟机试一下,防止无敌编译器的自动增加,比如因为自带 `cstring` 的编译器而用 `memset`,但是在 `Linux` 上 $\color{#FADB14}\tt CE$,建议用 `#include<bits/stdc++.h>`,还有就是用了 `kill/pwd` 等 `Linux` 上的关键字,然后就 $\color{#FADB14}\tt CE$ 了,关键字的就要注意,平时**取名字注意习惯**即可,比如说我们亲爱的 `<algorithm>` 头文件中的 `y1 y2`(注释:这里使用**局部变量**就没事了) 这些东西,直接 $\color{#FADB14}\tt CE$,还有 `next` 等等,所以,在你不用万能头时,**记得加 `#include<vector>` 和 `#include<cmath>`**。 28. 被~~中国收钱协会~~ $\tt CCF$ 的**明令禁止**或自己不会用的东西爆各种错误。威力:$\color{#E74C3C}\texttt{-400pts}$,也就是 $\tt CSPJ/S$ 爆 $0$。对于不能使用的东西,有: - `#pragma GCC optimize(2,3,"Ofast",inline)` 编译加速,要加速配置编译器,加个 `-O2`,**不要直接在代码开**。`inline` 的话自己在函数外面加,不过区别不大。 - 不支持 `C++17/20`,要用 `auto[u,v]` 这种**结构化绑定还是算了吧**,手写下也没多长。 - `itoa` > 它不是一个通用 `ANSI` 函数(标准 `C/C++` 中无此函数) - 来自 `Hydro`,怎么就能用了。 - `__int64`,是个新时代的 `OIer` 或许都不会知道这种写法,写成 `long long` 就是了。依次类推,什么 `__int16`,`__int32`,`__int128` 都不太能,至于 `__int128`,是我猜的()(因为 `__int64` 被 $\tt CCF$ 禁用,并且 `__int128` 这个东西在一些编译器上无法通过编译,但是又可以在学校的 `NOI Linux` 中的 `LemonLime` 评测中使用)。出锅了好吧,**可以用 `__int128`**! 而能用的有: - `#define int long long`,小心炸掉,详见前面的 $1$ 条,建议上面也写了。其实我现在已经不用这种写法了。 - `#define double long double`,注意输出的时候不能用 `printf("%.3Lf")` 之类的 `Lf` 输出,这个不是 `C++` 标准的,建议是不要直接 `define`,而是 `#define LD long double`,输出的时候再强转 `double` 即可(就像我 $\tt CSPJ2023T3$ 那里做的一样) - `__gcd`,虽然很慢,但是建议手写 `int gcd(int x,int y){return(y?gcd(y,x%y):x);}`,也没几行代码,因为没 `C++17`,所以不能用 `gcd` 和 `lcm`,`__gcd` 引发的问题建议看[这里](https://oi-wiki.org/math/number-theory/gcd/)的注意事项。 - `signed main()` 可以用,编译很慢,然后可以用,建议不要用,有风险,**个人实战没用过,网上求证无果,建议不用,周围的大佬都叫我不要用**。`int main()` 和 `#define LL long long` 也可以,更新:**可以使用 `signed main()`**,因为 **`signed` 等同于 `signed int` 等同于 `int`**,所以可以用,不过你都不用 `#define int long long` 了你怕啥呢。 - `fclose`,但是没必要,写错了就小丑了。 - `#include<bits/stdc++.h>`,慢一点,但是建议用,防止头文件发电,直接 $\color{#FADB14}\tt CE$。 - `ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);` 可以用,毫用,双一大佬都用过!推销 `cin` 加速器,$0$ 元免费让你不被卡!~~记错了就小丑了~~。 - `__builtin_popcount()`,二进制下 $1$ 的个数,几乎是 $\mathcal O(1)$ 的(好吧其实是 $\mathcal O(8)$),不过较为少见了。 - `__builtin_ctz()` 二进制下末尾 $0$ 的个数,好东西! 29. 被各种东西卡常数爆 $\color{#052242}\tt TLE$。威力:$\color{#F39C11}\texttt{-70pts}$。首先,是除法运算超时,如果除以的数是 $2^n$,可以转换成**位运算**,否则在非必要时用减法,取模也是同理。然后线段树建议写 `p<<1|1` 和 `p<<1`。还有上面的读入和 `memset` 也有概率被卡常数,最后,我还是放一个快读快写的模板(任意数据类型): ```cpp template<typename type> inline void read(type &x){ x=0;bool flag(0);char ch=getchar(); while(!isdigit(ch))flag=ch=='-',ch=getchar(); while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); flag?x=-x:0;return; } template<typename type> inline void write(type x){ x<0?x=-x,putchar('-'):0;static short Stack[50],top(0); do Stack[++top]=x%10,x/=10; while(x); while(top) putchar(Stack[top--]|48); } ``` 30. 未定义行为 ($\tt UB$),爆 $\color{#E74C3C}\tt WA$ 爆 $\color{#052242}\tt TLE$ 爆 $\color{#052242}\tt MLE$。威力:$\color{#F39C11}\texttt{-70pts}$。改正方式:监测各种东西的状态,比如指针,变量,以及 `while(1)` 循环。已经知道什么是 $\tt UB$ 的可以看[有关 $\tt UB$ 的文件]( https://zh.cppreference.com/w/cpp/language/ub),我来解释一下什么是未定义行为:**违反规则**的语法,让程序没有意义,$\tt UB$ 有一下几种: - 有符号溢出,如 `int rp=2147483647;rp++;`。 - 访问越界,如 `int a[5];cout<<a[1145];`。 - 未初始化的标量,如 `int x;cout<<x;`(局部)。 - 非法标量,如 `#define int long long`。 - 空指针解引用,如 `int* p=nullptr;cout<<*p;`。 - 无副作用的无限循环 $\texttt{C++26}$,如 `for(;;){int x=rand();if(x%2)break;}`。 - 其他的直接看[文件]( https://zh.cppreference.com/w/cpp/language/ub)即可。 - 注意常见 $\tt UB$:错了只能碰运气。 - $\tt dp$ 数组访问 $f_{-1}$(`DEV` 是自动回滚到最后一位,Linux 不知道)。 - `int` 类型的**没返回值**。 31. 字符串读入被 `getline` 换行以及 `scanf("%s",s+1)` 坑了,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#F39C11}\texttt{-70pts}$(给了几个运气点)。改正方法:直接 `cin`,注意**要有空换行读入**。 32. 相似函数名写错,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方法:**合并近似**函数,**检测调用顺序**。 33. `set` 二分写错,爆 $\color{#052242}\tt TLE$,威力:$\color{#F39C11}\texttt{-70pts}$。改正方法:`lower_bound(se.begin(),se.end(),v)` 改成 `se.lower_bound(v)`,前者是 $\mathcal O(|se|)$ 的,而后者是 $\mathcal O(\log_2|se|)$ 的。因为它们本质不同。 34. **修改有序数组**后**忘记了排序**,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方法:在分块或其他什么地方有维护排序数组时,记得时刻**检查数值**,这个不加理论上过不去大样例,所以这也是一种调试方法,来源:[我的帖子](https://www.luogu.com.cn/discuss/1005048)。同理,**前缀和**数组也要注意修改,同样,可以通过监测变量找出。 35. **求 `LCA` 时忘记调用 `init_lca()` 函数**,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。改正方法:在求 `LCA` 时答案不对记得怀疑这一点,在树上差分时记得输出 $d$ 数组检查一下。 36. 不等式化简错误,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#FADB14}\texttt{-50pts}$。改正方法:改成更为稳妥的方法,**不要盲目化简**。 37. `mp[]` 的常数比 `mp.count()` 大,爆 $\color{#052242}\tt TLE$,威力:$\color{#FADB14}\texttt{-50pts}$。改正方式:**存在性查询用 `count`!** 然后使用 `cc_hash_table` 和 `set` 都`count`,要用 `find(x)!=.npos`。 38. `vector` 常数大,爆 $\color{#052242}\tt TLE$,威力:$\color{#FADB14}\texttt{-50pts}$。改正方式:**用 `umap` 可以代替的代替!** 39. 哈希被 $0$ 卡,存 `a` 时要 $+1$,详见[这里](https://www.luogu.com.cn/discuss/1042593)。爆 $\color{#E74C3C}\tt WA$。威力:$\color{#FADB14}\texttt{-50pts}$。这个是个人习惯问题。 40. 数据结构空间开错,爆 $\color{#9D3DCF}\tt RE$。威力:$\color{#F39C11}\texttt{-70pts}$。`Trie` 一般开 $\mathcal O(|v||s|)$。(字符集 $\times $ 长度)线段树一般开 $16N$。 41. 字符串读入没读题,**要多行读入合并成一个**,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#F39C11}\texttt{-70pts}$(给了几个运气点)。改正方法:**读题!** 42. 状压忘记标记了,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#F39C11}\texttt{-70pts}$。改正方式:监视动态规划数组。 43. `lazytag` 维护有问题,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。通过 `#define debug`,`#ifdef debug`,`#endif` 等方法检查答案,再在纸上推算,正确之后即可。 44. 树剖不清空重儿子,被卡成**乱链剖分**,爆 $\color{#052242}\tt TLE$。威力:$\color{#E74C3C}\texttt{-100pts}$。解决方法:在板子里多加 `t[p].son=0;`。 45. 输出格式错误(如[这题](https://www.luogu.com.cn/problem/P4103)),爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。解决方法:手造数据。 46. 扫描线排序函数忘记按出入边 $\tt io$ 排序,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#93B127}\texttt{-10pts}$。解决方法:把排序函数改成 ```cpp bool cmp(lins x,lins y){ if(x.y!=y.y)return x.y<y.y; return x.io>y.io; } ``` 47. 虚树清空不完全。爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E74C3C}\texttt{-100pts}$。可能在 dp 的时候因为没有贡献就没搜下去,导致虚树没清空。解决方法:在 dp 完之后输出一下树,看看是否情况。 48. **没完全清空 dfs 栈**导致的无解判断错误[(很隐藏)](https://www.luogu.com.cn/problem/P3953), 爆 $\color{#E74C3C}\tt WA$。威力:$\color{#93B127}\texttt{-20pts}$。解决方法:手动生成一个无解情况,后面全部放有解情况,看看答案对不对。 49. (与上一条在同一题)迪杰斯特拉判断更新 **不小心放在了 `q.pop()` 前面。** 爆 $\color{#052242}\tt TLE$。威力:$\color{#E67E22}\texttt{-90pts}$。解决方法:在取出要更新的元素时输出**编号**和**队列长度**。 50. 最大值不够大,爆 $\color{#E74C3C}\tt WA$。威力:$\color{#93B127}\texttt{-20pts}$。解决方法:$\sout{114514\to11451419\to114514191\to1145141919810\to 1145141919810100}$ 手算最大值。 51. 抽象的 $32\text{MB}$ 题,爆 $\color{#052242}\tt MLE$。威力: $\color{#93B127}\texttt{-14pts}$。解决方法:毒瘤题拒绝使用 STL,人人有责!~~手写内存池?~~ 52. 错误的更新了 $\text{LCA}$ 的权值,见[此题](https://www.luogu.com.cn/problem/P2934)。爆 $\color{#E74C3C}\tt WA$。威力:$\color{#E67E22}\texttt{-90pts}$。解决方法:对每一个更新输出详细的信息。 53. **迭代加深**时一不小心把正确的跳过了导致找不到答案,爆 $\color{#052242}\tt TLE$(未限定深度)爆 $\color{#E74C3C}\tt WA$(限定深度)。威力:$\color{#E74C3C}\texttt{-100pts}$。解决方法:输出搜索时的状态,检查是否有合法状态被跳过。 54. 三目运算符出现两个相同的赋值情况,如 `a=1+(x==y?a:0)` 这种情况,是**先赋值再相加**,相当于 `a=a+1`,而不是 `a=1` 后 `a=2`。爆 $\color{#E74C3C}\tt WA$。威力:$\color{#F1C40F}\texttt{-60pts}$。解决方法:可以加一个 `tmp` 变量中转。其实三目更慢,因为 `if` 有神人并行优化。 55. 神人 Dev 不报警告,爆 $\color{#FADB14}\tt CE$。威力:$\color{#E74C3C}\texttt{-100pts}$。解决方法:首先在编译选项里打开【显示较多错误信息】【显示最多警告信息】和【显示所有警告为错误】,还要在编译增加命令里面开 `-Wall -Wextra -Wshadow`,但是这样只能根治无返回值,无法**防止没有填写返回值但是返回了的函数**,这种在哪里都会炸但是 Dev 不会。 56. 找不到错误时 $\color{gold}\tt5D$ 的方法:**对拍**。威力:$\color{52C41A}\texttt{+??pts}$。使用方法:新建一个 `对拍.bat` 文件,输入 ```bat g++ "TEST_MAKER.cpp" -o "TEST_MAKER.exe" g++ "STD_CODE.cpp" -o "STD_CODE.exe" g++ "TEST_CODE.cpp" -o "TEST_CODE.exe" FC STD.out ME.out pause ``` - 对于 `TEST_MAKER.cpp`,请写出一个数据生成器(如果是图论(当题意的图**非常复杂**时)或 $\color{orange}\tt SPJ$ 我也救不了你,不过一般 $\color{orange}\tt SPJ$ 题目会给 $\tt checker$,就可以在指令的最后加上调用 $\tt checker$ 的指令,甚至不需要 $\tt STD$)并将输出文件设置为 `TEST.in`,注意**要让暴力能够输出答案**。对于 `暴力正解.cpp`,请将保证正确性的暴力代码放在这里,注意**要是你这个是错的我也救不了你**。接着,将输入设置成 `TEST.in` 输出设置成 `STD.out`。对于 `TEST_CODE.cpp`,请将需要对拍的代码放在这里,将输入设置成 `TEST.in` 输出设置成 `ME.out`。之后直接点击 `对拍.bat` 即可。 - 对于**没有配置的环境的情况**,需要完成以下操作:新建一个 `对拍.bat` 文件,输入 ```bat TEST_MAKER.exe STD_CODE.exe TEST_CODE.exe FC STD.out ME.out pause ``` - 放的东西同上,只是需要先编译完成程序,再点击 `对拍.bat`。 $\tt Default$. 如果你只会暴力,记得尝试套路与典题,还有自己的**做题方法**。 - 把异或当做**不进位加法**,把与当做**位**$\min$,把或当做**位**$\max$,注意**二进制单调性**,其他的二进制可以**预处理拆位**优化。 - 把树上维护值使用**树形 $\tt DP$**。 - 满足**最大化原理**,直接**维护对应值**即可。 - 把需要找到最靠近的数使用**单调栈**或 $\tt set$。 - 看数据范围识别时间复杂度:$n \leq 10=\mathcal O(n!)$、$n \leq 25= \mathcal O(2^n)$、$n \leq 100 = \mathcal O(n^4)$、$n \leq 400 = \mathcal O(n^3\log_2 n)$、$n \leq 2000 = \mathcal O(n^2\log_2 n)$、$n \leq 5000 = \mathcal O(n^2)$、$n \leq 10000=\mathcal O(n\sqrt{n})$、$n \leq 10^6=\mathcal O(n \log_2 n)$、$n \leq 10^8=\mathcal O(n)$、$n \leq 10^{16} = \mathcal O(\sqrt{n})$、$n \leq 10^{18} = \mathcal O(\log_2 n)$ 或 $\mathcal O(\sqrt[3]{n})$。 - 把有单调性的东西使用**二分**。 - 看到 $\sum \sum$ 双 $\tt Sigma$ 题目考虑暴力拆开或者推式子,还可以考虑拆贡献。 - 把有阶段性的用 $\tt DP$。 - 把能贪心的**贪心**。 - 看到单调性尝试**二分**。 - 建议定义一些**局部变量**,并尽可能**封装函数**。 - 多限制题目可以尝试**邻项分析法**,再**排序**,或者**排序一个**,然后用 `priority_queue` 贪心另一个。 - 可以试试 $\tt DFS$。 - **思维**题先打表找规律,再证明,表要用程序写,不要**盲目**猜结论(表如果用手推有时会发现中间变量的规律。直接用程序写出答案有时没法发现这个隐蔽的规律 ——[大佬](https://www.luogu.com.cn/user/911054))。 - 分段做题,一般**都会有启发**。 - 并查集可以维护传递性信息,如 [$\tt Soso$ 的并查集(内部题目)](https://oiclass.com/d/pu2ti/p/330) 和 [$\tt Soso$ 的并查集 $\tt Ex$(内部题目)](https://oiclass.com/d/tigao/p/1438)。 - $\texttt{Ad-hoc}$ 题一定要多想一想啊。 - 实在不行**线段树**,最后直接暴力(暴力也是实力),尽量拿高分。 - 比赛开始时**全部题**都看一遍,防止漏掉**部分分**,$\tt CSP$ 的难度一般**不递增**。 - 尽量不要犯低级错误,比如**文件名错误**,程序后缀写成 $\tt .txt$,这边建议阅读[这个](https://www.luogu.com.cn/discuss/965951)大佬的文章。 - 非强制在线问题可以选择**转离线**,可能会更好处理。 - 排序后 $x\in[l,r]$ 的数个数为 `upper_bound(...,r)-lower_bound(...,l)`(其他请见[这个](https://oiclass.com/blog/9895/66c45bda416e4b050ff367aa#1724144602856)大佬的博客)。 - 千万不要忘记那些基础的 $\tt dp$ 方程~~可以骗分~~: - $01$ 背包:[模板题目](https://www.luogu.com.cn/problem/P2871),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/knapsack/#0-1-%E8%83%8C%E5%8C%85)。 - 完全背包:[模板题目](https://www.luogu.com.cn/problem/P1616),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/knapsack/#%E5%AE%8C%E5%85%A8%E8%83%8C%E5%8C%85) - 多重背包:[模板题目](https://www.luogu.com.cn/problem/P1776),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/knapsack/#%E5%A4%9A%E9%87%8D%E8%83%8C%E5%8C%85) - 分组背包:[模板题目](https://www.luogu.com.cn/problem/P1757),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/knapsack/#%E6%B7%B7%E5%90%88%E8%83%8C%E5%8C%85) - $\tt LCS$:[模板题目](https://www.luogu.com.cn/problem/P1439),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/basic/#%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97) - $\texttt{LIS}(n^2,n\log n)$:[模板题目 $\mathcal O(n^2)$](https://www.luogu.com.cn/problem/B3637),[模板题目 $\mathcal O(n\log n)$](https://www.luogu.com.cn/problem/P1091),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/basic/#%E6%9C%80%E9%95%BF%E4%B8%8D%E4%B8%8B%E9%99%8D%E5%AD%90%E5%BA%8F%E5%88%97) - 区间 $\tt dp$:[模板题目+破环成链](https://www.luogu.com.cn/problem/P1880),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/interval/) - 树形 $\tt dp$:[模板题目](https://www.luogu.com.cn/problem/P1352),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/tree/) - 树上背包:[模板题目](https://www.luogu.com.cn/problem/P2014),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/tree/#%E6%A0%91%E4%B8%8A%E8%83%8C%E5%8C%85) - 换根 $\tt dp$:[模板题目](https://www.luogu.com.cn/problem/P3478),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/tree/#%E6%8D%A2%E6%A0%B9-dp) - 状压 $\tt dp$:[模板题目(集合状态记录)](https://www.luogu.com.cn/problem/P5911),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/state/) - 数位 $\tt dp$:[模板题目](https://www.luogu.com.cn/problem/P2602),[$\tt Wiki$ 讲解](https://oi-wiki.org/dp/number/) - $\tt ST$ 表(这个蒟蒻因为忘记怎么打 $\tt ST$ 表然后手打 $100+$ 行的别的解法,浪费大量做题时间,而这只是 $\tt CSPST1$):[模板题目](https://www.luogu.com.cn/problem/P3865),[$\tt Wiki$ 讲解](https://oi-wiki.org/ds/sparse-table/) - 离线!离线!离线! - 字典序相关可以考虑**相邻字典序**关系。 - 请记住 $\binom{n}{m}=\frac{n!}{m!(n-m)!}=fac_n\times {fac_m}^{-1}\times {fac_{n-m}}^{-1}\bmod p$,注意 $n>m$,否则为 $0$。 - $inv_i=(p-\lfloor \frac{p}{i}\rfloor )\times inv_{p \bmod i} \bmod p