注意点:
题目部分:
- 数组范围注意不要开错(记得修改缺省源)。
- 并查集数组要开两倍。
- 翻译看不懂的话要自己翻。
- 题目中没用的信息跳过不看。
- 子串和子序列看清楚!
- 要看样例解释。
代码部分:
- 多测不清空,爆零两行泪。
dp
初始化不要忘记(最好设成LONG_LONG_MAX
或LONG_LONG_MIN
!)。memset
最好不要用,复杂度高,容易超时。- 判断相等应是
==
。 max
和min
中前后的数据类型要相同。- 不能随意开
long long
,可能爆空间。 - 看数据范围, 不开
long long
见祖宗! long long
也不够了用__int128
,或手写高精。vector
最好不要直接排序,复杂度高,可以用索引来排序。- 注意算术优先级(加括号)!
- 交互题记得输出后要清空(
fflush(stdout);
),并且不要用ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
来加速cin
和cout
。 - 数组越界要特判,比如下标从
0
0
0 开始时
i-1
要特判一下。 - 循环边界想清楚再写。
- 图论时的输入有时从下标 2 2 2 开始读入。
- 二分边界不要判错。
- 二分时
l
+
r
l+r
l+r 若超出
long long
范围,可以用 m i d = l + ( r − l ) / 2 mid =l+(r-l)/2 mid=l+(r−l)/2 来写。 cf
的题不要写unordered_map
,只能用map
,因为有些大佬卡掉了unordered_map
。- 提交时记得删去调试信息!
debug 部分:
- 样例输入不了,可能是
Dev-C++
死机了,可以打开 洛谷在线 IDE 或其他网站来写。 - 如果用了
while(cin>>n)
之类的输入,程序运行无法终止。如果输入的类型是整数,常用的办法是换行后输入\
或者什么字母,这样输入就会停止了,并且有输出。或者在循环中特判 n n n 为 − 1 -1 −1 时结束,自己手动输入 − 1 -1 −1 即可。提交时记得删去。 - 没有输出,可能是死循环了。把
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
注释掉,之后在递归里输出每次的值。 dp
值不对,可以将dp
的表格打印出来。
算法选择:
数据范围:
- n ≤ 10 n \le 10 n≤10 时,考虑暴力搜索或状压 dp。
- n ≤ 20 n \le 20 n≤20 时,考虑 meet in the middle 或状压 dp 优化。
- n ≤ 1 0 2 n \le 10^2 n≤102 时,考虑dp。
- n ≤ 1 0 3 n \le 10^3 n≤103 时,考虑暴力枚举。
- n ≤ 1 0 5 n \le 10^5 n≤105 时,考虑贪心。
- n ≤ 1 0 9 n \le 10^9 n≤109 时,考虑二分和数学。
- n ≤ 1 0 18 n \le 10^{18} n≤1018 时,考虑数学。
题目描述:
- 最大值最小(最小值最大):二分、贪心。
- 最大得分和最小得分:贪心、
dp
。 - 修改、求区间最大值:线段树、前缀和。
本篇文章均由本人经验总结而出,持续更新!
感谢大家的支持~