結果
| 問題 | No.132 点と平面との距離 | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2015-01-21 00:44:47 | 
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 181 ms / 5,000 ms | 
| コード長 | 1,703 bytes | 
| コンパイル時間 | 1,110 ms | 
| コンパイル使用メモリ | 159,784 KB | 
| 実行使用メモリ | 5,376 KB | 
| 最終ジャッジ日時 | 2024-06-22 23:29:28 | 
| 合計ジャッジ時間 | 1,775 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 3 | 
ソースコード
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> VI;
typedef vector<VI> VVI;
#define REP(i, n)           for(int(i)=0;(i)<(n);++(i))
#define FOR(i, f, t)        for(int(i)=(f);(i)<(t);(++i))
const int MOD = int(1e9+7);
struct VEC3D{
    double x,y,z;
    VEC3D(){}
    VEC3D(double x, double y, double z):x(x),y(y),z(z){}
    VEC3D operator-(const VEC3D& v) const{return VEC3D(x-v.x,y-v.y,z-v.z);}
    VEC3D operator*(const VEC3D& vr) const{return VEC3D((y*vr.z)-(z*vr.y),(z*vr.x)-(x*vr.z),(x*vr.y)-(y*vr.x));}
    void norm(){double l=pow((x*x)+(y*y)+(z*z),.5);x/=l,y/=l,z/=l;}
};
struct PLANE3D{
    double a,b,c,d;
    PLANE3D(){}
    PLANE3D(double a, double b, double c, double d) :a(a),b(b),c(c),d(d){}
    PLANE3D(const VEC3D v1, const VEC3D v2, const VEC3D v3){
        VEC3D v12 = v2 - v1, v23 = v3 - v2, norm = v12 * v23;
        norm.norm();
        a=norm.x, b=norm.y, c=norm.z;
        d = v1.x * norm.x + v1.y * norm.y + v1.z * norm.z;
    }
};
double dot3d(const VEC3D &a, const VEC3D &b){
    return a.x * b.x + a.y * b.y + a.z * b.z;
}
// 点と平面の距離
double dist_d2p(const VEC3D &a, const PLANE3D &pl){
    VEC3D n(pl.a, pl.b, pl.c);
    VEC3D p(pl.a*pl.d, pl.b*pl.d, pl.c*pl.d);
    VEC3D pa = p - a;
    return abs(dot3d(n,pa));
}
int N;
VEC3D V[333];
int main(){
    cin >> N;
    double PX,PY,PZ;
    cin >> PX >> PY >> PZ;
    VEC3D P(PX,PY,PZ);
    REP(i,N){
        double x,y,z; cin >> x >> y >> z;
        V[i] = VEC3D(x,y,z);
    }
    double res = 0;
    REP(i,N)FOR(j,i+1,N)FOR(k,j+1,N){
        res += dist_d2p(P, PLANE3D(V[i],V[j],V[k]));
    }
    cout << fixed << setprecision(15) << res << endl;
    return 0;
}
            
            
            
        