写题时的破防瞬间
经典永流传

记一些做题时卡了很久的奇奇怪怪的点:
调题篇
-
认真审题
-
取模!!!取模!!!取模!!!
-
数组还是比较快的,有事没事别用 \(\text{map}\) 和 \(\text{priority}\)_\(\text{queue}\)(存图还是用链式前向星吧,少用 \(\text{vector}\) )
-
十年OI一场空,不开\(\text{long long}\)***
-
注意数据范围,双向边开两倍,线段树开四倍,线段树合并开 \(\text{log}\) 倍
-
能用 \(\text{int}\) 别开 \(\text{long long}\),要不然可能 \(\text{TLE}\)
-
变量重名引发的惨案(全局开过了函数里再开一遍引发奇妙错误)(
NOIP2021/fn) -
循环手残打错后 \(i\) 和 \(j\) 傻傻不分(其实还有 \(n\) 和 \(m\)) -
多组数据记得清零,不止数组,还有必要的 \(\text{stl}\)、\(\text{cnt}\)、\(\text{tot}\)……
-
图论的边、数据结构的数组编号从\(0\)还是\(1\)开始
-
强制在线更新 \(\text{lastans}\)
-
数据结构询问区间不保证 \(l \le r\)
-
赋值运算符与等于号不分( \(=\) 和 \(==\) 傻傻不分)
-
运算优先级(养成好习惯,多加括号)
-
局部变量未赋初值
-
如果反复 \(\text{memset}\) 太慢了,那么尝试在循环里顺便清零,或者再做一遍逆操作复原
-
每天一个好习惯: \(\text{sort}\) 自定义比较函数 \(\text{cmp}\) 用引用传参 (\(\text{e.g.}\) \(\text{int}\) &a)
真的会快很多啊啊啊 -
结构体里数组不要开太大,上次高精玄学错了好久
-
变量都开 \(\text{long long}\) ,快读快输忘开
-
极大/小值直接赋 \(\text{(1<<30)}\) 或 \(\text{(1ll<<60)}\) 有风险,建议 \(\text{memset}\)
-
\(\text{struct}\) 里套 \(\text{vector}\) 容易被卡常?
-
输出格式(是否漏打换行)
-
变量突变了,一般是越界,并且怎么有可能乱飘到别的数组里啊啊啊啊啊啊啊(队长忠告,多用 \(\text{stl}\),自动分配空间)
-
\(\text{dp}\) 中赋了极大/极小值,加减乘除的时候小心炸,或是例如极小值加了一个数导致发生变化。
-
当你觉得你写的所有部分都一点问题没有的时候,可能确实如此,因为可能还有你没考虑的情况。
-
算时间限制的时候别忘了空间限制。
算法篇
-
求欧拉路径 \(/\) 回路的字典序最小方案,\(\text{dfs}\) 时在回溯时倒序存经过的点,输出时正序输出,避免自环最后走不到
-
二分上下界
-
结论题是否存在特例
-
利用倍增 \(\text{LCA}\) 求树上任两点距离,区分节点深度与到根的路径长
-
链式前向星的成对变换 \(\text{tot}\) 先赋成 \(1\)
-
字典树中初始时 \(\text{tot} = 1\)
-
结论题打表找规律显然比人类智慧要轻松
-
取对数可以把大数乘法转化为加法
-
保证精度慎用除法
-
深搜递归边界
-
\(\text{Hash}\) 有时自然溢出是个不错的选择(
一般用180181327不会被卡,别问我是怎么来的) -
重复要用的东西预处理
-
搜索内部用以记录每一层状态的数组 / 变量千万别开全局,否则覆盖掉就g了
-
数据结构下传懒标记想清楚优先级与下传方式
-
线段树大常数可以用树状数组代替
-
线段树合并的两种写法
-
虚树建边的时候注意方向,或者直接暴力建无向边,还有什么 \(\text{Kruskal}\) 重构树、圆方树,如果建完以后发现 \(\text{dfs}\) 进不去,有可能只建了单向边
-
\(\text{DP}\) 初始状态的设定(记搜写法是递归边界)
-
数位 \(\text{DP}\) 中判断一个状态是否访问过不可简单判dp数组是否为 \(0\) ,否则当前状态答案为 \(0\) 时时间复杂度gg,最好加一个 \(\text{vis}\) 数组
-
关于斜率优化:①若直接用 \(\text{double}\) 判斜率,注意除以 \(0\) 时返回极大值;若用乘积形式判斜率,注意乘负数会变号,爆 \(\text{long long}\) 时要开 \(\text{int128}\)。②在凸壳中加新的点时,与 \(\text{q[r]}\) 和 \(\text{q[r-1]}\) 比较都可以。③判断斜率大小最好加等号。
-
差分约束建超级源点 \(0\) 与所有点连长为 \(0\) 的边,所以点数变为 \(n+1\) ,判负环的松弛次数至少为 \(n+1\)
-
点双注意是否有孤立点连自环
-
线段树的懒标记有时不能简单地判是否为 \(0\),有时需要对 \(\text{tag}\) 取模时,\(\text{tag}\) 变为 \(0\) 就下传不了了

浙公网安备 33010602011771号