差分(地毯)
题目描述
在 n\times nn×n 的格子上有 mm 个地毯。
给出这些地毯的信息,问每个点被多少个地毯覆盖。
输入格式
第一行,两个正整数 n,mn,m。意义如题所述。
接下来 mm 行,每行两个坐标 (x_1,y_1)(x1,y1) 和 (x_2,y_2)(x2,y2),代表一块地毯,左上角是 (x_1,y_1)(x1,y1),右下角是 (x_2,y_2)(x2,y2)。
输出格式
输出 nn 行,每行 nn 个正整数。
第 ii 行第 jj 列的正整数表示 (i,j)(i,j) 这个格子被多少个地毯覆盖。
#include <bits/stdc++.h> using namespace std; //与前缀和对应的一种算法 //差分--->将三重循环降低到两重循环 const int maxn = 1e3+5; int mp[maxn][maxn]; int x_1,x_2,y_1,y_2; int n,m; int main(){ cin>>n>>m; //对行进行差分 for(int i=0;i<m;i++){ cin>>x_1>>y_1>>x_2>>y_2; //差分的意义在于降低了修改的时间复杂度 for(int j=x_1;j<=x_2;j++){ mp[j][y_1]++; mp[j][y_2+1]--; } } //由差分汇总,然后输出 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ mp[i][j] +=mp[i][j-1]; cout<<mp[i][j]; if(j!=n){ cout<<" "; } else{ cout<<endl; } } } return 0; }