技巧&注意事项合集
杂项
- OI Wiki有很多实用的东西
编程环境
- 打开Dev-C++中工具-编译选项-代码生成/优化-代码警告-显示最多警告信息的开关,可以检查出一堆傻逼错误
define O3 attribute((optimize(3))),把“O3”加到每个函数前面,如"O3 void does(int x)"
- 循环进不去就在里面输出一段字符试试看是不是真的没有进去
- Dev-C++调试的时候如果把一个不带参数的函数用鼠标选中,就会把那个函数执行一遍!
算法实现
- SPFA在while循环最后记得清空bz[x]!!!
- 正式比赛用SPFA一定要加上SLF优化,或者再加一个:把队头随机与队列中某一个交换
- 在splay上对任何一个不为根的节点进行操作后都要把它旋到根保证时间复杂度。
- 懒标记的含义应为“这个点已经更新,但儿子还未更新”
- 动态开点的线段树值域可能为负数,这个时候直接/2会出问题(l+1==r时mid会等于r),所以应该mid=(l+r)>>2,这样是取小的那个,就可以避免这种问题了。
- 两个数相乘取模时,如果那两个数本来是大于模数的,那么就会爆掉,要先模再乘
- 求点双的时候,记得判断根是不是割点
做题技巧
树上问题可以处理出dfs序/欧拉序等,转化为序列问题做
求区间数字种类一般用分块/莫队搞。
求A~B的数字是否在序列中连续排列(不要求顺序)一般找出A~B中最靠左的数和最靠右的数,若间隔为B-A+1则连续。
求树中选择点的顺序考虑转化为给每一条边定向。
曼哈顿距离和切比雪夫距离可以相互转化。https://www.cnblogs.com/zwfymqz/p/8253530.html 如果要求曼哈顿距离小于等于D的点的个数,那么可以转化为切比雪夫距离。求两点切比雪夫距离不超过D的点个数,就变为询问一个矩形内点的个数,扫描线解决。
一个一直感性理解,无法理性证明的容斥公式
判断能不能取到某个数,套路是取模后跑最短路。如
线段树不仅仅可以维护极值和sum,还可以维护很多其他的东西,比如JZOJ5060(维护最小生成树)或JZOJ6293(维护最短路)
比赛策略
- 每个程序交之前肉查三遍,一遍检查数组是否开大开小,有没有爆空间,一遍检查n与m,x与y这些有没有打反。还要检查题目要不要求模,模数是多少。
- 看完全部题的优先级高于一切,在前30分钟至少吧前三题都看完并初步思考。过50分钟左右就必须开始打了,不然时间不够。先把零散的暴力分拿满
- 不要过分相信大样例!!