#include < stdio.h > #include < stdlib.h > const int maxn = 5010 ; // 写一个线段树的过程 struct Lines_tree ...{ Lines_tree * lchild, * rchild; int m; // 测度 int cnt; // count int lines; // 连续段数 int lbd, rbd; // 左右端点是否被覆盖 int f, r; // 左右端点 } ;Lines_tree * root; struct rec ...{ int x, y, x1, y1;} r[maxn]; struct Line ...{ int x, y1, y2; int sign; Line( int a, int b, int c, int d):x(a), y1(b), y2(c), sign(d) ...{} Line( void ):x( 0 ),y1( 0 ),y2( 0 ),sign( 0 ) ...{} } line[ 2 * maxn + 10 ]; int nr; int ans; void make_tree( int a, int b, Lines_tree * node) ...{ node -> lines = 0 ; node -> m = 0 ; node -> cnt = 0 ; node -> lbd = 0 ; node -> rbd = 0 ; node -> lchild = NULL; node -> rchild = NULL; node -> f = a; node -> r = b; if (b - a > 1 ) ...{ node -> lchild = new Lines_tree; make_tree(a, (a + b) / 2 , node -> lchild); node -> rchild = new Lines_tree; make_tree((a + b) / 2 , b, node -> rchild); } } void make( int a, int b) ...{ root = new Lines_tree; make_tree(a, b, root);} void update(Lines_tree * now) // lbd, rbd, m的计算都在这个里面! ...{ if (now -> cnt > 0 ) now -> m = now -> r - now -> f; else if (now -> r == now -> f + 1 ) now -> m = 0 ; else now -> m = now -> lchild -> m + now -> rchild -> m;} void update2(Lines_tree * now) ...{ if (now -> cnt > 0 ) ...{ now -> lbd = 1 ; now -> rbd = 1 ; now -> lines = 1 ; } else if (now -> f + 1 == now -> r) ...{now -> lbd = 0 ; now -> rbd = 0 ; now -> lines = 0 ;} else ...{ now -> lbd = now -> lchild -> lbd; now -> rbd = now -> rchild -> rbd; now -> lines = now -> lchild -> lines + now -> rchild -> lines - now -> lchild -> rbd * now -> rchild -> lbd; } } void insert( int a, int b, Lines_tree * now) ...{ if (a <= now -> f && b >= now -> r) now -> cnt ++ ; if (now -> r - now -> f > 1 ) ...{ if (a < (now -> f + now -> r) / 2 ) insert(a, b, now -> lchild); if (b > (now -> f + now -> r) / 2 ) insert(a, b, now -> rchild); } update(now); update2(now);} void del( int a, int b, Lines_tree * now) ...{ if (a <= now -> f && b >= now -> f) ...{ if (a == now -> f) now -> lbd = 0 ; if (b == now -> r) now -> rbd = 0 ; now -> cnt -- ; } if (now -> r - now -> f > 1 ) ...{ if (a < (now -> f + now -> r) / 2 ) del(a, b, now -> lchild); if (b > (now -> f + now -> r) / 2 ) del(a, b, now -> rchild); } update(now); update2(now);} int cmp( const void * a, const void * b) ...{ return ( * (Line * )a).x - ( * (Line * )b).x; // 这里不要写成-> } void init() ...{ // initiation // input int i; scanf( " %d " , & nr); for (i = 0 ; i < nr; i ++ ) ...{ scanf( " %d%d%d%d " , & r[i].x, & r[i].y, & r[i].x1, & r[i].y1); line[ 2 * i] = Line(r[i].x, r[i].y, r[i].y1, 0 ); line[ 2 * i + 1 ] = Line(r[i].x1, r[i].y, r[i].y1, 1 ); } qsort(line, nr * 2 , sizeof (line[ 0 ]), cmp); // pretreatment } void work() ...{ int nowM = 0 ; int nowLine = 0 ; int lastM = 0 ; int lastLine = 0 ; int i; for (i = 0 ; i < nr * 2 ; i ++ ) ...{ if (line[i].sign == 0 ) insert(line[i].y1, line[i].y2, root); else del(line[i].y1, line[i].y2, root); nowM = root -> m; nowLine = root -> lines; ans += lastLine * 2 * (line[i].x - line[i - 1 ].x); ans += abs(nowM - lastM); lastM = nowM; lastLine = nowLine; } } void output() ...{ printf( " %d " , ans);} int main() ...{ // freopen("t.in", "r", stdin); make( - 10000 , 10000 ); init(); work(); output(); return 0 ;}