省选专练之 CERC2017 月球的景致 Lunar Landscape

版权声明: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);
}

猜你喜欢

转载自blog.csdn.net/fcb_x/article/details/82709898
今日推荐