sgu 177 Square 矩形切割

来源:互联网 发布:阿里妈妈淘宝客违规 编辑:程序博客网 时间:2024/04/29 16:55

    n*n的矩形,由1*1的单位方格构成,先可以对其中的子矩形染色(黑或白),染色完成后,有多少个白色单位方格?第一次做这种题,第一眼看上去感觉应该是二维线段树....后来在网上查了查这类覆盖,统计的问题可以用矩形切割来写,果断学习到了新的姿势...大致思路就是倒着扫描每个矩形,处理每个矩形时,向后遍历判断后面的矩形是否与其重叠,重叠的话就分割冲若干种小的矩形继续处理,直到最后统计没有被覆盖的面积..实现直接看代码吧..

#include <iostream>#include <cstdio>#include <memory.h>using namespace std;typedef long long ll;int n,m;int x1[10020],x2[10020],y1[10020],y2[10020];int col[10020];char c[3];int cnt;void slove(int xs,int ys,int xt,int yt,int d,int c){    while (((xs>=x2[d])||(xt<=x1[d])||(ys>=y2[d])||(yt<=y1[d]))&& d<=m) d++;    if (d==m+1)    {        if (c) cnt+=(yt-ys)*(xt-xs);        return;    }    if (xs<x1[d])    {        slove(xs,ys,x1[d],yt,d+1,c);        xs=x1[d];    }    if (xt>x2[d])    {        slove(x2[d],ys,xt,yt,d+1,c);        xt=x2[d];    }    if (ys<y1[d]) slove(xs,ys,xt,y1[d],d+1,c);    if (yt>y2[d]) slove(xs,y2[d],xt,yt,d+1,c);}int main(){//    freopen("in.txt","r",stdin);    scanf("%d%d",&n,&m);    cnt=0;        for (int i=1; i<=m; i++)    {        scanf("%d%d%d%d",&x1[i],&y1[i],&x2[i],&y2[i]);        if (x1[i]>x2[i]) swap(x1[i],x2[i]);        if (y1[i]>y2[i]) swap(y1[i],y2[i]);        x2[i]++;        y2[i]++;        scanf("%s",c);        if (c[0]=='b') col[i]=1;        else col[i]=0;    }    for (int i=m; i>=1; i--)    {        if (col[i])        slove(x1[i],y1[i],x2[i],y2[i],i+1,1);    }    cout<<n*n-cnt<<endl;    return 0;}


0 0