for (int i = 1; i <= n; i++) { cin >> a[i]; sum[i] = sum[i - 1] + a[i]; //sum[i]表示a[1]~a[i]的累加和 } sum[r] - sum[l - 1] //应用:求l到r区间范围的a[i]的累加和
/* * 应用: * 在l~r范围的a[i]加上数值x, * 只需要修改差分数组的值,再对差分数组做前缀和就是原来的数组 */ //对应每次修改只有p[l]、p[r+1]发生改变 while (m--) { cin >> l >> r >> x; //m次修改,每次修改都是在l~r范围内的a[i]加上数值x p[l] += x; //差分数组在每次修改只有p[l]、p[r+1]发生改变 p[r + 1] -= x; } for(int i=1; i<=n; i++) p[i] += p[i-1]; //此时p[i]就是修改累计下来的结果,p[i]+a[i]就是修改之后最后的值
for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { cin >> a[i][j]; //s[i][j]表示以(1,1)作为左上角,(i,j)作为右下角构成的子矩阵内所有a[][]的累加和 s[i][j] = s[i][j - 1] + s[i - 1][j] - s[i - 1][j - 1] + a[i][j]; } /* * 应用:现在知道左上角的坐标未(i,j),右下角的坐标为(p,q),求构成的子矩阵的a[][]的累加和 * */ ans = s[p][q] - s[i - 1][q] - s[p][j - 1] + s[i - 1][j - 1]