题解 P5542 【[USACO19FEB]Painting The Barn】

小柯

2019-10-06 13:22:28

题解

这篇题解适用于不懂二维拆分的OIers.

思路

如果你不记得一些小学学的的东西,那我来给你回忆一下:

点动成线;线动成面;面动成体

既然我们要利用前缀和将几个点刷成一个面,那么就可以先将点刷成一条线,再利用这些线刷成一个面。

(red:+1;blue:-1;yellow:+2)

横着扫一遍前缀和

竖着扫一遍前缀和

成功刷上!

代码

#include<iostream>
using namespace std;
int n,k;
int a[1005][1005];
int x1,y1,x2,y2;
int ans;
int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>x1>>y1>>x2>>y2;
        x1++,y1++,x2++,y2++;
        a[x1][y1]++;
        a[x1][y2]--;
        a[x2][y1]--;
        a[x2][y2]++;
    }
    for(int i=1;i<=1001;i++)for(int j=1;j<=1001;j++)a[i][j]+=a[i][j-1];
    for(int i=1;i<=1001;i++)for(int j=1;j<=1001;j++)a[i][j]+=a[i-1][j];
    for(int i=1;i<=1001;i++)for(int j=1;j<=1001;j++)ans+=(a[i][j]==k);
    cout<<ans<<endl;
    return 0;
}