Steven_MengのBlog

1.进入考场最好先加上编译选项:-Wall -Wextra -Wshadow -Wunused

2.注意输出int不能用lld,虽然在Windows下问题不大。

3.如果两个数相减取模,最好((a-b)%MOD+MOD)%MOD,是最稳的。

4.如果两个数相乘取模,一定要1ll*a*b%MOD

5.如果dp数组开的很大(e.g.$5000 \times 5000$或者以上),建议输出sizeof(dp)/1024/1024,是数组的MB数。

6.建议不要过度使用STL,如map<vector<pair<int,int> >,int>之类的诡异东西。没有O2啊。

7.dp问题或者是复杂的数学问题,建议在纸上写出推倒过程。

8.在时间和空间允许的范围内,建议全用long long或者long double

9.注意无解的设值,比如说如果判断ans==-1时无解,但是解出来的解就是-1,就挂了,建议设成一些奇怪的值,如0x7fffffff,最稳的是再记录一个bool flag,代表有没有解。

10.如果还剩很多时间,建议把单哈希改成双哈希。

11.对于一些$n\le 20$的题目,应该想到状压,对于一些$n\le 40$的题目,应该想到双向搜索

12.如果有简单的离线做法,请使用离线做法

13.建议树状数组下标整体平移$1$,如果要修改/查询$0$的位置,因为$lowbit(0)=0$,会导致死循环。

14.unique写法:unique(a+1,a+1+n)-a-1,不要漏掉-1

15.lower_bound找到的是第一个>=当前数的位置,upper_bound找到的是第一个>当前数的位置。有时候要玄学地把lower_bound换成upper_bound。

16.如果没有思路,可以小范围数据暴力,大范围多次贪心。切忌输出样例或者0,也不要什么都不打。

17.建议改掉#include <bits/stdc++.h> 的坏习惯,比如说我在考前改就来不及了,也不要过多inline,register

18.i&1<<j,槽点自己找。

19.const int eps=1e-6,或者const double eps=1e6

20.for (int i=1;i<=n;++i) for (int i=1;i<=m;++i)不过在c++11下貌似没问题,编译器会取离得最近的i,所以千万不要用c++11,这个代码加上-Wall就可以看到警告

21.注意数组越界,有一次我模拟赛然后for (int i=0;i<LOG;++i) anc[u][i]=anc[anc[u][i-1]][i-1]找了好久错。

22.如果不确定二分的边界,可以使用奇巧淫技:

23.强烈建议下标从1开始

24.关于字符串哈希,最好乘以$131$之类的数,也可以这么写:HashVal=HashVal*26ull+(ull)(a[i]-'a'+1),切记$+1$。

25.最好想方设法自己hack自己,比如说构造贪心的反例之类的,但是如果你能hack掉自己,恭喜你,你凉了

26.建议先保证算法的正确性,然后再考虑优化算法。

有一次模拟赛打了一个没有正确性的dp,过了大样例,然而成绩爆30了。

27.对拍要加srand(time(NULL))

28.对于一些题,部分分的做法是提示正解。

29.-Wl,--stack=1145141919810然后今天真的考了。

30.对于这道题,一条链的做法是在暗示正解树上启发式合并。

对于去年的D1T3,我认为菊花图的做法也是在暗示正解的multiset上面贪心找匹配。

欢迎补充qwq。

 评论