CCF- CSP 201409-2画图 前缀和算法 满分题解
链接:201409-2画图
思路:
- 判断单一矩阵的涂色,实际就是求两个坐标所围成的面积,容易想到二维前缀和算法:将该矩阵范围内的所有点的值+1
- 最后对所有的点求前缀和,当该点的值不为0时,即表明该点有颜色
- 细节注意: 点的坐标可能为0,因此最后求和时下标从1开始,则在初始化时,需要将整个矩阵向右上方平移一个单位
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110;
int g[N][N];
int n;
int main()
{
cin>>n;
while(n--)
{
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
//为了避免后续求前缀和时出现越界,整体向右上平移一个单位
x1++;
y1++;
g[x1][y1]+=1;
g[x1][y2+1]-=1;
g[x2+1][y1]-=1;
g[x2+1][y2+1]+=1;
}
int ans = 0;
//整体边界为1~101
for(int i=1;i<=101;i++)
{
for(int j=1;j<=101;j++)
{
g[i][j] = g[i-1][j]+g[i][j-1]-g[i-1][j-1]+g[i][j];//前缀和算法
if(g[i][j])ans++;//当前点有颜色
}
}
cout<<ans<<endl;
}
//2
//1 1 4 4
//2 3 6 5