坑
-
十年\(OI\)一场空,不开\(long long\)见祖宗。(要用脑子判断开不开)
-
多测不清空,亲人两行泪。
-
看清变量名,不要重复定义,更不要看错打错,不要定义太多\(a,b,c,d,e\)这样的变量名。
-
复制粘贴时一定要仔细检查,不要漏改、眼花。
-
循环变量时看好\(i,j\),逆序循环时一定是\(--\)。
-
全局定义后的变量不要在局部再次定义。
-
continue是到循环为止都不再执行,不要因为if else忘记。
-
定义数组时一定要注意是否爆int, 不要定义像 \(dp[30][500005]\) 这样的数组,还有,不要盲目复制粘贴代码。
-
memset
慎用,初始化最好for循环。 -
像 \(dp[i][j]=min(dp[i][j],dp[i+1][j]+(a[i]==k))\) 这种语句 \((a[i]==k)\) 不能拿出来另外判断!
-
链式前向星要开2倍。
-
强制在线一般都有
if(l>r) swap(l, r);
这样的语句。 -
取模最好每乘一下都取模。(尤其是 \(+=\))
-
暴搜一定要算好最大值,避免求 \(\max\) 时出锅。还有边界条件。
-
考试时不要用
endl
!!!不想换printf
就用#define endl "\n"
-
莫队无输出多半是板写错了,务必仔细检查。
-
线段树修改查询操作判断r<=mid和l>mid后面传的参数一定是lid/rid, l, r!!!
数论
-
如果无输出,很可能是N的值太大了。
-
如果输出为0,很可能没有使用init()。
-
如果模数很小,要考虑lucas定理。
-
当没有模数的时候,直接用组合的公式即可(\(f[n]/f[m]\%p/f[n-m]\%p\))。
-
如果不明情况TLE或RE,可以考虑换写法。
-
init 函数最好最大循环到 n。
一些总结:
-
求方案数时,首先考虑\(dp\),然后考虑组合数学,可以用逆向思维去想。不会就用暴搜。
-
如果树状数组无输出,多半是遇到0。
-
TLE时,可以考虑将一些数组预处理出来,一些递归函数不要重复调用(例如循环里求同一个数的逆元、线段树函数调用)。如果只超时几毫秒,可以考虑快读优化。或者endl换\n。
-
dp题里最关键的部分(影响答案的,也就是决策点),往往就是dp数组需要维护的东西。
-
一定要审清题,考试时一定不要放弃思考。
-
如果拿到题没有思路,可以手模一下样例,或者从部分分写起,试试找规律、猜结论。
-
RE
有可能是循环越界了。