时间优化
一、调试方法
1. 输出调试
cout
是一个强大的调试工具,可以帮助我们查看程序的状态和变量的值。在调试过程中,可以使用 cout
来输出变量的值,以验证程序的正确性。(虽然是第一节课学的)
2. 构造样例
构造的样例包括下面的两种:
- 边界信息
- 特殊样例
这两种应该说是蹭分 debug 的一个工具,尤其注意分辨 continue
、break
、return 0;
。特殊样例一定要考虑极端情况。好吧,实在不行就打表
二、时间优化
1. 前缀和
1.1 概念
仅有两个元素的容斥关系如下:
∣ A ∪ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∩ B ∣ |A \cup B| = |A| + |B| - |A \cap B| ∣A∪B∣=∣A∣+∣B∣−∣A∩B∣
根据这一公式,我们可以求出二维前缀和的公式:
s i , j = s i − 1 , j + s i , j − 1 − s i − 1 , j − 1 + a i , j s_{i,j}=s_{i-1,j}+s_{i,j-1}-s_{i-1,j-1}+a_{i,j} si,j=si−1,j+si,j−1−si−1,j−1+ai,j
从而逆推出二维区间和公式:
s x 1 , y 1 ∼ x 2 , y 2 = s x 2 , y 2 − s x 1 − 1 , y 2 − s x 2 , y 1 − 1 + s x 1 − 1 , y 1 − 1 s_{x_1,y_1\sim x_2,y_2}=s_{x_2,y_2}-s_{x_1-1,y_2}-s_{x_2,y_1-1}+s_{x_1-1,y_1-1} sx1,y1∼x2,y2=sx2,y2−sx1−1,y2−sx2,y