Notice

读题

  • 不要把 \(\sum a \oplus b\) 看成异或和。
  • 注意读完整,有可能对原有符号有新的约定,不要想当然。
  • 注意模数的 0 数清楚。
  • After printing the answer, we will respond with a single integer. 记住你调了一年的 交互

卡常&时间

  • 打题之前一般先搞个自己的缺省源。快读 x=0,w=1 的初始化不要漏掉。 survive
  • 取模多的注意常数。 Holy Sequence

初始化

  • 初始化如果放到init里面,main要记得调用
  • 初始化不要乱移动位子,人家n还没读进来你循环个毛线 UVA11019 Matrix Matcher
  • 清空的时候想清楚要清空什么,哪些要清。如果对复杂度有影响记得记录改变过的位置。
  • 离散化的时候是 m=unique( tmp+1,tmp+1+2*n )-tmp-1; l[i]=lower_bound( tmp+1,tmp+1+m,l[i] )-tmp; ,不要在前面不 -tmp-1 或者在后面多减一。

Input&Output

  • \(n,m\) 不要搞反
  • 用了 ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);之后就和scanf printf无缘了……切记
  • while ( scanf( "%d",&n)==1 && n )==1 不要删掉。uva1519
  • 死循环之前的输出,如果不加换行是没有输出的;别问为啥,问就是缓存。(换行作用相当于清缓存,如果你一直存着后面又恰好死循环当然会积压着没有输出)
  • add(read(),read(),read()) 这个 xyx 说是 UB,先后顺序有问题 ARC108 C

优先级

  • 如果是 define 的话最好加括号(因为优先级)。比如 #define lowbit(x) (x)&(-x)

数据范围&空间&精度

  • 不开 long long 见祖宗。不开 ull 见祖宗。开了不特判见祖宗。——CSP2020
  • 如果要离散化原数组和修改操作,范围要开够。
  • 异或、或出来的东西要开两倍
  • 如果除初始边以外要加边,开数组时要注意
  • 开大数组要记得算空间。方阵
  • 你永远不知道C++什么时候会溢出。所以输出之前最好 (ans+mod)%mod ,保险起见。
  • 看范围的时候要注意负数什么的,DP的时候要不要和自己取 max 想清楚。 Choosing Balls
  • 防止溢出取模一定要勤快 但是什么异或和按位与之类的东西别给我瞎jb乱取模
  • 两个相等的值,intlong long 比较可能结果为 false
  • 写矩乘要写 *=void ,不然矩阵一大就炸空间……
  • 就算 #define int long long 也要注意 1ll<<

边界问题

  • for ( int i=21; i; i-- )for ( int i=21; i>=0; i-- ) 竟然是不等价的呢。
  • 对于最短路或者类似的,对 初值为inf的数组进行加减 之类的操作,inf 要谨慎考虑,不能太大导致加法溢出(或者开大也行),不能太小起不到 “极大值” 的作用。Example

重载&排序

  • 重载比较运算符一定tm要记得 return !!!!!!!! 死亡案例·今日降智如下↓
    今日降智
  • 重载的时候参数列表后面记得加 const
  • STL中,priority_queue 默认是大根堆,set 是小根堆,sort 默认升序。自行重载请重载小于号。
  • 重载例子:bool operator < ( const StrLand tmp ) const { return (x^tmp.x) ? x<tmp.x : y<tmp.y; } 后面一个 const 没加在 BZOJ CE 过。

多测

  • 多测清零及其复杂度注意。
  • 如果多测中间一边读入一边有特判的话,一定要读完之后再特判,不然没读入的东西会放到下一个 case 里面。

函数

  • 字符串传参的时候用 s+1 可能会有问题 熟悉的文章
  • 不能在有返回值的函数里面不 return ,可能会产生 RE 等奇怪错误
  • 递归函数 static 一定要慎重,比如要把当前这个局部变量传参到下一层里面的情况。

算法

最短路

  • Dijkstra 用超级原点时不能加双向边,否则边权为0会T。普通快乐|HDU6166|P5304
  • 搞超级源汇的时候要注意编号一定要设够。

网络流

  • Dinic DFS退出时不要忘记清空 vis[u],判断的时候判三个:visflowdis .
  • Dinic BFS初始化的时候一定要开够范围,注意点的数量
  • BFS 退出的时候一定要写 dis[T]!=dis[0] (当然最开始初始化也要到 \(0\) ),费用有可能是负数

平衡树

  • Splay的next查询操作不能返回val,要返回节点编号,否则kth里调用会错

线段树

  • 不要像个zz一样建完线段树不 pushup

树状数组

  • 二维树状的时候不要写成 for ( ; y<=m; y+=lowbit(y) ) ,显然外面套 \(x\) 的时候第二次循环里面的 \(y\) 就不是原先那个 \(y\) 了。

模拟退火

  • SA有多组测试数据的时候不能用CLOCK(后果可想而知)

并查集

  • 合并是 fa[fu]=fv ,不要写错。

排列组合

  • 预处理的时候记得初始化 fac[0]=inv[0]=inv[1]=1

二分

  • 作为一个 zz,REH你记住了,以后只能写 l,r,ans,l<=r版本,不要拿着你的假模板到处 TLE .

SAM

  • 有些地方不要忘记 int p=ord[i] 然后直接用 \(i\) .
  • 想清楚统计的时候要不要统计根节点 CF427D

多项式

  • 养成好习惯:一定要 Math::Init(n)
  • 记住你的全家桶是左闭右开的
  • NTT 不要忘记 reverse 啊……

做题注意点&其他

  • 有些比较特殊的情况最好一开始就处理好,或者写下来,不然写到后面容易忘记。
  • 情况一定要考虑清楚,特殊情况该判的要判,该写的要写,计数不重不漏,还有 \(n,m\) 一定不要搞反……死亡案例
  • 前后要统一,不要出现后面改了前面没改的情况。改代码一定要谨慎。
  • 有类似的题目做过固然是好的,但是要注意比较数据范围和特殊情况,不要被带偏。有可能一点关系都没有,还想复杂了。
  • 文件头要加好。
  • 考虑要完整。
posted @ 2020-11-23 17:28  MontesquieuE  阅读(162)  评论(0编辑  收藏  举报