hdu1255 覆盖的面积 线段树+里离散化求矩形面积的交

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

求矩形面积的交的线段树题目,刚做了求并的题目,再做这个刚觉良好啊,只要再加一个表示覆盖次数大于1次的长度变量即可

代码:

  1 #include<iostream>
  2 #include<cstdlib>
  3 #include<cstdio>
  4 #include<cstring>
  5 #include<algorithm>
  6 using namespace std;
  7 const int maxn=2020;
  8 class node
  9 {
 10    public:
 11    int l,r;
 12    int c;
 13    double cnt;
 14    double more ;//表示被覆盖次数大于一次的长度
 15    double lf,rf;
 16 };
 17 node segTree[maxn*3];
 18 class line
 19 {
 20     public:
 21     double x,y1,y2;
 22     int f;
 23 };
 24 line  le[maxn*2];
 25 bool cmp(line a, line b)
 26 {
 27      return a.x< b.x;
 28 }
 29 double y[maxn*2];
 30 
 31 void build(int num,int l, int r)
 32 {
 33         segTree[num].l=l;
 34         segTree[num].r=r;
 35         segTree[num].cnt=0;
 36         segTree[num].more==0;   
 37         segTree[num].lf=y[l];
 38         segTree[num].rf=y[r];
 39         if(l+1==r) return;
 40         int mid=(l+r)/2;
 41         build(num*2,l,mid);
 42         build(num*2+1,mid,r);
 43 
 44 }
 45 
 46 void calen(int num)
 47 {
 48       if(segTree[num].c >=2)
 49       {
 50           segTree[num].more=segTree[num].cnt=segTree[num].rf-segTree[num].lf;
 51           return ;
 52       }
 53       else if(segTree[num].c==1)
 54            {
 55              segTree[num].cnt=segTree[num].rf-segTree[num].lf;
 56              if(segTree[num].l+1 ==segTree[num].r) segTree[num].more=0;
 57              else segTree[num].more=segTree[num*2].cnt+segTree[num*2+1].cnt;
 58            }
 59           else
 60            {
 61              if(segTree[num].l+1 ==segTree[num].r )
 62               {
 63                 segTree[num].cnt=segTree[num].more=0;
 64               }
 65              else 
 66              {  
 67                 segTree[num].cnt=segTree[num*2].cnt+segTree[num*2+1].cnt;
 68                 segTree[num].more=segTree[num*2].more+segTree[num*2+1].more;
 69              }
 70          }
 71 }
 72 void update(int num, line e)
 73 {
 74    if(e.y1 == segTree[num].lf && e.y2==segTree[num].rf)
 75    {
 76         segTree[num].c+=e.f;
 77         calen(num);
 78         return ;
 79    }
 80    if(e.y2 <= segTree[num*2].rf) update(num*2,e);
 81    else if(e.y1 >= segTree[num*2+1].lf) update(num*2+1,e);
 82    else
 83         {
 84             line temp=e;
 85             temp.y2=segTree[num*2].rf;
 86             update(num*2,temp);
 87             temp=e;
 88             temp.y1=segTree[num*2+1].lf;
 89             update(num*2+1,temp);
 90         }
 91         calen(num);
 92 }
 93 int main()
 94 {
 95     int t;
 96     int n;
 97     double x1,x2,y1,y2;
 98 
 99     scanf("%d",&t);
100     while(t--)
101     {
102        scanf("%d",&n);
103        int num=1;
104        for(int i=1;i<=n;i++)
105        {
106           scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
107           le[num].x=x1;
108           le[num].y1=y1;
109           le[num].y2=y2;
110           le[num].f=1;
111           y[num]=y1;
112           num++;
113           le[num].x=x2;
114           le[num].y1=y1;
115           le[num].y2=y2;
116           le[num].f=-1;
117           y[num]=y2;
118           num++;
119        }
120        sort(le+1,le+num,cmp);
121        sort(y+1,y+num);
122        build(1,1,num-1);
123        update(1,le[1]);
124        double ans=0;
125        for(int i=2;i<num;i++)
126        {
127             ans+=segTree[1].more*(le[i].x - le[i-1].x);
128             update(1,le[i]);
129        }
130        printf("%.2lf\n",ans);
131     }
132     return 0;
133 
134 }

 

posted on 2013-10-07 16:37  GyyZyp  阅读(180)  评论(0编辑  收藏  举报

导航