一些技巧&套路&注意事项 (持续更新)

前言:

比赛做题其实有很多的技巧和套路,还有一些奇奇怪怪需要注意的地方。

在这里,我就根据自己的经验来写一写。

 

这会是一个很大的坑。

等着以后慢慢填吧。

 

虽然说这主要是写给自己看的,

但还是希望大家看完后觉得好的点个赞。

 

正文:

1、求[l..r]方案数的一般都是转化为[1..r]-[1..l-1]。

 

2、c++很少会给你报错,所以要自己注意数组是否会越界,要不要开long long。

 

3、一些神奇的思维转换,比如说不能的个数=总数-能的个数。

 

4、打二分时要多调试几遍。

 

5、比赛时注意题目难度,一般第一题要努力想正解,第二题、第三题就尽力拿部分分。

 

6、比赛时注意时间分配,一般做一题最好不要超过一个小时,想不到正解就打暴力。

 

7、一些看上去超时的搜索在加上剪枝后能拿到很多分甚至能切掉,所以搜索要尽量打剪枝。

 

8、只要有区间覆盖的,都应该想一想差分。

 

9、不要主观臆断一个算法会超时,有些东西真的很玄学。

 

10、注意数据范围内那些奇怪的特殊数据,有时用它们来打表也可以得分,相反不注意这些的话打了正解也可能失分。

 

11、c++中位运算的优先级很低,所以最好加括号。

 

12、做题要多看几遍题目,想做法时样例要先弄懂。

 

13、有些要取模的题在卡常时可以隔几个去一次模,因为取模真的很慢。

 

14、调用数组也比较慢,至少比直接用变量慢,所以卡常时能用变量就别调用数组。

 

15、在要重复执行很多次的程序段中,最好要打得能优则优,能简则简,因为有时可能一个符号就决定你超不超时。

 

16、数组整体赋值(c++的memset,pascal的fillchar)要比用循环去赋值快一些,但也是需要较多的时间,所以能减则减。

 

17、在空间允许的情况下,不要吝啬开long long耗费的空间,感觉数值可能比较大就开long long,即使在你的估计中它不会超过2^31-1,毕竟你可能会估算错。

 

18、遇到实数类型就直接用double(pascal的extended),以防被卡精度。

 

19、线段树空间要开4n。也就是说100000个数你要开到400000的空间来存。

 

20、数据很大好像只能O(1)过的一般都是公式结论题,推不出公式可以打个暴力来找规律。

 

21、数组大小很神奇,不一定是数据越小就越快。有一次同样的程序我数组开到[1001][1001]比开到[42][22]要快很多,差不多快了整整半秒,而且重复提交多次也一样。

22、循环比较慢,所以能用一个循环做完的东西就不要分到两个循环做,尽量在一个循环里做完。有时还可以考虑这样优化一个1到n的循环:

for (int i=1;i<=n;i+=16)
{
    一次性做完i到i+15的东西。
}

这样就减少了循环次数,也是一种卡常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章