题意:
求矩形合并的总面积。
思路:
想练一下离散化专门找的题目。
很好的一道题,没用线段树,因为N=100,所以直接离散化则可以O(N^2)求出。
更具体的可以参看下面链接:
http://www.cppblog.com/RyanWang/archive/2009/02/22/74612.html
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#define Abs(a) ((a)>0?(a):-(a))
#define Mod(a,b) (((a)-1+(b))%(b)+1)
using namespace std;
const int N=105;
double rect[N][4];
int n;
double X[N<<1];
double Y[N<<1];
int XY[N<<1][N<<1];
int cases=1;
void solve()
{
memset(XY,0,sizeof(XY));
for(int k=1;k<=n;k++)
{
int x1,y1,x2,y2;
for(int i=1;i<=(n<<1);i++)
{
if(X[i]==rect[k][0])
{
x1=i;
break;
}
}
for(int i=1;i<=(n<<1);i++)
{
if(X[i]==rect[k][2])
{
x2=i;
break;
}
}
for(int i=1;i<=(n<<1);i++)
{
if(Y[i]==rect[k][1])
{
y1=i;
break;
}
}
for(int i=1;i<=(n<<1);i++)
{
if(Y[i]==rect[k][3])
{
y2=i;
break;
}
}
for(int i=x1;i<x2;i++)//注意这里是小于号
for(int j=y1;j<y2;j++)
{
XY[i][j]=1;
}
}
double ans=0;
for(int i=1;i<=(n<<1);i++)
for(int j=1;j<=(n<<1);j++)
{
ans+=XY[i][j]*(X[i+1]-X[i])*(Y[j+1]-Y[j]);
}
printf("Test case #%d\n",cases++);
printf("Total explored area: %.2lf\n\n",ans);
}
int main()
{
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
{
scanf("%lf%lf%lf%lf",rect[i],rect[i]+1,rect[i]+2,rect[i]+3);
X[(i<<1)-1]=rect[i][0];
X[(i<<1)]=rect[i][2];
Y[(i<<1)-1]=rect[i][1];
Y[(i<<1)]=rect[i][3];
}
sort(X+1,X+(n<<1)+1);
sort(Y+1,Y+(n<<1)+1);
solve();
}
return 0;
}