結果

問題 No.3336 Coincidence
コンテスト
ユーザー tobisatis
提出日時 2025-11-07 22:21:28
言語 C#
(.NET 8.0.404)
結果
WA  
実行時間 -
コード長 2,911 bytes
コンパイル時間 18,172 ms
コンパイル使用メモリ 169,728 KB
実行使用メモリ 202,228 KB
最終ジャッジ日時 2025-11-07 22:21:55
合計ジャッジ時間 18,122 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other WA * 33
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (100 ミリ秒)。
  main -> /home/judge/data/code/bin/Release/net8.0/main.dll
  main -> /home/judge/data/code/bin/Release/net8.0/publish/

ソースコード

diff #

#nullable enable

#region
var _sw = new StreamWriter(Console.OpenStandardOutput()){ AutoFlush = false };
var (_input, _iter) = (Array.Empty<string>(), 0);
T I<T>() where T : IParsable<T>
{
    while (_iter >= _input.Length) (_input, _iter) = (Console.ReadLine()!.Split(' '), 0);
    return T.Parse(_input[_iter++], null);
}
#endregion

static T[] Range<T>(int n, Func<T> F) => Enumerable.Range(0, n).Select(_ => F()).ToArray();

const int Min = -100;
const int Max = -Min;

static int D(int x1, int y1, int x2, int y2) => Math.Abs(x1 - x2) + Math.Abs(y1 - y2);
static bool Inside(int x, int y, int x1, int y1, int x2, int y2)
{
    if ((x, y) == (x1, y1) || (x, y) == (x2, y2)) return false;
    var minX = Math.Min(x1, x2);
    var maxX = Math.Max(x1, x2);
    var minY = Math.Min(y1, y2);
    var maxY = Math.Max(y1, y2);
    return minX <= x && x <= maxX && minY <= y && y <= maxY;
}

(int, int)[]? Solve()
{
    var afx = I<int>();
    var afy = I<int>();
    var bfx = I<int>();
    var bfy = I<int>();
    var atx = I<int>();
    var aty = I<int>();
    var btx = I<int>();
    var bty = I<int>();
    if (Math.Abs(afx + afy) % 2 != Math.Abs(bfx + bfy) % 2) return null;
    var (rx, ry) = (1, 1);
    if (afx > bfx)
    {
        rx = -1;
        afx *= -1;
        bfx *= -1;
        atx *= -1;
        btx *= -1;
    }
    if (afy > bfy)
    {
        ry = -1;
        afy *= -1;
        aty *= -1;
        bfy *= -1;
        bty *= -1;
    }
    var (x, y) = (afx, afy);
    while (x < bfx && D(x, y, afx, afy) != D(x, y, bfx, bfy)) x++;
    if (x == bfx) while (D(x, y, afx, afy) != D(x, y, bfx, bfy)) y++;
    while (x >= afx && !Inside(x, y, afx, afy, atx, aty) && !Inside(x, y, bfx, bfy, btx, bty)) (x, y) = (x - 1, y + 1);
    if (x < afx) return null;
    var wz = new HashSet<(int, int)>();
    if (!Inside(atx, aty, x, y, -201, -201) && !Inside(btx, bty, x, y, -201, -201) && !Inside(atx, aty, x, y, 201, 201) && !Inside(btx, bty, x, y, 201, 201))
    {
        for (var xi = Min; xi < x; xi++) wz.Add((xi, y - 1));
        for (var xi = Max; xi > x; xi--) wz.Add((xi, y + 1));
        for (var yi = Min; yi < y; yi++) wz.Add((x - 1, yi));
        for (var yi = Max; yi > y; yi--) wz.Add((x + 1, yi));
    }
    else
    {
        for (var xi = Min; xi < x; xi++) wz.Add((xi, y + 1));
        for (var xi = Max; xi > x; xi--) wz.Add((xi, y - 1));
        for (var yi = Min; yi < y; yi++) wz.Add((x + 1, yi));
        for (var yi = Max; yi > y; yi--) wz.Add((x - 1, yi));
    }
    var res = wz.ToArray();
    for (var i = 0; i < res.Length; i++)
    {
        var (xi, yi) = res[i];
        res[i] = (xi * rx, yi * ry);
    }
    return res;
}

var t = I<int>();
var ans = Range(t, Solve);
foreach (var a in ans)
{
    if (a == null)
    {
        _sw.WriteLine(-1);
        continue;
    }
    _sw.WriteLine(a.Length);
    foreach (var (x, y) in a) _sw.WriteLine(x + " " + y);
}
_sw.Flush();
0