• hdu 1542 Atlantis


    题意:给出n个矩形的左下坐标和右上坐标,求出总面积。

    在写pushup函数时,没有考虑l==r的情况,wa了很久。看了其他大牛的解题报告才想起来的。╭(╯^╰)╮

    View Code
      1 #include <cstdio>
      2 #include <algorithm>
      3 using namespace std;
      4 #define lson l,m,rt<<1
      5 #define rson m+1,r,rt<<1|1
      6 #define maxn 205
      7 struct node
      8 {
      9     double len;
     10     int cnt;
     11 }setree[maxn<<2];
     12 double xx[maxn<<1];
     13 struct 
     14 {
     15     double l,r,high;
     16     int side;
     17 }mes[maxn<<1];
     18 void quicksort(int l,int r)
     19 {
     20     if(l>=r)
     21     return;
     22     int i=l,j=r;
     23     double tl=mes[l].l,tr=mes[l].r,tside=mes[l].side,thigh=mes[l].high;
     24     while(i<j){
     25         while(mes[j].high>=thigh&&i<j)
     26         j--;
     27         if(i<j){
     28             mes[i].l=mes[j].l;
     29             mes[i].r=mes[j].r;
     30             mes[i].side=mes[j].side;
     31             mes[i].high=mes[j].high;
     32             i++;
     33         }
     34         while(mes[i].high<thigh&&i<j)
     35         i++;
     36         if(i<j){
     37             mes[j].l=mes[i].l;
     38             mes[j].r=mes[i].r;
     39             mes[j].side=mes[i].side;
     40             mes[j].high=mes[i].high;
     41             j--;
     42         }
     43     }
     44     mes[i].l=tl;
     45     mes[i].r=tr;
     46     mes[i].side=tside;
     47     mes[i].high=thigh;
     48     quicksort(l,i-1);
     49     quicksort(i+1,r);
     50 }
     51 int binsearch(int l,int r,double key)
     52 {
     53     int m=(l+r)>>1;
     54     if(xx[m]==key)
     55     return m;
     56     if(xx[m]>key)
     57     return binsearch(l,m-1,key);
     58     return binsearch(m+1,r,key);
     59 }
     60 void pushup(int rt,int l,int r)
     61 {
     62     if(setree[rt].cnt)
     63     setree[rt].len=xx[r+1]-xx[l];
     64     else if(l==r)
     65     setree[rt].len=0;
     66     else
     67     setree[rt].len=setree[rt<<1].len+setree[rt<<1|1].len;
     68 }
     69 void build(int l,int r,int rt)
     70 {
     71     setree[rt].cnt=0;
     72     setree[rt].len=0;
     73     if(l==r)
     74     return;
     75     int m=(l+r)>>1;
     76     build(lson);
     77     build(rson);
     78 }
     79 void update(int l,int r,int rt,int L,int R,int cnt)
     80 {
     81     if(L<=l&&r<=R){
     82         setree[rt].cnt+=cnt;
     83         pushup(rt,l,r);
     84         return;
     85     }
     86     int m=(l+r)>>1;
     87     if(L<=m)
     88     update(lson,L,R,cnt);
     89     if(R>m)
     90     update(rson,L,R,cnt);
     91     pushup(rt,l,r);
     92 }
     93 int main()
     94 {
     95     int n,k,i,cas=1;
     96     while(scanf("%d",&n)&&n){
     97         double a,b,c,d;
     98         int m=0,k;
     99         for(i=0;i<n;i++){
    100             scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
    101             mes[m].l=mes[m+1].l=xx[m]=a;
    102             mes[m].r=mes[m+1].r=xx[m+1]=c;
    103             mes[m].high=b;
    104             mes[m].side=1;
    105             mes[m+1].high=d;
    106             mes[m+1].side=-1;
    107             m+=2;
    108         }
    109         sort(xx,xx+m);
    110         for(k=1,i=1;i<m;i++)
    111         if(xx[i]!=xx[i-1])
    112         xx[k++]=xx[i];
    113         quicksort(0,m-1);
    114         double ret=0;
    115         build(0,k-1,1);
    116         for(i=0;i<m-1;i++){
    117             int l=binsearch(0,k-1,mes[i].l);
    118             int r=binsearch(0,k-1,mes[i].r)-1;
    119             update(0,k-1,1,l,r,mes[i].side);
    120             ret+=(mes[i+1].high-mes[i].high)*setree[1].len;
    121         }
    122         printf("Test case #%d\nTotal explored area: %.2lf\n\n",cas++,ret);
    123     }
    124 }

    当然也可以先在build函数做一些改动,这样在pushup时就不用考虑l==r的情况了。

    下面是修改了的build函数

    View Code
     1 void build(int l,int r,int rt)
     2 {
     3     setree[rt].cnt=0;
     4     setree[rt].len=0;
     5     if(l==r){
     6     setree[rt<<1].len=0;
     7     setree[rt<<1|1].len=0;
     8     return;
     9     }
    10     int m=(l+r)>>1;
    11     build(lson);
    12     build(rson);
    13 }
  • 相关阅读:
    有一天,我们能这样相爱吗?
    端午节来源六说
    一个ini类代替缓存使用
    创意生活可爱香皂
    漂亮的韩国发饰
    Oracle中PL/SQL单行函数和组函数详解
    真正爱你的女人是这样的
    执子之手,与子偕老。你同意么?
    男人如茶
    Oracle SQL 內置函數大全
  • 原文地址:https://www.cnblogs.com/kim888168/p/2788720.html
Copyright © 2020-2023  润新知