結果

問題 No.3005 トレミーの問題
ユーザー kakel-san
提出日時 2025-01-17 23:09:39
言語 C#
(.NET 8.0.404)
結果
WA  
実行時間 -
コード長 2,378 bytes
コンパイル時間 8,539 ms
コンパイル使用メモリ 170,484 KB
実行使用メモリ 189,568 KB
最終ジャッジ日時 2025-01-17 23:09:56
合計ジャッジ時間 12,015 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 29 WA * 1
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (115 ミリ秒)。
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #

using System;
using static System.Console;
using System.Linq;
using System.Collections.Generic;

class Program
{
    static int NN => int.Parse(ReadLine());
    static int[] NList => ReadLine().Split().Select(int.Parse).ToArray();
    static int[][] NArr(long n) => Enumerable.Repeat(0, (int)n).Select(_ => NList).ToArray();
    public static void Main()
    {
        Solve();
    }
    static void Solve()
    {
        var map = NArr(4);
        for (var i = 0; i < 4; ++i)
        {
            map[i][0] *= 2;
            map[i][1] *= 2;
        }

        var p1 = Perpendicular(map[0], map[1]);
        var p2 = Perpendicular(map[1], map[2]);
        var p3 = Perpendicular(map[2], map[3]);
        var l1 = Line(p1.ra[0], p1.ra[1], p1.rb[0], p1.rb[1]);
        var l2 = Line(p2.ra[0], p2.ra[1], p2.rb[0], p2.rb[1]);
        var l3 = Line(p3.ra[0], p3.ra[1], p3.rb[0], p3.rb[1]);
        
        var c1 = Cross(l1.a, l1.b, l2.a, l2.b);
        var c2 = Cross(l2.a, l2.b, l3.a, l3.b);
        if (!c1.result || !c2.result)
        {
            WriteLine("NO");
            return;
        }
        WriteLine(Math.Abs(c1.x - c2.x) < 0.0000000001 && Math.Abs(c1.y - c2.y) < 0.0000000001 ? "YES" : "NO");
    }
    /// <summary>2点を通る直線 y = ax + b を返す</summary>
    static (double a, double b) Line(int ax, int ay, int bx, int by)
    {
        if (ax == bx) return (0, ax);
        var s = (double)(by - ay) / (bx - ax);
        return (s, ay - s * ax);
    }
    /// <summary>2直線の交点を求める 存在しないor無限に存在する場合false</summary>
    static (bool result, double x, double y) Cross(double a1, double b1, double a2, double b2)
    {
        if (a1 == a2) return (false, 0, 0);
        var x = (b2 - b1) / (a1 - a2);
        return (true, x, a1 * x + b1);
    }
    /// <summary>与えられた2点を通る垂線を通る2点を求める(各値は偶数である必要あり)</summary>
    /// <param name="a">点1</param>
    /// <param name="b">点2</param>
    /// <returns>垂線を通る2点</returns>
    static (int[] ra, int[] rb) Perpendicular(int[] a, int[] b)
    {
        var x = (b[0] - a[0]) / 2;
        var y = (b[1] - a[1]) / 2;
        return (new int[] { a[0] + x - y, a[1] + x + y }, new int[] { a[0] + x + y, a[1] - x + y });
    }
}
0