OI 方法论
- 分析问题性质
- 问题建模
- 加速求解
- c++语言实现
分析问题性质
二选一:2-sat
区间问题:树状数组,线段树(优化建图),前缀和,差分
最大的最小值,最小的最大值:二分答案
多个状态的值:可持久化数据结构
往往找出问题性质,是解题的突破口
性质的工具——美妙的数学
注意不等式两边同乘负数变号
注意细节
问题建模
网络流模型
动态规划
转化图论问题
加速求解
矩阵快速幂加速递推
c++语言实现
细节决定成败
c++语言
变量名:
代码结构化技巧:namespace
struct
class
不要把多个变量设一个名字
空间
数组要开够,空间复杂度要精确到数组,质数判断要注意范围,太大只能根号n
图论:双向边要开两倍空间
时间
大输入问题要快读,大输出要快写
数据范围
十年 O I 一场空,不开 long long 见祖宗
-
long long int 相乘加
1ll
-
慎用格式强制转换
-
输出 long double 使用 %Lf
运算符优先级
小心按位与,或,异或 超低的优先级搞坏程序
其他
-
++it返回it+1;it++返回it
-
a[20]的数组只允许访问a[0~19]调用a[20]会访问无效内存
-
函数写完要调用,我有一个同学经常线段树build不调用
-
有返回值的函数写return
考前练习技巧
题解
抄题解不要抄错行
看题解不要只看标程,看思路
不要只看一篇题解
刷题
要审题,有些题目题意相似,但是细节不同
审题部分
取模
- 加法
a=(a+b)%mod
- 乘法
a=a*b%mod
- 减法
a=(a-b+mod)%mod
- 除法
a=a*inv[b]%mod
- 快速幂
a=ksm(a,b,mod)
有些题目要求在线,要对应修改ans,以备下次异或。有些特判0输出也要修改答案。
多测
比如建立虚树前把上一个虚树删除
- 链式前向星,清空tot,清空head,不需要清空edge
有些题目的编号从0开始,要变成自己习惯的输入
调试技巧
原则
调试时一定要究根问底,发现一个bug,但是还要发现更多bug
因为你会不止写出一个bug
核心模块检查优先
-
dp的转移方程式
-
线段树,平衡树的
pushup
pushdown
技巧模块次之
-
二分的边界 lower_bound还是upper_bound
-
双指针是空心还是实心(闭区间还是开区间)
清楚代码对象
-
边还是点
-
区间还是元素
相近的变量名
-
不要n,m写错
-
队列 h 和 t 不要写反
-
不要ldat,rdat,dat写串
调试效率相关
对于多问先独立出来询问,看是不是多测没清空
对拍
OIer基本技能
参考资料
STO STO STO JULAO ORZ ORZ ORZ
https://www.luogu.com.cn/blog/SpreadWings/oi-xie-ti-ji-ben-fang-fa-lun#
https://www.luogu.com.cn/blog/command-block/
https://www.cnblogs.com/flashhu
标签:www,方法论,OI,题解,long,https,com,mod From: https://www.cnblogs.com/life-of-a-libertine/p/18011881