OI 经验积累
发布于: 2025-10-18 更新于: 2025-10-19 分类于:  阅读次数: 

前言

OIER 生涯中大部分时间都是在调题目,但有时候很多题目确实会把我们调崩溃,怎么调也调不出来,这里有一些小建议,可以看一看。

常见

  • 记得观察题目范围,开不开 long long
  • 注意多测清空

高精度

众所周知,高精度代码又美(臭)又短(长),很容易 AC(TLE RE WA MLE),所以我们要更加认真去写(不写了)。

  • 高精度为 0 的时候不应该是空的,要有一个 0
  • 高精度的任何计算中出现 0 都容易出问题,需要在加减乘除前特判
  • 注意 + 运算位数不一样的时候要去位数大的,这时候把两个数的同位相加要注意是否有数字
  • 注意压位,有些题目用 stringMLE
  • 压位注意如果 base=9, base_pow=1e9,那么在相乘、相加容易爆 long long,要注意开 __int128
  • 在去除前导零的时候不要用 num.erase(num.end()) 可以直接 pop_back

小优化

string的累加

1
2
string s="";
for (int i=0;i<1e6;i++) s+="abs";

等价于下面的代码,并且下面的普遍比上面快:

1
2
3
ostringstream oss;
for (int i=0;i<1e6;i++) oss<<"abc";
string s=oss.str();

或者

1
s.append("abc"); // s+="abc"

map

map 的复杂度是 log 级别的,unordered_map 平均 O(1),但是容易被卡,于是可以自定义哈西函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
struct custom_hash {
static uint64_t splitmix64(uint64_t x) {
x+=0x9e3779b97f4a7c15;
x=(x^(x>>30))*0xbf58476d1ce4e5b9;
x=(x^(x>>27))*0x94d049bb133111eb;
return x^(x>>31);
}

size_t operator()(uint64_t x) const {
static const uint64_t FIXED_RANDOM=chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x+FIXED_RANDOM);
}
};

unordered_map<long long,int,custom_hash> mp; // 用法
--- 本文结束 The End ---