Nickel 的盲点扫描器

续在旧博客中 那些年,我们写错的代码 后,Nickel 感觉这种 tips 还是比较有作用的,但是同时希望能将其写的简短有力。

也许有些注意事项看上去是废话,但也许是用数小时的调试换来的 qaq


Code

  • 多测时记得清空!!!(不要忘记因为这个辛苦追踪错误半个小时

  • 注意树状数组中 lowbit(x) 如果使用宏定义的话,要记得加上最外层的括号,写成 #define lowbit(x) ((x) & -(x)) 为宜( 虽然在 luogu IDE 上测试如果将其定义为函数意外的要快一些

  • 注意如果 \(x\) 是一个负数,需要减去 \(|x|\) 时直接加上 \(x\) 即可(尤其是突发奇想希望通过对结构体重载下标运算符实现 python 那样的负数下标时要注意

Algorithm

  • 如果不知道如何倒过来算贡献,考虑具体的贡献区间有何特点
  • 如果直接计数每一种情况不易确定,看看能不能一对一映射到较容易统计的状态形式
  • 合理利用递推数组的继承关系
  • 注意如果在设计状态时先看哪些量可以被确定下来,进而描述这个状态
  • 求最短路时先看图是否为 DAG,如果是则可以直接使用 dp 线性复杂度求解
  • 如果询问一个集合是否存在某元素(或将某些元素代入某个函数的函数值)大于一个常数,则可以尝试找出最大的函数值。(小于同理)
  • 如果一个数轴上要求判断两类点在某个区间上是否满足一对一关系,可以将一类点标记为 1,另一类点标记为 -1,然后求区间和判断。
  • 如果问一个集合通过某种方式拓展后其大小的上界,可以看这个集合最终的元素是否都在一个范围内,然后枚举这个范围内的元素是否最终会在集合中。
  • 当数据范围不大的时候可以直接枚举就不要再分析其他性质(也许特殊性质根本不存在
  • 有单调性就一定可以二分(不要分析出单调性还在想如何用数学的办法求函数交点
posted @ 2021-08-28 21:12  Nickel_Angel  阅读(63)  评论(0编辑  收藏  举报