1.进入考场最好先加上编译选项:-Wall -Wextra -Wshadow -Wunused
2.注意输出int不能用lld,虽然在Windows下问题不大。
3.如果两个数相减取模,最好((a-b)%MOD+MOD)%MOD
,是最稳的。
4.如果两个数相乘取模,一定要1ll*a*b%MOD
5.如果dp数组开的很大(e.g.或者以上),建议输出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.对于一些的题目,应该想到状压,对于一些的题目,应该想到双向搜索。
12.如果有简单的离线做法,请使用离线做法
13.建议树状数组下标整体平移,如果要修改/查询的位置,因为,会导致死循环。
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)
不过在c11下貌似没问题,编译器会取离得最近的i,所以千万不要用c11,这个代码加上-Wall就可以看到警告
21.注意数组越界,有一次我模拟赛然后for (int i=0;i<LOG;++i) anc[u][i]=anc[anc[u][i-1]][i-1]
找了好久错。
22.如果不确定二分的边界,可以使用奇巧淫技:
23.强烈建议下标从1开始
24.关于字符串哈希,最好乘以之类的数,也可以这么写:HashVal=HashVal*26ull+(ull)(a[i]-'a'+1)
,切记。
25.最好想方设法自己hack自己,比如说构造贪心的反例之类的,但是如果你能hack掉自己,恭喜你,你凉了。
26.建议先保证算法的正确性,然后再考虑优化算法。
有一次模拟赛打了一个没有正确性的dp,过了大样例,然而成绩爆30了。
27.对拍要加srand(time(NULL))
28.对于一些题,部分分的做法是提示正解。
29.-Wl,--stack=1145141919810
然后今天真的考了。
30.对于这道题,一条链的做法是在暗示正解树上启发式合并。
对于去年的D1T3,我认为菊花图的做法也是在暗示正解的multiset上面贪心找匹配。
欢迎补充qwq。