HDU - 1255 题目
题意: 额中文题
基本就是求矩形面积,改一点就好了。
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
using namespace std;
#define met(a,b) memset(a,b,sizeof(a))
const double eps = 10e-6;
const int maxn = 1050;
struct node
{
double x,y1,y2;int v;
node(){}
node(double a,double b,double c,int d)
{ x = a; y1 = b; y2 = c; v = d;}
}x[maxn<<1];
double y[maxn<<3]; //离散
map<double, int> id;
int cover[maxn<<3];
double len[maxn<<3] , ylen[maxn<<1];
int xnum,ynum;
bool cmp(node a,node b)
{ return a.x < b.x; }
void pre() //离散化
{
sort(x, x + xnum, cmp);
sort(y, y + ynum);
ynum = unique(y, y + ynum) - y;
for(int i = 0; i < ynum; i++)
{
id[ y[i] ] = i+1;
ylen[i+1] = i == ynum-1? 0 : y[i+1] - y[i];
}
}
void up(int ul,int ur,int id,int l,int r,int v)
{
if(r < ul || l > ur) return;
if(l >= ul && r <= ur)
{
cover[id] += v;
if(l == r)
{
if(cover[id] >= 2){len[id] = ylen[l];return;}
else {len[id] = 0; return;}
}
}
int m = l+r>>1;
if(ul <= m) up(ul, ur, id << 1, l, m, v);
if(ur > m) up(ul, ur, id<<1|1, m+1, r, v);
len[id] = len[id<<1] + len[id<<1|1];
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--)
{
xnum = 0, ynum = 0;
scanf("%d",&n);
for(int i = 1; i <= n ; i++)
{
double a,b,c,d;
scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
x[xnum++] = node(a,b,d,1); x[xnum++] = node(c,b,d,-1);
y[ynum++] = b; y[ynum++] = d;
}
pre();
double ret = 0;
double li = x[0].x, last = 0;
for(int i = 0; i < xnum; i++)
{
ret += (x[i].x-li)*last;
int id1 = id[x[i].y1], id2 = id[x[i].y2];
up(id1,id2-1,1,1,ynum,x[i].v);
last = len[1];
li = x[i].x;
}
printf("%.2f\n",ret+eps);
}
return 0;
}