けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 362 B - Right Triangle (6Q, 灰色, 200 点)

三平方の定理を思い出そう!

問題概要

座標平面上の 3 個の格子点  A(x_{A}, y_{A}), B(x_{B}, y_{B}), C(x_{C}, y_{C}) が与えられる。

これら 3 点  A, B, C が直角三角形をなすかどうかを判定せよ。

制約

  • 座標値は -1000 以上 1000 以下

考えたこと

3 点 A, B, C が直角三角形をなす条件は

  •  AB^{2} = BC^{2} + CA^{2}
  •  BC^{2} = CA^{2} + AB^{2}
  •  CA^{2} = AB^{2} + BC^{2}

のいずれかを満たすことである。もしくは、 AB, BC, CA のうちの最大値がわかっていれば、判定をより容易にできる。たとえば、 AB が最大であれば、直角三角形をなす条件は


 AB^{2} = BC^{2} + CA^{2}


と書ける。

今回の問題の場合、まずは  AB^{2}, BC^{2}, CA^{2} の値を求めよう。そして、上の式を満たすかどうかを check すればよい。

おまけ: AB^{2} の求め方

一般に 2 点  A(x_{A}, y_{A}), B(x_{B}, y_{B}) を結ぶ線分の長さの 2 乗は

 AB^{2} = (x_{A} - x_{B})^{2} + (y_{A} - y_{B})^{2}

によって求められる。

コード

#include <bits/stdc++.h>
using namespace std;

int main() {
    long long xa, ya, xb, yb, xc, yc;
    cin >> xa >> ya >> xb >> yb >> xc >> yc;
    
    vector<long long> A(3);
    A[0] = (xa - xb) * (xa - xb) + (ya - yb) * (ya - yb);
    A[1] = (xb - xc) * (xb - xc) + (yb - yc) * (yb - yc);
    A[2] = (xc - xa) * (xc - xa) + (yc - ya) * (yc - ya);
    sort(A.begin(), A.end());
    if (A[2] == A[0] + A[1]) cout << "Yes" << endl;
    else cout << "No" << endl;
}