以史为鉴【长期置顶】
本文将记录我在OI中一些典型、极难察觉、犯过不止一次的细节或非细节错误,包括代码和考场策略方面,并作为唯一(大概率)置顶、长期置顶,以备随时查看。
-
遇事不决先看看数组开小了没。
-
对于一些需要判无解且多测的题目,一定要读完所有数据再判无解返回,要不然这组数据读不完就会读到下一组。
-
模数是\(1e9+7\)?还是\(998244353\)?甚至有题目使用\(1e8+7\)。
-
考场上我觉得对的东西不一定对,分析清楚再写,别急着写,不然可能有更能确保正确的做法,就没机会想到了。
-
最sb的行为,题没看清就乱写。你仔细看看题目让你干什么。
-
关于取模:对于类似等差数列求和之类的带有除号的公式,先除再取模。不要无脑处处取模。
-
不多测就不用管清空的事了?你看看有没有那些数组重复使用每次使用前都要清空。
-
看看一些边界情况能不能正确解决,自己要多搓几组样例测一测。
-
树形背包转移套路:\(dp_{x,i+j}=combine(dp_{x, i},dp_{y,j})\),一般提前记录\(x\)信息辅助转移以防混乱。这样方便上下界优化(\(i:0\to \min{siz_x,k}\),\(j:0\to\min{siz_y,k-i}\))以使复杂度\(O(nk^2)\to O(nk)\)。
-
为了避免红温,可以适时上厕所洗把脸,千万不要急。
-
能拿到的分,先拿到手,时刻记住目的是拿分而不是冲正解,复杂度要用计算器仔细算清楚,不知名状物千万别写,难写难调还不一定对。一定先拿分,尤其是代码不难写的时候。
-
时刻注意时间,要有紧迫感。
-
当你觉得实在没办法,瞪眼一下看看有没有性质,比如什么什么种类数\(\log\)种之类的,或者先写暴力尝试优化/DP先设状态考虑转移和优化。
-
q[read()].pb({read(), i});先读大括号里面的。。。所以这种东西,还有类似自加自减的,尽量分开写。 -
如果你有时候懒省事用了
swap,不妨看看后面需不需要换回来。。。 -
以防忘了:线段树合并,被合并的就永远消失了,再有信息会记录到新开的上,再合并也会合并上新开的。也分写法 -
建议在编译选项使用
-Wall -Wextra -Werror以查看一些可能导致错误的warning -
__builtin_popcount(x)用于\(O(1)\)求x二进制位下1的个数。 -
还有哪个傻逼像我一样到现在了还把
i和j写反。 -
关于二分:首先一定想清楚是否具有单调性;其次,有时不同的情况会有不同的决策,例如有时奇数和偶数要分开二分而不是在一个二分里讨论。

浙公网安备 33010602011771号