• Picture 1828


    http://acm.hdu.edu.cn/showproblem.php?pid=1828

    求矩形的周长

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #define lson l,mid,i<<1
     5 #define rson mid+1,r,i<<1|1
     6 using namespace std;
     7 const int Ni = 40100;
     8 struct node{
     9     int l,r,h,s;
    10     node(){}
    11     node(int a,int b,int c,int d):l(a),r(b),h(c),s(d){}
    12     bool operator < (const node &a) const
    13     {
    14         if(h==a.h) return s > a.s;
    15        return h < a.h;
    16     }
    17 }arr[Ni];
    18 int sum[Ni*3];
    19 int num[Ni*3];
    20 int cnt[Ni*3];
    21 int lbd[Ni*3];
    22 int rbd[Ni*3];
    23 void build(int l,int r,int i)
    24 {
    25     sum[i]=num[i]=cnt[i]=0;
    26     lbd[i]=rbd[i]=0;
    27     if(l==r) return;
    28     int mid=(l+r)>>1;
    29     build(lson);
    30     build(rson);
    31 }
    32 void pushup(int l,int r,int i)
    33 {
    34     if (cnt[i]) {
    35         lbd[i] = rbd[i] = 1;
    36         sum[i] = r - l + 1;
    37         num[i] = 2;
    38     } else if (l == r) {
    39         sum[i] = num[i] = lbd[i] = rbd[i] = 0;
    40     } else {
    41         lbd[i] = lbd[i<<1];
    42         rbd[i] = rbd[i<<1|1];
    43         sum[i] = sum[i<<1] + sum[i<<1|1];
    44         num[i] = num[i<<1] + num[i<<1|1];
    45         if (lbd[i<<1|1] && rbd[i<<1]) num[i] -= 2;
    46     }
    47 }
    48 void update(int ql,int qr,int s,int l,int r,int i=1)
    49 {
    50     if(ql<=l&&r<qr)
    51     {
    52         cnt[i]+=s;
    53         pushup(l,r,i);
    54         return;
    55     }
    56     int mid=(l+r)>>1;
    57     if(ql<=mid) update(ql,qr,s,lson);
    58     if(qr>mid+1) update(ql,qr,s,rson);
    59     pushup(l,r,i);
    60 }
    61 int main()
    62 {
    63     int n,m,i;
    64     while(cin>>n)
    65     {
    66         m=0;
    67         int l=100000,r=-100000;
    68         for(i=0;i<n;i++)
    69         {
    70             int a,b,c,d;
    71             scanf("%d%d%d%d",&a,&b,&c,&d);
    72             l=min(l,a);
    73             r=max(r,c);
    74             arr[m++]=node(a,c,b,1);
    75             arr[m++]=node(a,c,d,-1);
    76         }
    77         sort(arr,arr+m);
    78         build(l,r,1);
    79         int ret=0,last=0;
    80         for(i=0;i<m;i++)
    81         {
    82             update(arr[i].l,arr[i].r,arr[i].s,l,r);
    83             ret+=num[1]*(arr[i+1].h-arr[i].h);
    84             ret+=abs(sum[1]-last);
    85             last=sum[1];
    86         }
    87         printf("%d\n",ret);
    88     }
    89     return 0;
    90 }
  • 相关阅读:
    大数据基础---Spark累加器与广播变量
    大数据基础---Spark部署模式与作业提交
    大数据基础---Spark_Transformation和Action算子
    大数据基础---Spark_RDD
    大数据基础---Spark开发环境搭建
    大数据基础---Spark简介
    利用numpy 计算信息量
    三调地类分级字典
    省/直辖市行政区代码表
    设置 Jupyter notebook 运行的浏览器
  • 原文地址:https://www.cnblogs.com/qijinbiao/p/2626207.html
Copyright © 2020-2023  润新知