记得各种类型数据范围, int爆就long long, 再爆就unsigned long long.
减法注意判断负数.
有时候0需要特殊处理.
输入给的区间范围不一定是从小到大, 可能要交换2个数字.
题目所需的inf值有可能和自己设置的不一样.
区间可能是不保证2点顺序的.
排名问题, 要注意有无并列排名.
运算符优先级用ascii画图画个表格. (注意位移和逻辑判断).
位操作优先级很低, 最好都加括号.
modulo类, 重载了^和*, 注意^运算要加括号, 因为^操作优先级很低, 但我们本意是要让其和*/一样优先级.
类内初始化成员, 建议用大括号构造.
重载比较级操作记得写2个const, 是标准形式.
类或结构体最好都有默认构造.
输入命令结构体, 多种命令可用union套struct.
一个带lambda函数的全局函数, 可以转化成一个类.
设计功能按调用情况来分, 初始化(一次调用)用函数, 多次调用用类.
有返回值的函数一定要写明返回值, 即使没有接收返回值, 否则一些环境会re.
assert fail 如果在正常的oj, 是可以re的, 用来检测数据范围恶心的情况.
tle和re可以用注释代码变wa的方法检测是哪里出问题了.
fup和fup_range不要混了.
for相关的宏, 我用了固定变量存size,length之类的量, 这样做分层bfs相当便利.如果是size会变化的情况请勿用for相关的宏.
while中的continue和for不一样, 记得做收尾操作.
搜索中, 有return的地方之前, 保持和最后一个return的收尾操作一致.
区间遍历, 从开端点到闭端点, 比如从end到begin, 用it = end; do {--it; do_something();} while (it != begin);这种情况一定是do...while形式, for和while反而不好写.
相似的变量要确保没有混用.
修改信息用引用, debug时注意看是不是少了引用.
多组输入记得clear遗留的信息.
对无答案的判定, 有时候需要用bool在必要的地方做判定, 而不是根据答案列表的长度做判定.
不要把字符$['0', '9']$写成$[0, 9]$.
字符值不要直接拿来当下标, 很可能需要映射到0起始.
下标起始1的硬要改成起始0的, 记得加减都别漏了.
n / a == m / b, 写成n * b == m * a更好, 可以直接用整型表示了.
字符串输出" \n"[i == n - 1]
, 从语法分析来看, 这是字符串数组.
string.find()
失败了, 是-1还是-1llu? 不同平台好像有不同表现, 但是string::npos
是统一的, 所以要避免写-1.
跳过空白输入, isblank只跳空格, isspace跳空格和换行, cin >> ws
能跳任何空白.
multiset的erase如果参数是值那么会删除多个结点, 删除单个结点必须使用参数为迭代器的版本.
迭代器, 平衡树中, 让begin减会re, 让end加会tle.
带pop的容器, front/top取引用后pop会gg.
unordered系列, clear是线性的, 多次clear会超时.
在hash值非常密集的情况, unordered系列在10w级别的插入就会tle.
std::stack默认用deque做容器, 内存不连续的, 问题很大, 可以考虑直接替换成vector实现或者stack模板参数改成容器是vector.
自定义类型的stack似乎不能用using, 编译报错说什么构造函数没有.
queue也是同样的容器, 也可以用vector封装一下.
关于用vector模拟stack, debug_vector分支有new失败的代码.
random_device在windows需要srand.这个东西即使在linux下也不一定能用, 所以不用了吧.
做区间第k个的搜索, 类似平衡树的操作, 在数组的版本, 注意和二分查找的区别, 循环条件是区间端点大于1个, 并且求中点需要注意是偶数长度区间中线的左边还是右边.
简单的dp都可以写个转移函数, 参数是$(now_stat, pre_stat, add_value)$.
自动机或者比较复杂的dp转移(非树型就算复杂了), 不是写成记忆化搜索的话, 最好用个临时的值存当前状态的答案, 这样就可以不用考虑转移之间的拓扑关系, 完全按照层次来转移了.
只用n位表示有可能需要n+1位的数组, 一般用0下标表示特殊初始值. 如果不想要这个0下标, 可以用-1来特判表示特殊初始值, 用-2表示不存在, 这样就避免了n位到n+1位的坐标偏移.例题cf1005d, 1409f.
图不一定用到所有的点.
图不一定连通, 也就是可能给森林或多个子图. 如果是树(给了森林), 那么n-1条边最多可有2倍的点而不是n个点.
图给出的点不一定连续.
无向图2点中间是相当于有2条边的, 如果需要边的信息且2条边信息要求同步, 最好把那个信息记录在外面.
循环性质一般和gcd有关.
百万以上的字符串输入, 我的io挂默认的buf不够长, 要重新分配长度.卡空间10mb以下的题, 也要注意, 默认空间1mb, 可以改小.
sse和avx的选项优化, 听说对矩阵乘法有奇效, 待测试.
区间参数写左闭右开的好吗? 然后内部实现写左闭右闭, 因为我的标准二分就是左闭右闭, 代码清晰.
目前我只有2种区间格式:
- [st, ed].
- [st, len).
我自己写的类似迭代器的算法参数, 是形式2, 因为迭代器ed可能很难写, 所以用更为简单的len代替了.