結果

問題 No.3292 World Map Distance
ユーザー kakel-san
提出日時 2025-10-03 22:30:40
言語 C#
(.NET 8.0.404)
結果
AC  
実行時間 624 ms / 3,000 ms
コード長 3,803 bytes
コンパイル時間 6,809 ms
コンパイル使用メモリ 169,812 KB
実行使用メモリ 267,128 KB
最終ジャッジ日時 2025-10-03 22:31:04
合計ジャッジ時間 17,159 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 34
権限があれば一括ダウンロードができます
コンパイルメッセージ
  復元対象のプロジェクトを決定しています...
  /home/judge/data/code/main.csproj を復元しました (82 ミリ秒)。
  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();
    static int[] NMi => ReadLine().Split().Select(c => int.Parse(c) - 1).ToArray();
    static int[][] NMap(int n) => Enumerable.Repeat(0, n).Select(_ => NMi).ToArray();
    static string[] SList(long n) => Enumerable.Repeat(0, (int)n).Select(_ => ReadLine()).ToArray();
    public static void Main()
    {
        Solve();
    }
    static void Solve()
    {
        var c = NList;
        var (n, x, y) = (c[0], c[1], c[2]);
        var map = NArr(n);
        WriteLine(GetMax(x, map, 0) + GetMax(y, map, 1));
    }
    static long GetMax(int x, int[][] map, int idx)
    {
        var xdic = new Dictionary<int, int>();
        for (var i = 0; i < map.Length; ++i)
        {
            var xi = map[i][idx] - 1;
            if (x % 2 == 0)
            {
                if (xdic.ContainsKey(xi)) xdic[xi] += 2;
                else xdic[xi] = 2;
                var minus = (xi + x / 2) % x;
                if (xdic.ContainsKey(minus)) xdic[minus] -= 2;
                else xdic[minus] = -2;
            }
            else
            {
                if (xdic.ContainsKey(xi)) xdic[xi] += 2;
                else xdic[xi] = 2;
                var eq = (xi + x / 2) % x;
                if (xdic.ContainsKey(eq)) --xdic[eq];
                else xdic[eq] = -1;
                var minus = (xi + x / 2 + 1) % x;
                if (xdic.ContainsKey(minus)) --xdic[minus];
                else xdic[minus] = -1;
            }
        }
        var keys = xdic.Keys.ToList();
        keys.Sort();
        var revdic = new Dictionary<int, int>();
        for (var i = 0; i < keys.Count; ++i) revdic[keys[i]] = i;
        var d = 0L;
        var v = 0L;
        for (var i = 0; i < map.Length; ++i)
        {
            var xi = map[i][idx] - 1;
            if (x % 2 == 0)
            {
                var minus = (xi + x / 2) % x;
                if (revdic[xi] == 0)
                {
                    d += 1;
                }
                else if (revdic[minus] == 0)
                {
                    d -= 1;
                    v += x / 2;
                }
                else if (xi < minus)
                {
                    d -= 1;
                    v += xi - keys[0];
                }
                else
                {
                    d += 1;
                    v += x - xi + keys[0];
                }
            }
            else
            {
                var eq = (xi + x / 2) % x;
                var minus = (xi + x / 2 + 1) % x;
                if (revdic[xi] == 0)
                {
                    d += 1;
                }
                else if (revdic[eq] == 0)
                {
                    v += x / 2;
                }
                else if (revdic[minus] == 0)
                {
                    d -= 1;
                    v += x / 2;
                }
                else if (xi < minus)
                {
                    d -= 1;
                    v += xi - keys[0];
                }
                else
                {
                    d += 1;
                    v += x - xi + keys[0];
                }
            }
        }
        var ans = v;
        for (var i = 1; i < keys.Count; ++i)
        {
            v += d * (keys[i] - keys[i - 1]);
            ans = Math.Max(ans, v);
            d += xdic[keys[i]];
        }
        return ans;
    }
}
0