杂项知识

下面是我整理的平时碰到的一些奇怪的错误总结的奇怪的提示,持续更新(哈哈

使用排序/查找

  1. lower_bound如果没有找到大于等于的值返回a.end()

  2. lower_bound返回值是一个迭代器,*解值,-begin()返回序列pos

  3. sort排序左闭右开区间

优先级

1
cout << (x ^ pre) << ' ';

这里一定要加括号否则报错

关于内存分配

  1. 数组的初始化时间复杂度是 O(1) ,vector是O(n)

  2. vector 比 vector能开更大的数组,因为int的内存比long long 小

  3. vector因为某些神奇原因会导致程序变慢

  4. vecotr如果你需要push进东西的话,可以提前reserve(n)

  • 本质上就是一次 内存分配,复杂度是 O(1)(严格来说是 O(n) 的内存分配,但没有逐元素初始化)用 reserve 可以一次性分配好空间,避免多次扩容和数据搬迁
  1. 在大数据量输出场景下,**endl **会因为强制刷新导致超时。用'\n' 更快,因为endl 实时输出

O2优化

不开优化可能 TLE 的典型情况:

  • vector<bool> 做标记数组。

  • 大循环里频繁调用小函数。

  • 重复计算没有手动消除。

  • 大量输出用 endl

  • 使用 STL 的慢接口(如 .at())。

  • 大数组访问模式不友好。

在比赛里,默认开 -O2 是必须的,它能帮你自动解决很多卡常问题。

  • 编译器选项中添加:g++ main.cpp -o main -O2 -std=c++23

ranges

1
2
3
4
5
6
7
8
9
10
11
12
13
ranges::sort(a);

ranges::reverse(a);

if (ranges::find(a, x) != a.end()) {
// 找到了
}

int mx = std::ranges::max(a);

int mn = std::ranges::min(a);

auto it = ranges::lower_bound(a, x);

手动实现向上/下取整

向下取整(数学 floor)

1
2
3
4
long long floordiv(long long a, long long b) {
if (a >= 0) return a / b;
return - ((-a + b - 1) / b);
}

向上取整(数学 ceil)

1
2
3
4
long long ceildiv(long long a, long long b) {
if (a >= 0) return (a + b - 1) / b;
return - ((-a) / b);
}

我的若只错误

  • 变量名重复,按照顺序命名a,b,c,d
作者

Ichooooooo

发布于

2026-01-01

更新于

2026-01-13

许可协议

评论