默笙の挂分小技巧

MooSheng / 2023-08-24 / 原文

挂分小技巧:

关于空间

  • 无向图没开双倍空间
  • 环形 \(dp\) 没开双倍空间
  • 维护序列插入没开大空间
  • \(manacher\) 没开双倍空间
  • 线段树合并开四倍空间
    应是logn倍空间
  • \(kruskal\) 重构树没开双倍点空间
  • 扫描线算面积并开四倍空间

关于数学题

  • 快速幂底数没取模爆 long long
  • 对快速幂指数取模
  • 取模没消负号
  • \(10^8\) 用埃氏筛
    应用欧拉筛
  • \(\div 0\)\(\times 0^{-1}\)
  • abs 取小数绝对值

关于 \(dp\)

  • 计数 \(dp\) 没开 long long
  • \(dp\) 省去一维后没有反向
  • 区间 \(dp\) 的断点 \(k\) 取到了 \(r\),导致 \(k+1>r\)
  • 滚动数组不清空
  • 单调队列优化 l++r-- 前没判 l<=r
  • 断环成链遍历 \(1\sim 2\times n\)
    要-1
  • 有负数的 \(dp\) memset(dp,0,sizeof(dp));
  • \(dp\) 转移没判掉 \(inf\) 导致统计答案时 !=INF 的条件失效
  • 以为 \(bitset\)<<>> 复杂度是 \(O(1)\)
  • \(10^9\) 的数值赋 0x3f3f3f3f\(inf\)

关于图论

  • \(dijkstra\) 求最长路
  • 差分约束边建反
  • 树剖建的线段树从 root 开始 build
  • 双向边删边不删反向边
  • 对最大流反悔边流量赋 \(-w\)
  • 对费用流反悔边费用赋 \(0\)
  • \(floyd\)\(ijk\) 循环
    应是kij
  • \(dijkstra\) 在第一次入队时标记 \(vis\)
  • 树上差分不特判 fa[lca]!=lca
  • 双向边改边权不改反向边

关于数据结构

  • 栈没放标兵
  • 对空 \(vector\) 取下标 \(size-1\)
  • \(1\sim n\) 遍历 \(vector\)
  • 扫描线算面积并直接将原区间作为线段树对应区间
  • 把默认堆(大顶堆)当成小顶堆

关于字符串串

  • getchar 读回车
  • 拓展 \(kmp\) 没清空 \(z\) 数组
  • 哈希值加法 \(\% 131\)

关于其它算法

  • \(check\) 函数内一种情况不行直接 return 0
  • \(DLX\)recoverremove 同向遍历
  • 坐标为 \(0\) 的二维前缀和没 \(+1\) 处理
  • 对只有一个数的数组差分
  • 随机化没 srand

关于未定义报错

  • 数组轻微越界导致未定义的 \(WA\)
  • 数组严重越界导致未定义的 \(TLE\)
  • 没开 long long 导致未定义的 \(RE\)

关于打比赛

  • 式子不拆
  • 打比赛默认正序开题
  • 打比赛死磕正解不打暴力

关于其它

  • 多测不清空
  • 宏定义不加括号
  • 位运算不加括号
  • 重载 \(>\)
  • 开数组 \(a[M][N](M<N)\)
    应是a[N][M]
  • 不备份会被修改的数组下标