杂项知识
下面是我整理的平时碰到的一些奇怪的错误总结的奇怪的提示,持续更新(哈哈
使用排序/查找
lower_bound如果没有找到大于等于的值返回a.end()
lower_bound返回值是一个迭代器,*解值,-begin()返回序列pos
sort排序左闭右开区间
优先级
1 | cout << (x ^ pre) << ' '; |
这里一定要加括号否则报错
关于内存分配
数组的初始化时间复杂度是 O(1) ,vector是O(n)
vector
比 vector 能开更大的数组,因为int的内存比long long 小 vector
因为某些神奇原因会导致程序变慢 vecotr如果你需要push进东西的话,可以提前
reserve(n)
- 本质上就是一次 内存分配,复杂度是 O(1)(严格来说是 O(n) 的内存分配,但没有逐元素初始化)用
reserve可以一次性分配好空间,避免多次扩容和数据搬迁
- 在大数据量输出场景下,**
endl**会因为强制刷新导致超时。用'\n'更快,因为endl 实时输出
O2优化
不开优化可能 TLE 的典型情况:
用
vector<bool>做标记数组。大循环里频繁调用小函数。
重复计算没有手动消除。
大量输出用
endl。使用 STL 的慢接口(如
.at())。大数组访问模式不友好。
在比赛里,默认开 -O2 是必须的,它能帮你自动解决很多卡常问题。
- 编译器选项中添加:g++ main.cpp -o main -O2 -std=c++23
ranges
1 | ranges::sort(a); |
手动实现向上/下取整
向下取整(数学 floor)
1 | long long floordiv(long long a, long long b) { |
向上取整(数学 ceil)
1 | long long ceildiv(long long a, long long b) { |
我的若只错误
- 变量名重复,按照顺序命名a,b,c,d