zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    131     }
    132     return 0;
    133 
    134 }
  • 相关阅读:
    mvc的cshtml Request取不到值
    entityframework导航属性筛选
    关于引用类型一个有意思的测试
    如何去除decimal后面的零?
    webapi调用post时自动匹配参数
    entityframework删除时提示“DELETE 语句与 REFERENCE 约束”的解决方法。
    FormsAuthenticationTicket学习笔记
    mvc部署
    redis 订阅发布 事务 WATCH 乐观锁
    idea==>gitee
  • 原文地址:https://www.cnblogs.com/xiaozhuyang/p/hdu1255.html
Copyright © 2011-2022 走看看