http://acm.hdu.edu.cn/showproblem.php?pid=1828
View Code
1 #include <cstdio>
2 #include <algorithm>
3 using namespace std;
4 const int N=20100;
5 struct segtree
6 {
7 int l,r,s,c,vl,vr,vs;
8 int m() {
9 int ans=(l+r)/2;
10 if (ans*2>l+r) ans--;
11 return ans;
12 }
13 }st[4*N];
14 struct segment
15 {
16 int y,x1,x2,v;
17 }seg[N];
18 int cmp(segment a,segment b)
19 {
20 return a.y<b.y;
21 }
22 void build(int l,int r,int rt)
23 {
24 st[rt].l=l; st[rt].r=r;
25 st[rt].s=st[rt].c=st[rt].vs=0;
26 st[rt].vl=st[rt].vr=0;
27 if (l==r) return;
28 int m=st[rt].m();
29 build(l,m,rt*2);
30 build(m+1,r,rt*2+1);
31 }
32 void pushup(int rt)
33 {
34 if (st[rt].c) {
35 st[rt].s=st[rt].r+1-st[rt].l;
36 st[rt].vs=2;
37 st[rt].vl=st[rt].vr=1;
38 }
39 else {
40 if (st[rt].l==st[rt].r)
41 st[rt].s=st[rt].vs=st[rt].vl=st[rt].vr=0;
42 else {
43 int lrt=rt*2,rrt=rt*2+1;
44 st[rt].s=st[lrt].s+st[rrt].s;
45 st[rt].vs=st[lrt].vs+st[rrt].vs;
46 if (st[lrt].vr && st[rrt].vl) st[rt].vs-=2;
47 st[rt].vl=st[lrt].vl; st[rt].vr=st[rrt].vr;
48 }
49 }
50 }
51 void update(int L,int R,int x,int rt)
52 {
53 int l=st[rt].l,r=st[rt].r;
54 if (L<=l && r<=R)
55 {
56 st[rt].c+=x;
57 pushup(rt);
58 return;
59 }
60 int m=st[rt].m();
61 if (L<=m) update(L,R,x,rt*2);
62 if (R>m) update(L,R,x,rt*2+1);
63 pushup(rt);
64 }
65 int main()
66 {
67 //freopen("data.in","r",stdin);
68 int n,i;
69 while (~scanf("%d",&n))
70 {
71 int m=0;
72 int maxx=-N,minx=N;
73 for (i=0;i<n;i++)
74 {
75 int x1,y1,x2,y2;
76 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
77 if (x1<minx) minx=x1;
78 if (x2>maxx) maxx=x2;
79 seg[m].y=y1; seg[m].v=1;
80 seg[m].x1=x1; seg[m].x2=x2;
81 m++;
82 seg[m].y=y2; seg[m].v=-1;
83 seg[m].x1=x1; seg[m].x2=x2;
84 m++;
85 }
86 sort(seg,seg+m,cmp);
87 build(minx,maxx-1,1);
88 int ans=0,last=0;
89 for (i=0;i<m;i++)
90 {
91 update(seg[i].x1,seg[i].x2-1,seg[i].v,1);
92 ans+=st[1].vs*(seg[i+1].y-seg[i].y);
93 ans+=abs(st[1].s-last);
94 last=st[1].s;
95 }
96 printf("%d\n",ans);
97 }
98 return 0;
99 }