HDU 1255 覆盖的面积

来源:互联网 发布:使用js对url进行编码 编辑:程序博客网 时间:2024/05/04 22:39

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1255


题意:给出n个矩形求重叠的面积


思路:将扫描线的有有效长度设置为要被覆盖2次以上的区域,覆盖2次的区域可以通过覆盖一次的区域求出来比较巧妙,详细看getlen函数就好,在做过普通扫描线的题目基础上很好理解


#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define maxn 100030using namespace std;struct Tree{    int l,r;    double tsum,msum;}tree[maxn*3];struct Node{    int date;    double l,r,h;}s[maxn];int lazy[maxn*3],cnt;double pos[maxn];bool cmp(Node p,Node q){    return p.h<q.h;}void getlen(int root){    if (lazy[root]>0)     tree[root].tsum=pos[tree[root].r+1]-pos[tree[root].l];    else if (tree[root].l==tree[root].r)     tree[root].tsum=0;    else tree[root].tsum=tree[root<<1].tsum+tree[root<<1|1].tsum;    if (lazy[root]>1)     tree[root].msum=pos[tree[root].r+1]-pos[tree[root].l];    else if (tree[root].l==tree[root].r)     tree[root].msum=0;    else if (lazy[root]==1)     tree[root].msum=tree[root<<1].tsum+tree[root<<1|1].tsum;    else tree[root].msum=tree[root<<1].msum+tree[root<<1|1].msum;}void build(int root,int l,int r){    tree[root].l=l;    tree[root].r=r;    tree[root].tsum=0;    tree[root].msum=0;    if (l==r) return;    int mid=(l+r)>>1;    build(root<<1,l,mid);    build(root<<1|1,mid+1,r);}void update(int root,int l,int r,int val){    if (tree[root].l>=l && tree[root].r<=r)    {        lazy[root]+=val;        getlen(root);        return;    }    int mid=(tree[root].l+tree[root].r)>>1;    if (l<=mid) update(root<<1,l,r,val);    if (r>mid) update(root<<1|1,l,r,val);    getlen(root);}void getpoint(double x1,double x2,double h,int date){    s[cnt].l=x1;    s[cnt].r=x2;    s[cnt].h=h;    s[cnt].date=date;    cnt++;}int main(){    int t,n;    scanf("%d",&t);    while (t--)    {        cnt=0;        int num=0;        memset(lazy,0,sizeof(lazy));        scanf("%d",&n);        for (int i=0;i<n;i++)        {            double x1,x2,y1,y2;            scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);            getpoint(x1,x2,y1,1);            getpoint(x1,x2,y2,-1);            pos[num++]=x1;            pos[num++]=x2;        }        sort(pos,pos+num);        sort(s,s+cnt,cmp);        int tem=1;        for (int i=1;i<num;i++)        {            if (pos[i]!=pos[i-1]){             pos[tem++]=pos[i];//cout<<":"<<pos[tem]<<endl;            }        }        build(1,0,tem);        double res=0;        for (int i=0;i<cnt-1;i++)        {            int l=lower_bound(pos,pos+tem,s[i].l)-pos;            int r=lower_bound(pos,pos+tem,s[i].r)-pos-1;//            update(1,l,r,s[i].date);//cout<<":"<<tree[1].msum<<endl;            res+=tree[1].msum*(s[i+1].h-s[i].h);        }        printf("%.2f\n",res);    }}


0 0
原创粉丝点击