ピクチャーPOJ - 1177

矩形ポスター、写真と同じ形状の他のピクチャの数は、壁に貼り付けられます。彼らの側面は垂直または水平全てです。各矩形は、部分的または完全に他の人がカバーすることができます。すべての矩形の和集合の境界線の長さは、周辺部と呼ばれています。 

周囲を計算するプログラムを書きます。7つの長方形有する例が図1に示されています。 

対応する境界線は、図2に描かれた線分の全体集合です。 

すべての矩形の頂点が整数座標を有します。 

入力

あなたのプログラムは、標準入力から読み込むことです。最初の行は、壁に貼り付けられた矩形の数が含まれています。後続の行のそれぞれにおいて、一方が左下頂点の整数座標と各矩形の右上の頂点を見つけることができます。これらの座標の値は、x座標、y座標、続いからなる順序対として示されています。 

0 <=矩形<5000の数は、 
すべての座標は、[-10000,10000]の範囲にあり、既存の矩形は正の面積を有しています。

出力

あなたのプログラムは、標準出力に書き込むことです。出力は、入力矩形ための境界に対応する非負の整数を持つ単一の行を含んでいなければなりません。

サンプル入力

7 
-15 0 5 10 
-5 8 20 25 
15 -4 24 14 
0 16 -6 4 
2 15 10 22 
30 10 36 20 
34 0 40 16

サンプル出力

228 

分析:行をスキャン、水平線は、各スキャンの差の絶対値がこの時間をカバーするの円周長さは、現在の走査線の数* 2 *の周囲の垂直高さ
コード:
  1の#include <iostreamの>
   2の#include <アルゴリズム>
   3  使用して 名前空間STDを、
  4  CONST  INT INF = 0x3f3f3f3f   5  のconst  int型 MAXN = 2E4 + 10   6  構造体の  7  {
   8      int型のL、R。
  9      int型H;
10台の     int型のPOS。
11      ブール 演算子 <(constのエッジ&A)CONST 
12      {
 13          リターン H <ああ;
14      }
 15      エッジ(int型 A = 0INT B = 0INT C = 0INT D = 0 )、L(A)、R(B)、H(C)、POS(D){}
 16 }電子[ 5010 << 1 ]。
17  
18  構造体ノード
 19  {
 20      のint L、R。
21      のint フラグ。
22      int型のlen;
23      のint NUM;
24      int型LL、RR。
25} T [MAXN << 2 ]。
26  
27  ブール CMP(エッジ・エッジ&B)
 28  {
 29      リターン < B。
30  }
 31  
32  空隙押し上げ(INT タール)
 33  {
 34      であれば(T [タール] .flag)
 35      {
 36          T [タール] .LEN = T [タール] .R - T [タール] .L + 1 37          T [タール]の.ll = T [タール] .rr = 1 38          T [タール] .nu​​m = 1 39      }
 40       もし(T [タール] .L == T [タール] .R)
 41          T [タール] .LEN = T [タール]の.ll = T [タール] .rr = T [タール] .nu​​m = 0 42      他の
43      {
 44          T [タール] .LEN = T [タール<< 1 ] .LEN + T [タール<< 1 | 1 ] .LEN。
45          T [タール] .nu​​m = T [タール<< 1 ] .nu​​m + T [タール<< 1 | 1 ] .nu​​m - (T [タール<< 1 ] .rr&T [タール<< 1 | 1 ]の.ll)。
46          T [タール]の.ll = T [タール<< 1 ]の.ll、T [タール] .rr = T [タール<< 1 |1 ] .rr。
47      }
 48  }
 49  
50  空隙ビルド(int型 L、int型の R、INT タール)
 51  {
 52      T [タール] .L = L、T [タール] .R = R、T [タール] .flag = 0 53      T [タール] .LEN = T [タール] .nu​​m = 0 54      T [タール] .rr = T [タール]の.ll = 0 55      であれば(L == R)のリターン;
56      INT半ば=(L + R)>> 1 57      ビルド(L、中間、タール<< 1 )。
58      ビルド(ミッド+ 1、R、タール<< 1 | 1 );
59  }
 60  
61  空隙更新(int型 L、INT R、INTタール、INT V)
 62  {
 63      であれば(L == T [タール] .L && R == T [タール] .R)
 64      {
 65          T [タール] .flag + = V。
66          押上(タール)。
67          リターン;
68      }
 69      INT半ば=(T [タール] .L + T [タール] .R)>> 1 70      であれば(R <= MID)更新(L、R、タール<< 1 、V)。
71      他の 場合(L>中旬)更新(L、R、タール<< 1 | 1 、v)は、
72      他の更新(リットル、ミッド、タール<< 1、V)、更新(ミッド+ 1、R、タール<< 1 | 1 、v)は、
73      押上(タール)。
74  }
 75  
76  のint main()の
 77  {
 78      INT N。cinを>> N;
79      INT TOT = 0 80      INTX1、Y1、X2、Y2;
81      int型MAX1、MAX2。
82  
83      MAX1 = INF、MAX2 = - INF。
84      のためにint型 i = 1 ; iが<= N; iが++ 85      {
 86          のscanf(" %D%D%D%D "、&​​X1、Y1&&X2、&Y2)。
87          MAX1 = 分(MAX1、分(X1、X2))。
88          MAX2 = MAX(MAX2、MAX(X1、X2));
89          E [++ TOT =エッジ(X1、X2、Y1、 - 1 )。
90          E [++ TOT =エッジ(X1、X2、Y2、1 )。
91      }
 92      ソート(E + 1、E + 1回の + TOT、CMP)。
93      ビルド(MAX1、MAX2 - 11 )。
94  
95      INT RES = 0 96      INT最後= 0 97  
98      のためにint型 I = 1 ; I <= TOT; iが++ 99      {
 100          更新(E [I] .L、E [I] .R - 11 、E [I] .POS)。
101の          RES + = ABS(T [ 1] .LEN - 最後)。
102の          RES + =(E [I + 1 ]・H - E [I]・H)* 2 * T [ 1 ] .nu​​m。
103          最後= tの[ 1 ] .LENと、
104      }
 105      COUT << RES << ENDL。
106 }

 



おすすめ

転載: www.cnblogs.com/liuwenhan/p/11419989.html