Skip to content

代码的值域问题

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,需要具体计算其值域。

特别注意

  • 在打模板时不能图快,一定要特别注意上述易错点。
  • 设定变量类型不要图快,一定要稍微考虑考虑。
  • 实在是暂时不好分析的,可以先打出注释表示没有分析。

Released under the MIT License.