降智瞬间
我菜死了qwq
1、map的正确使用方法
map<int,int>M;
M[3]=0;
if (M[n]) cout<<M[n];
else puts("-1");
(调一晚上)
2、初值的正确选取
//值域1e18
ll ans=1e9;
rep(i,1,n) chkmin(ans,solve(i));
(省选挂40分,导致心态爆炸)
3、正确使用模数
题目没说\(gcd(n,mod)=1\)或\(n<mod\)或\(mod\in Prime\)就别瞎想!
(naive地认为自己切了题)
4、线段树合并的正确使用方法
一定要想明白k1为空时怎么办、k2为空时怎么办。如果想不清楚就尝试用树上启发式合并等暴力一些的方法。
(PKUSC挂100分,没约滚蛋)
5、矩阵乘法的正确用法
你就是生成函数学傻了不记得有矩阵乘法这种东西了吧!!
不能忽略\(n\)很大的时候除了瞎推式子还可以矩乘!
(被全机房diss)
6、区间DP的正确写法
大家都知道区间DP的\(O(n^3)\)做法是枚举断点。
但你不要忘了有些题可以只挪一步!
(模拟赛少39分,讲题时被公开处刑)
7、数据分治的正确写法
有的时候为了省事,可能读入放在一起搞定,然后再分暴力或是特殊情况。
然而,你的数组开的是暴力大小还是极限数据的大小呢?
(日常挂分,次数过多,记不来了)
8、右移的正确用法
有的时候int
范围的数据为了拆出每一位,可能为了保险,一直搞到了32。
然而,你可知道,3>>32=3
?(不开O2
)
你可知道,3>>33=1
?(同样不开O2
)
你可还知道,3>>1048577=1
?(同样不开O2
)
(模拟赛正解挂成60)
9、正确使用数组
你可听说过MLE这种本机编译通过、对拍拍不出来的东西?
交题前一定要检查空间!
(模拟赛60分变0分)
10、正确使用哈希
据说在串的个数大于根号的时候就很容易冲突了,就会爆了。
所以要双模数!
(模拟赛100变90)
uptdate:又一次模拟赛被卡掉了……我tm果然不长脑子……
11、正确使用STL
开1e6个map或set的时候会空间/时间直接爆炸……
(某大佬NOI挂100)
一个 unordered_map 存 2e6 个元素也会析构的时候时间爆炸,map 可能也是。
(一道破题调一天)
12、正确使用cin
由于对scanf读字符串怀有恐惧,我喜欢用cin。
然后模拟赛读1e6个字符串就被卡死了。
(模拟赛100变9)
upd:我又被卡掉了……我tm果然不长脑子……
事实证明 cin
读 \(10^5\) 个长度为 \(10\) 的串,或是读 \(10^6\) 个字符,都是没法在 3s 里面跑过去的。
13、模拟赛正确时间分配
对于普通5h的省选模拟赛,可能我这种暴力选手不会有什么感觉。
但是noipCSP的3.5h的打法一定要注意时间!T3除非是最裸的暴力不然一定要给够时间!
(模拟赛多次T3爆零)
update:现在 4h 4 题就更容易爆炸了。
14、菜鸡的数论小笔记
\(x^{n}\equiv x^{n\% \varphi(p)+\varphi(p)} \pmod{p},n>\varphi(p)\),不需要\(\gcd(x,p)=1\)。
(模拟赛浪费1h+)
15、sort的选择
当cmp函数不是\(O(1)\)的时候,可以考虑把sort
改成stable_sort
,可能会对常数带来不小的优化。
(完全一样的做法被卡TLE)
16、自适应辛普森积分
比如在积圆的面积并的时候,可能有一个很小的圆,摆在一个很大的圆旁边,而这个很大的圆的某一段刚好和二次函数非常相像,那么这个小圆可能就会因为没有任何一个 \(y\) 切到它而被忽略。
又或者是没有按 \(y\) 的连续段分开计算,可能坐标系中只有一个小圆,但是几个 \(y\) 都没有切到它,就直接返回 0 了。
所以要特判:只有在 \(r-l<1\) 的时候才允许返回,否则强行向下递归。 由于能辛普森积分的题应该一般坐标范围不会太大,所以应该不会导致复杂度升高。
17、多组数据清空小技巧
多组数据,有时需要提前退出时,最好写个 clr()
,再 #define GG return clr(),puts("-1"),void()
,防止自己退出时忘记清空并爆零两行泪。
18、STL 的正确使用方法再放送
定义大概 \(10^6\) 次 queue 已经可以用到大约 1s 时间,如果复杂度是 \(O(n^2)\) 的最好手写。
emplace_back
有时会比 push_back
快很多。
vector 的 clear
操作并不会释放空间,所以可能会莫名其妙地 MLE 。
19、记得取模
计数时,如果把方案数直接设为 \(n,l,r\) 等数,一定要记得取模。
20、神必精度误差
(long long)(1e18+5)
会返回 \(10^{18}\) 而把 5 吞掉。。
21、多次 BSGS
用脚指头想一想都可以想到复杂度是 \(O(\sqrt{Tmod})\) 而不是 \(O(T\sqrt{mod})\) 。
22、多组数据特判
读完!读完!
2021.5.20 我做梦都没想到临近退役我还能再犯一次这个错误。
23、边分治
虽然没错过但还是要记一下。
三度化的时候会把一个点的儿子挂在一条链上。此时就会存在一条路径经过了这条链并进入了两个儿子的子树,但是并没有把父亲点的贡献计入。
所以在贡献是关于点的时候边分治还是要三思而后行。点分治+哈夫曼树可能会更好使。
24、正确使用 vector
因为 vector 神必的空间分配方式,一次 push_back 之后原来所有的指针/迭代器可能都爆炸了。