代码的值域问题
C++ 变量类型及对应范围
变量类型 | 范围 |
---|---|
char | [-128, 127] |
unsigned char | [0, 255] |
short | [-2^15, 2^15 - 1] |
unsigned short | [0, 65535] |
int | [-2^31, 2^31 - 1] >= [-2e9, 2e9] |
unsigned int | [0, 2^32 - 1] |
long long | [-2^63, 2^63 - 1] >= [-9e18, 9e18] |
ull | [0, 2^64 - 1] |
double | 有效位数 16 位 |
long double | 有效位数 19 位 |
模意义下运算
- 首先,在写代码时应非常清楚两个数相乘的值域,开对应的范围。
- 对于任何一个新给出的数据,都要取模。
- 如果要优化取模次数,一定要确认最后取了模。
一般意义下的运算
变量/数组范围估计
在开每一个变量/数组之前,都必须估计其范围:
- 如果比较显然或之前算过,可以直接开出。
- 否则,必须在注释中打出其范围。
注意:实际答案取值范围是所有可能算出的值的范围。
运算结果范围估计
进行运算之前,都必须估计其结果范围:
- 直接用两个变量的范围运算一下即可。
- 如果不太显然,就要打在注释中。
复杂情况分析(线段树节点的 tag)
- 注意到 tag 的每个历史版本值再加上储存值都是实际答案取值范围。
- 所以容易分析出其 tag 就是最大变化量,计算即可。
- 对于一般的 tag,需要具体计算其值域。
特别注意
- 在打模板时不能图快,一定要特别注意上述易错点。
- 设定变量类型不要图快,一定要稍微考虑考虑。
- 实在是暂时不好分析的,可以先打出注释表示没有分析。