[テンプレート]三次元凸包(説明なし)

1  // luogu-判定部イネーブル-O2 
2の#include <ビット/ STDC ++ H>
 3  使用して 名前空間STDを、
4 typedefの長い ダブルLD;
5  のconst  int型 MAXN = 2E3 + 5 6つの CONSTの LDのEPS = 1E- 9 7  INT N。
8  BOOL VIS [MAXN] [MAXN]。
9  構造体PT
 10  {
 11      、LDのX、Y、Z。
12      PT(LDのA = 0、LDのB = 0、LDのC = 0 )、X(A)、Y(B)、Z(C){}
13      PTのオペレータ +(CONST PT&A){ 戻り PT(X + AX、Y + Ayを、Z + A.z);}
 14      PTの演算子 - (CONST PT&A){ 戻り PT(Z- xA.x、yA.y、AZ)。 }
 15      のPt 演算子 *(CONST PT&A){ 戻り PT(Y * AZ-Z * Ayを、Z * AX-X * Azが、* AY-Y * X アックス);}
 16      のLD 演算子&(CONST PT&A){ 戻り X * A.x + Y * A.y + zの* アリゾナ;}
 17      のLD LEN(){ 戻り SQRT(X * X + Y * Y + Z * Z);}
 18 } [MAXN]。
19  構造体の20  {
 21      のint V [ 3 ]。
22      PT正常(){ リターン([V [ 1 ] - [V [ 0 ]])*([V [ 2 ] - [V [ 0 ]]);}
 23      、LD領域(){ 戻り)(通常LEN()/ 2 ;}
 24  } F [MAXN]、[MAXN]待ちます。
25  int型のCNT;
26インラインint型見る(面A、白金B)
 27  {
 28      リターン((BA [のAv [ 0 ]])&A.normal())> 0;
29  }
 30  ボイド(解決)
 31  {
 32      F [++ CNT] =(面)、{ 123 }。
33      F [++ CNT] =(面)、{ 321 }。
34      のためには、int型 I = 4 ; iは= N <; ++ I)
 35      {
 36          INT TOT = 0 37          のためにINT J = 1 ++; J <= CNT J)
 38          {
 39              であれば(!参照(F [j]は、[I]))
 40              {
 41                  ウェイト[++ TOT] = F [J]。
42                  のためのint型のk = 0 ; K < 3 ; ++ K)
 43                      VIS [J [F] .V [K] [F [J] .V [(K + 1)%3 ] = 0 ;
44              }
 45              他の
46              {
 47                  のためのint型のk = 0 ; K < 3 ; ++ K)
 48                      VIS [J [F] .V [K] [F [J] .V [(kは+ 1)%3]] = 1 49              }
 50          }
 51          のためにINT J = 1 ; J <= CNT; ++ j)は
 52              のためにINT K = 0 ; K < 3 ; ++ K)
 53              {
 54                  INT X = F [J] .V [ k]は、YはF [J] .Vを= [(K + 1)%3 ]。
55                  であれば(VIS [X] [Y] &&(!VIS [Y] [X]))
 56                      待機[++ TOT = (顔){X、Y、I}。
57              }
 58          のためにINTJ = 1 ; J <= TOT; ++ j)は
 59の              F [J] = [j]を待ちます。
60          CNT = TOT。
61      }
 62  }
 63  のint main()の
 64  {
 65      IOS :: sync_with_stdio()。
66      CIN >> N。
67      のためにint型 i = 1 ; iが<= N ++ I)
 68          CIN >> [I] .X >> [I] .Y >> [I] .Z。
69      )(解きます。
70      LD ANS = 0 71      のためにint型 I = 1私は= CNTを<; ++ I)
 72の          ANS + = F [i]が.normal()LEN()/ 2 73      COUT << 固定 <<てSetPrecision(3)<< ANS << ENDL。
74      リターン 0 ;
75 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/GreenDuck/p/11516664.html