結果
問題 | No.622 点と三角柱の内外判定 |
ユーザー | peroon |
提出日時 | 2019-05-03 17:05:17 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 2 ms / 1,500 ms |
コード長 | 2,878 bytes |
コンパイル時間 | 1,547 ms |
コンパイル使用メモリ | 170,984 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-10 06:18:02 |
合計ジャッジ時間 | 2,425 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,812 KB |
testcase_01 | AC | 2 ms
6,944 KB |
testcase_02 | AC | 1 ms
6,940 KB |
testcase_03 | AC | 1 ms
6,940 KB |
testcase_04 | AC | 1 ms
6,940 KB |
testcase_05 | AC | 1 ms
6,940 KB |
testcase_06 | AC | 2 ms
6,944 KB |
testcase_07 | AC | 1 ms
6,940 KB |
testcase_08 | AC | 1 ms
6,940 KB |
testcase_09 | AC | 2 ms
6,940 KB |
testcase_10 | AC | 2 ms
6,944 KB |
testcase_11 | AC | 2 ms
6,940 KB |
testcase_12 | AC | 2 ms
6,940 KB |
testcase_13 | AC | 1 ms
6,940 KB |
testcase_14 | AC | 2 ms
6,944 KB |
testcase_15 | AC | 2 ms
6,940 KB |
testcase_16 | AC | 2 ms
6,940 KB |
testcase_17 | AC | 1 ms
6,944 KB |
testcase_18 | AC | 1 ms
6,944 KB |
testcase_19 | AC | 1 ms
6,940 KB |
testcase_20 | AC | 2 ms
6,940 KB |
testcase_21 | AC | 2 ms
6,940 KB |
testcase_22 | AC | 2 ms
6,940 KB |
testcase_23 | AC | 1 ms
6,940 KB |
testcase_24 | AC | 2 ms
6,940 KB |
testcase_25 | AC | 1 ms
6,940 KB |
testcase_26 | AC | 2 ms
6,940 KB |
testcase_27 | AC | 1 ms
6,944 KB |
testcase_28 | AC | 2 ms
6,944 KB |
testcase_29 | AC | 1 ms
6,944 KB |
testcase_30 | AC | 1 ms
6,944 KB |
testcase_31 | AC | 2 ms
6,940 KB |
ソースコード
#include<bits/stdc++.h> using namespace std; using ll = long long; template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; } template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; } #define FOR(i,a,b) for(ll i=(a);i<(b);++i) #define ALL(v) (v).begin(), (v).end() #define p(s) cout<<(s)<<endl #define p2(s, t) cout << (s) << " " << (t) << endl #define br() p("") #define pn(s) cout << (#s) << " " << (s) << endl #define p_yes() p("YES") #define p_no() p("NO") const ll mod = 1e9 + 7; const ll inf = 1e18; template < typename T > void vprint(T &V){ for(auto v : V){ cout << v << " "; } cout << endl; } // 3次元ベクトル struct V3{ double x, y, z; V3(double x = 0, double y = 0, double z = 0) : x(x), y(y), z(z) {} }; V3 operator+(V3 a, V3 b) { return V3(a.x + b.x, a.y + b.y, a.z + b.z); } V3 operator-(V3 a, V3 b) { return V3(a.x - b.x, a.y - b.y, a.z - b.z); } V3 operator*(V3 a, double b) { return V3(a.x * b, a.y * b, a.z * b); } V3 operator*(double b, V3 a) { return V3(a.x * b, a.y * b, a.z * b); } V3 operator/(V3 a, double b) { return V3(a.x / b, a.y / b, a.z / b); } // 内積 double dot(V3 a, V3 b) { return a.x*b.x + a.y*b.y + a.z*b.z; } // 外積 V3 cross(V3 u, V3 v) { return V3((u.y * v.z - u.z * v.y), (u.z * v.x - u.x * v.z), (u.x * v.y - u.y * v.x)); } double abs(V3 a) { double len = sqrt(a.x*a.x + a.y*a.y + a.z*a.z); if(len==0){ cout << "warning"; } return sqrt(a.x*a.x + a.y*a.y + a.z*a.z); } V3 normalize(V3 a) { if(a.x==0 && a.y==0 && a.z==0){ return a; } return a / abs(a); } V3 proj(V3 a, V3 b) { a = normalize(a); return a * dot(a, b); } void printV3(V3 a){ cout << a.x << ' ' << a.y << ' ' << a.z << endl; } ll sign(double a){ if(a>=0){ return 1; }else{ return -1; } } // 点dは三角形内部にいるか bool in_triangle(V3 a, V3 b, V3 c, V3 d){ auto AB = b-a; auto BC = c-b; auto CA = a-c; auto AD = d-a; auto BD = d-b; auto CD = d-c; auto c0 = cross(AB, AD); auto c1 = cross(BC, BD); auto c2 = cross(CA, CD); auto dot0 = dot(c0, c1); auto dot1 = dot(c1, c2); auto dot2 = dot(c2, c0); if(sign(dot0)==sign(dot1) && sign(dot1)==sign(dot2)){ return true; }else{ return false; } } int main(){ cin.tie(0); ios::sync_with_stdio(false); // input V3 V[4]; FOR(i, 0, 4){ cin >> V[i].x >> V[i].y >> V[i].z; } auto AA = V[0] - V[0]; auto AB = V[1] - V[0]; auto AC = V[2] - V[0]; auto n = cross(AB, AC); n = normalize(n); auto AD = V[3] - V[0]; auto a = AD; auto AE = a - dot(a, n) * n; bool f = in_triangle(AA, AB, AC, AE); if(f){ p_yes(); }else{ p_no(); } return 0; }