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] =(面)、{ 1、2、3 }。 33 F [++ CNT] =(面)、{ 3、2、1 }。 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 }