Nickel 的盲点扫描器
续在旧博客中 那些年,我们写错的代码 后,Nickel 感觉这种 tips 还是比较有作用的,但是同时希望能将其写的简短有力。
也许有些注意事项看上去是废话,但也许是用数小时的调试换来的 qaq
Code
-
多测时记得清空!!!
(不要忘记因为这个辛苦追踪错误半个小时 -
注意树状数组中
lowbit(x)
如果使用宏定义的话,要记得加上最外层的括号,写成#define lowbit(x) ((x) & -(x))
为宜( 虽然在 luogu IDE 上测试如果将其定义为函数意外的要快一些 -
注意如果 \(x\) 是一个负数,需要减去 \(|x|\) 时直接加上 \(x\) 即可
(尤其是突发奇想希望通过对结构体重载下标运算符实现 python 那样的负数下标时要注意
Algorithm
- 如果不知道如何倒过来算贡献,考虑具体的贡献区间有何特点
- 如果直接计数每一种情况不易确定,看看能不能一对一映射到较容易统计的状态形式
- 合理利用递推数组的继承关系
- 注意如果在设计状态时先看哪些量可以被确定下来,进而描述这个状态
- 求最短路时先看图是否为 DAG,如果是则可以直接使用 dp 线性复杂度求解
- 如果询问一个集合是否存在某元素(或将某些元素代入某个函数的函数值)大于一个常数,则可以尝试找出最大的函数值。(小于同理)
- 如果一个数轴上要求判断两类点在某个区间上是否满足一对一关系,可以将一类点标记为 1,另一类点标记为 -1,然后求区间和判断。
- 如果问一个集合通过某种方式拓展后其大小的上界,可以看这个集合最终的元素是否都在一个范围内,然后枚举这个范围内的元素是否最终会在集合中。
- 当数据范围不大的时候可以直接枚举就不要再分析其他性质
(也许特殊性质根本不存在 - 有单调性就一定可以二分
(不要分析出单调性还在想如何用数学的办法求函数交点