版权声明:LeoJAM Presents https://blog.csdn.net/fcb_x/article/details/82709898
一个卫星正在为探测车在月球上寻找一个合适的降落区。降落区被看做在平面直角坐标系中的一个方形区域。
这颗卫星已经照了n张照片,每张照片都涵盖了月球表面的一块正方形区域。经过对相机的精细校准,可以保证所有照片涵盖的区域都和坐标对齐——正方形四个角的坐标都为整数。由于卫星的轨道一直在变化,所以照片有两种形式: ·A类照片的边缘和坐标轴平行。对于这样的照片,题目将会给出它中心的坐标(x,y)和它的边长a(a为偶数)。 ·B类照片的边缘和坐标轴呈45°角。对于这样的照片,题目将会给出它中心的坐标(x,y)和它对角线的长度d(d为偶数)。
额。很明显扫描线还是没有融会贯通
我只会方向正常的这种斜起来的就玩不转了
考虑x,y挺小的直接覆盖法
分两种情况淹没
合并比较离奇
为方便转移,我们可以二进制状态压缩
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=4200;
const int K=2010;
int A[N][N],B[N][N];
int F[N][N];
int n;
int main(){
// freopen("test.in","r",stdin);
// freopen("test.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;++i){
char opt[3];
int x,y,d;
scanf("%s%d%d%d",opt,&x,&y,&d);
x+=K;
y+=K;
if(opt[0]=='A'){
x-=(d/2);
y-=(d/2);
++A[x][y];
++A[x+d][y+d];
--A[x+d][y];
--A[x][y+d];
}
else{
++B[x][y-(d/2)];
++B[x][y+(d/2)];
--B[x-(d/2)][y];
--B[x+(d/2)][y];
}
}
for(int i=1;i<=N-1;++i){
for(int j=1;j<=N-1;++j){
A[i][j]+=(A[i-1][j]+A[i][j-1]-A[i-1][j-1]);
if(A[i][j])F[i][j]|=15;
}
}
for(int j=1;j<=N-1;++j){
for(int i=1;i<=N-1;++i){
B[i][j]+=B[i-1][j-1]+B[i+1][j-1];
if(j>=2)B[i][j]-=B[i][j-2];
if(B[i][j]){
F[i][j]|=12;
F[i][j+1]|=9;
F[i-1][j]|=6;
F[i-1][j+1]|=3;
}
}
}
int ans=0;
for(int i=1;i<=N-1;++i){
for(int j=1;j<=N-1;++j){
for(int k=0;k<4;++k){
if((F[i][j]>>k)&1)ans++;
}
}
}
printf("%.2lf",0.25*ans);
}