小柯
2019-10-06 13:22:28
这篇题解适用于不懂二维拆分的OIers.
如果你不记得一些小学学的的东西,那我来给你回忆一下:
点动成线;线动成面;面动成体
既然我们要利用前缀和将几个点刷成一个面,那么就可以先将点刷成一条线,再利用这些线刷成一个面。
横着扫一遍前缀和
竖着扫一遍前缀和
成功刷上!
#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;
}