• 城市地平线


    把N个建筑正投影到一个竖直平面上,给出N个建筑的左右坐标值和高度,计算阴影部分的面积。

    input

       第一行建筑物的个数,接下来N行,每行给出三个数, 左右坐标值 和高度。其中1,r,h《=十亿.

    output 

      面积。

     1 #include"iostream"
     2 #include"cstdio"
     3 #include"cstring"
     4 #include"algorithm"
     5 using namespace std;
     6 const int ms=50001;
     7 typedef long long LL;
     8 struct building
     9 {
    10     LL l,r,h;
    11 }line[ms];
    12 LL node[ms*2];
    13 struct tree
    14 {
    15     LL l,r,h;
    16 }treenode[ms*4];
    17 bool cmp(const building &a,const building &b)
    18 {
    19     return a.h<b.h;
    20 }
    21 void init(int n);
    22 void build(LL l,LL r,int p);
    23 void insert(LL l,LL r,LL value,int p);
    24 LL search(int p);
    25 int main()
    26 {
    27     int n;
    28     scanf("%d",&n);
    29     init(n);
    30     build(1,node[0],1);
    31     for(int i=1;i<=n;i++)
    32         insert(line[i].l,line[i].r,line[i].h,1);
    33     printf("%I64d
    ",search(1));
    34     return 0;
    35 }
    36 void init(int n)
    37 {
    38     memset(treenode,0,sizeof(treenode));
    39     memset(node,0,sizeof(node));
    40     memset(line,0,sizeof(line));
    41     for(int i=1;i<=n;i++)
    42     {
    43         scanf("%I64d%I64d%I64d",&line[i].l,&line[i].r,&line[i].h);
    44         node[i*2-1]=line[i].l;
    45         node[i*2]=line[i].r;
    46     }
    47     sort(line+1,line+1+n,cmp);
    48     int j=1;
    49     sort(node+1,node+2*n+1);
    50     for(int i=1;i<=2*n;i++)
    51     {
    52         if(node[i]!=node[j])
    53             node[++j]=node[i];
    54     }
    55     node[0]=j;
    56     return ;
    57 }
    58 void build(LL l,LL r,int p)
    59 {
    60     treenode[p].l=node[l];
    61     treenode[p].r=node[r];
    62     //cout<<p<<" : "<<node[l]<<" : "<<node[r]<<endl;
    63     if(l+1==r)
    64         return ;
    65     int mid=(l+r)/2;
    66     build(l,mid,2*p);
    67     build(mid,r,2*p+1);
    68     return ;
    69 }
    70 void insert(LL l,LL r,LL value,int p)
    71 {
    72     if(l<=treenode[p].l&&treenode[p].r<=r)
    73     {
    74         treenode[p].h=value;
    75         return ;
    76     }
    77     if(treenode[p].h>0)
    78         treenode[p*2].h=treenode[2*p+1].h=treenode[p].h;
    79     treenode[p].h=-1;
    80     if(r>treenode[2*p].r)
    81         insert(l,r,value,p*2+1);
    82     if(l<treenode[2*p].r)
    83         insert(l,r,value,2*p);
    84     return ;
    85 }
    86 LL search(int p)
    87 {
    88     if(treenode[p].h>0)
    89         return treenode[p].h*(treenode[p].r-treenode[p].l);
    90     if(treenode[p].h==0)
    91         return 0;
    92     return (search(2*p)+search(2*p+1));
    93 }

      

  • 相关阅读:
    Android 使用WebView显示网页
    Android 使用ProgressBar实现进度条
    Android 使用Spinner实现下拉列表
    Android 使用GridView以表格的形式显示多张图片
    Android 使用DatePicker以及TimePicker显示当前日期和时间
    Android 使用ListView显示信息列表
    IIS配置步骤,绝对有用,百度上的不全面,是百度的补充
    冒烟测试
    广度优先和深度优先
    排序算法二(时间复杂度为O(N*logN))
  • 原文地址:https://www.cnblogs.com/767355675hutaishi/p/3906577.html
Copyright © 2020-2023  润新知