HDU

来源:互联网 发布:网络交友英语作文题目 编辑:程序博客网 时间:2024/06/16 00:42

 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;}