zoukankan      html  css  js  c++  java
  • hdu 1542 Atlantis 矩形面积并

    总的思路是

    用线段树维护线段长度

    线段长度*h计算面积

    具体操作看代码

    因为x太大还有离散化一下

    学到了好多新姿势

    看discuss可能是后台数据有问题 数据要开到1000才能过

     1 #include<bits/stdc++.h>
     2 #define cl(a,b) memset(a,b,sizeof(a))
     3 #define debug(x) cerr<<#x<<"=="<<(x)<<endl
     4 using namespace std;
     5 typedef long long ll;
     6 
     7 const int maxn = 1000+10;
     8 
     9 int rm[maxn<<1],col[maxn<<1],add[maxn<<1];
    10 double x[maxn<<1],sum[maxn<<1];
    11 
    12 struct Line
    13 {
    14     int kind;
    15     double l,r,h;//左端点 右端点 高度
    16     Line(){}
    17     Line(double x1,double x2,double _h,int d):l(x1),r(x2),h(_h),kind(d){}
    18     friend bool operator<(Line p,Line q)
    19     { //按照高度排序
    20         return p.h<q.h;
    21     }
    22 };
    23 
    24 Line line[maxn<<1];
    25 
    26 void pushup(int l,int r,int rt)
    27 {
    28     if(col[rt])
    29     {//已经被整段覆盖
    30         sum[rt]=x[r+1]-x[l];
    31     }
    32     else if(l==r)
    33     {//l==r已经不是一条线段
    34         sum[rt]=0;
    35     }
    36     else
    37     {//没有被覆盖直接操作左右孩子
    38         sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    39     }
    40 }
    41 
    42 void update(int L,int R,int c,int l,int r,int rt)
    43 {//更新线段
    44     if(L<=l && r<=R)
    45     {
    46         col[rt]+=c;
    47         pushup(l,r,rt);
    48         return ;
    49     }
    50     int m=l+r>>1;
    51     if( L <= m ) update(L,R,c,l,m,rt<<1);
    52     if (R > m) update(L,R,c,m+1,r,rt<<1|1);
    53     pushup(l,r,rt);
    54 }
    55 
    56 int main()
    57 {
    58     int n,cas=1;
    59     while(~scanf("%d",&n)&&n)
    60     {
    61         int cnt=0;
    62         set<double>px;
    63         px.clear();
    64         for(int i=0;i<n;i++)
    65         {
    66             double x1,y1,x2,y2;
    67             scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);
    68             px.insert(x1),px.insert(x2);//离散化x轴
    69             line[cnt++]=Line(x1,x2,y1,1);//上边
    70             line[cnt++]=Line(x1,x2,y2,-1);//下边
    71         }
    72         sort(line,line+cnt);
    73         int cntx=0;
    74         for(auto i:px)
    75         {
    76             x[cntx++]=i;
    77         }
    78         double ans=0;
    79         cl(add,0),cl(sum,0);
    80         for(int i=0;i<cnt;i++) //找到每一条线段 并更新
    81         {
    82             int l=lower_bound(x,x+cntx,line[i].l)-x;
    83             int r=lower_bound(x,x+cntx,line[i].r)-x-1;
    84             update(l,r,line[i].kind,0,cntx-1,1);
    85             ans+=(sum[1]*(line[i+1].h-line[i].h));
    86         }
    87         printf("Test case #%d
    ",cas++);
    88         printf("Total explored area: %.2f
    
    ",ans);
    89     }
    90     return 0;
    91 }/*
    92 
    93 2
    94 10 10 20 20
    95 15 15 25 25.5
    96 0
    97 
    98 */
  • 相关阅读:
    AssetBundleNote
    UNet笔记
    HololensAR开发设置
    Hololens真机使用Unity开发流程
    数据结构笔记
    解决粘包问题
    使用C#中的Socket进行通讯
    解决Sql注入,防止恶意数据
    110. 平衡二叉树
    104.二叉树的最大深度
  • 原文地址:https://www.cnblogs.com/general10/p/7197461.html
Copyright © 2011-2022 走看看