結果
問題 |
No.3005 トレミーの問題
|
ユーザー |
|
提出日時 | 2025-01-17 23:07:34 |
言語 | C# (.NET 8.0.404) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,366 bytes |
コンパイル時間 | 16,779 ms |
コンパイル使用メモリ | 171,640 KB |
実行使用メモリ | 190,368 KB |
最終ジャッジ日時 | 2025-01-17 23:08:16 |
合計ジャッジ時間 | 12,598 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 29 WA * 1 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (123 ミリ秒)。 main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
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.0001 && Math.Abs(c1.y - c2.y) < 0.0001 ? "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 }); } }