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 }
原文地址:https://www.cnblogs.com/qijinbiao/p/2626207.html