結果
問題 | No.2731 Two Colors |
ユーザー | beyanon |
提出日時 | 2024-04-19 23:08:54 |
言語 | C# (.NET 8.0.203) |
結果 |
AC
|
実行時間 | 1,232 ms / 3,000 ms |
コード長 | 26,784 bytes |
コンパイル時間 | 8,296 ms |
コンパイル使用メモリ | 166,244 KB |
実行使用メモリ | 192,868 KB |
最終ジャッジ日時 | 2024-10-11 17:23:30 |
合計ジャッジ時間 | 21,945 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1,216 ms
102,128 KB |
testcase_01 | AC | 1,232 ms
102,152 KB |
testcase_02 | AC | 1,197 ms
102,388 KB |
testcase_03 | AC | 77 ms
31,488 KB |
testcase_04 | AC | 138 ms
39,792 KB |
testcase_05 | AC | 124 ms
38,144 KB |
testcase_06 | AC | 172 ms
48,896 KB |
testcase_07 | AC | 162 ms
50,048 KB |
testcase_08 | AC | 105 ms
32,892 KB |
testcase_09 | AC | 310 ms
69,692 KB |
testcase_10 | AC | 85 ms
31,856 KB |
testcase_11 | AC | 445 ms
80,640 KB |
testcase_12 | AC | 316 ms
68,736 KB |
testcase_13 | AC | 394 ms
73,984 KB |
testcase_14 | AC | 213 ms
60,908 KB |
testcase_15 | AC | 120 ms
37,120 KB |
testcase_16 | AC | 241 ms
57,204 KB |
testcase_17 | AC | 270 ms
67,276 KB |
testcase_18 | AC | 139 ms
40,952 KB |
testcase_19 | AC | 262 ms
58,240 KB |
testcase_20 | AC | 239 ms
66,980 KB |
testcase_21 | AC | 137 ms
41,088 KB |
testcase_22 | AC | 375 ms
73,084 KB |
testcase_23 | AC | 190 ms
50,176 KB |
testcase_24 | AC | 146 ms
42,368 KB |
testcase_25 | AC | 70 ms
30,976 KB |
testcase_26 | AC | 293 ms
69,564 KB |
testcase_27 | AC | 351 ms
72,556 KB |
testcase_28 | AC | 317 ms
72,832 KB |
testcase_29 | AC | 182 ms
47,336 KB |
testcase_30 | AC | 219 ms
57,456 KB |
testcase_31 | AC | 194 ms
49,152 KB |
testcase_32 | AC | 472 ms
78,440 KB |
testcase_33 | AC | 64 ms
30,848 KB |
testcase_34 | AC | 65 ms
30,720 KB |
testcase_35 | AC | 63 ms
192,868 KB |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (98 ms)。 MSBuild のバージョン 17.9.6+a4ecab324 (.NET) main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
#pragma warning disable using System; using System.IO; using System.Linq; using System.Collections.Generic; using System.Runtime.CompilerServices; using static System.Console; using static System.Math; using static Util; using System.Runtime.InteropServices.Marshalling; #region using(AtCoder等非対応) // using pii = (int, int); // using pll = (long, long); // using pdd = (double, double); // using pss = (string, string); // using pis = (int, string); // using psi = (string, int); // using pls = (long, string); // using psl = (string, long); // using pds = (double, string); // using psd = (string, double); // using pid = (int, double); // using pdi = (double, int); // using pld = (long, double); // using pdl = (double, long); // using vb = bool[]; // using vvb = bool[][]; // using vvvb = bool[][][]; // using vi = int[]; // using vvi = int[][]; // using vvvi = int[][][]; // using vl = long[]; // using vvl = long[][]; // using vvvl = long[][][]; // using vd = double[]; // using vvd = double[][]; // using vvvd = double[][][]; // using vs = string[]; // using vvs = string[][]; // using vvvs = string[][][]; // using listb = System.Collections.Generic.List<bool>; // using llistb = System.Collections.Generic.List<System.Collections.Generic.List<bool>>; // using lllistb = System.Collections.Generic.List<System.Collections.Generic.List<System.Collections.Generic.List<bool>>>; // using listi = System.Collections.Generic.List<int>; // using llisti = System.Collections.Generic.List<System.Collections.Generic.List<int>>; // using lllisti = System.Collections.Generic.List<System.Collections.Generic.List<System.Collections.Generic.List<int>>>; // using listl = System.Collections.Generic.List<long>; // using llistl = System.Collections.Generic.List<System.Collections.Generic.List<long>>; // using lllistl = System.Collections.Generic.List<System.Collections.Generic.List<System.Collections.Generic.List<long>>>; // using listd = System.Collections.Generic.List<double>; // using llistd = System.Collections.Generic.List<System.Collections.Generic.List<double>>; // using lllistd = System.Collections.Generic.List<System.Collections.Generic.List<System.Collections.Generic.List<double>>>; // using lists = System.Collections.Generic.List<string>; // using llists = System.Collections.Generic.List<System.Collections.Generic.List<string>>; // using lllists = System.Collections.Generic.List<System.Collections.Generic.List<System.Collections.Generic.List<string>>>; // using mii = System.Collections.Generic.SortedDictionary<int, int>; // using mll = System.Collections.Generic.SortedDictionary<long, long>; // using mss = System.Collections.Generic.SortedDictionary<string, string>; // using mis = System.Collections.Generic.SortedDictionary<int, string>; // using msi = System.Collections.Generic.SortedDictionary<string, int>; // using mls = System.Collections.Generic.SortedDictionary<long, string>; // using msl = System.Collections.Generic.SortedDictionary<string, long>; // using umii = System.Collections.Generic.Dictionary<int, int>; // using umll = System.Collections.Generic.Dictionary<long, long>; // using umss = System.Collections.Generic.Dictionary<string, string>; // using umis = System.Collections.Generic.Dictionary<int, string>; // using umsi = System.Collections.Generic.Dictionary<string, int>; // using umls = System.Collections.Generic.Dictionary<long, string>; // using umsl = System.Collections.Generic.Dictionary<string, long>; // using seti = System.Collections.Generic.SortedSet<int>; // using setl = System.Collections.Generic.SortedSet<long>; // using sets = System.Collections.Generic.SortedSet<string>; // using useti = System.Collections.Generic.HashSet<int>; // using usetl = System.Collections.Generic.HashSet<long>; // using usets = System.Collections.Generic.HashSet<string>; #endregion class Util { public static double PI = 3.141592653589793; public static long m107 = 1000000007; public static long m998 = 998244353; public static int a10_9 = 1000000000; public static long a10_18 = 1000000000000000000; public static int iinf = 1 << 31; public static long linf = (1l << 61) - (1l << 31); /// <summary>1行読みこみ</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string read() => ReadLine(); /// <summary>1行読みこみ</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string readln() => ReadLine(); /// <summary>1行読みこみ</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string readline() => ReadLine(); /// <summary>改行なし出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void write() => Write(""); /// <summary>改行なし出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void write<T>(T value) => Write(value); /// <summary>改行あり出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void writeln() => WriteLine(""); /// <summary>改行あり出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void writeln<T>(T value) => WriteLine(value); /// <summary>改行あり出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void writeline() => WriteLine(""); /// <summary>改行あり出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void writeline<T>(T value) => WriteLine(value); /// <summary>改行なし出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void print() => Write(""); /// <summary>改行なし出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void print<T>(T value) => Write(value); /// <summary>改行あり出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void println() => WriteLine(""); /// <summary>改行あり出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void println<T>(T value) => WriteLine(value); /// <summary>改行あり出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printline() => WriteLine(""); /// <summary>改行あり出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printline<T>(T value) => WriteLine(value); /// <summary>任意の要素数・初期値の配列を作って初期化する</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[] makearr<T>(int num, T value) { var arr = new T[num]; for (int i = 0; i < num; ++i) arr[i] = value; return arr; } // end of func /// <summary>任意の要素数・初期値の2次元配列を作って初期化する</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[][] makearr2<T>(int height, int width, T value) { var arr = new T[height][]; for (int i = 0; i < height; ++i) { arr[i] = new T[width]; for (int j = 0; j < width; ++j) { arr[i][j] = value; } } return arr; } // end of func /// <summary>任意の要素数・初期値の3次元配列を作って初期化する</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[][][] makearr3<T>(int height, int width, int depth, T value) { var arr = new T[height][][]; for (int i = 0; i < height; ++i) { arr[i] = new T[width][]; for (int j = 0; j < width; ++j) { arr[i][j] = new T[depth]; for (int k = 0; k < depth; ++k) { arr[i][j][k] = value; } } } return arr; } // end of func /// <summary>任意の要素数・初期値のListを作って初期化する</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<T> makelist<T>(int num, T value) { return new List<T>(makearr(num, value)); } // end of func /// <summary>任意の要素数・初期値の2次元Listを作って初期化する</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<List<T>> makelist2<T>(int height, int width, T value) { var arr = new List<List<T>>(); for (int i = 0; i < height; ++i) { arr.Add(makelist(width, value)); } return arr; } // end of func /// <summary>任意の要素数・初期値の3次元Listを作って初期化する</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<List<List<T>>> makelist3<T>(int height, int width, int depth, T value) { var arr = new List<List<List<T>>>(); for (int i = 0; i < height; ++i) { arr[i] = new List<List<T>>(); for (int j = 0; j < width; ++j) { arr[i].Add(makelist(depth, value)); } } return arr; } // end of func /// <summary>1次元配列のディープコピーを行う</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[] copyarr<T>(T[] arr) { T[] brr = new T[arr.Length]; Array.Copy(arr, brr, arr.Length); return brr; } // end of func /// <summary>2次元配列のディープコピーを行う</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[][] copyarr2<T>(T[][] arr) { T[][] brr = new T[arr.Length][]; for (int i = 0; i < arr.Length; ++i) { brr[i] = new T[arr[i].Length]; Array.Copy(arr[i], brr[i], arr[i].Length); } return brr; } // end of func /// <summary>3次元配列のディープコピーを行う</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static T[][][] copyarr3<T>(T[][][] arr) { T[][][] brr = new T[arr.Length][][]; for (int i = 0; i < arr.Length; ++i) { brr[i] = new T[arr[i].Length][]; for (int j = 0; j < arr[i].Length; ++j) { brr[i][j] = new T[arr[i][j].Length]; Array.Copy(arr[i][j], brr[i][j], arr[i][j].Length); } } return brr; } // end of func /// <summary>1次元Listのディープコピーを行う</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<T> copylist<T>(List<T> list) { return new List<T>(list); } // end of func /// <summary>2次元Listのディープコピーを行う</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<List<T>> copylist2<T>(List<List<T>> list) { List<List<T>> list2 = new List<List<T>>(); for (int i = 0; i < list.Count; ++i) { list2.Add(new List<T>(list[i])); } return list2; } // end of func /// <summary>3次元Listのディープコピーを行う</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static List<List<List<T>>> copylist3<T>(List<List<List<T>>> list) { List<List<List<T>>> list2 = new List<List<List<T>>>(); for (int i = 0; i < list.Count; ++i) { List<List<T>> tmplist = new List<List<T>>(); for (int j = 0; j < list[i].Count; ++i) { tmplist.Add(new List<T>(list[i][j])); } list2.Add(tmplist); } return list2; } // end of func /// <summary>1次元Listを出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printlist<T>(List<T> list) { WriteLine(string.Join(" ", list)); } // end of func /// <summary>1次元配列を出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printlist<T>(T[] list) { WriteLine(string.Join(" ", list)); } // end of func /// <summary>2次元リストを出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printlist2<T>(List<List<T>> list) { foreach (var l in list) { WriteLine(string.Join(" ", l)); } } // end of func /// <summary>2次元配列を出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printlist2<T>(T[][] list) { foreach (var l in list) { WriteLine(string.Join(" ", l)); } } // end of func /// <summary>1次元Listを出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printarr<T>(List<T> list) { WriteLine(string.Join(" ", list)); } // end of func /// <summary>1次元配列を出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printarr<T>(T[] list) { WriteLine(string.Join(" ", list)); } // end of func /// <summary>2次元リストを出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printarr2<T>(List<List<T>> list) { foreach (var l in list) { WriteLine(string.Join(" ", l)); } } // end of func /// <summary>2次元配列を出力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void printarr2<T>(T[][] list) { foreach (var l in list) { WriteLine(string.Join(" ", l)); } } // end of func /// <summary>数字を1つint型で読み込み</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int readint() { return int.Parse(ReadLine()); } // end of func /// <summary>数字を1つlong型で読み込み</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long readlong() { return long.Parse(ReadLine()); } // end of func /// <summary>入力を空白区切りのstringで返す(変則的な入力に対応)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string[] readsplit() { return ReadLine().Split(' '); } // end of func /// <summary>数字をスペース区切りでint型で入力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static int[] readints() { return ReadLine().Split(' ').Select(_ => int.Parse(_)).ToArray(); } // end of func /// <summary>数字をスペース区切りでlong型で入力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static long[] readlongs() { return ReadLine().Split(' ').Select(_ => long.Parse(_)).ToArray(); } // end of func /// <summary>数字をスペース区切りでfloat型で入力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static float[] readfloats() { return ReadLine().Split(' ').Select(_ => float.Parse(_)).ToArray(); } // end of func /// <summary>数字をスペース区切りでdouble型で入力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static double[] readdoubles() { return ReadLine().Split(' ').Select(_ => double.Parse(_)).ToArray(); } // end of func /// <summary>文字列をスペース区切りで入力</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string[] readstrings() { return ReadLine().Split(' '); } // end of func /// <summary>読み込んだint2つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (int, int) readintt2() { var arr = readints(); return (arr[0], arr[1]); } // end of func /// <summary>読み込んだint3つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (int, int, int) readintt3() { var arr = readints(); return (arr[0], arr[1], arr[2]); } // end of func /// <summary>読み込んだint4つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (int, int, int, int) readintt4() { var arr = readints(); return (arr[0], arr[1], arr[2], arr[3]); } // end of func /// <summary>読み込んだlong2つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (long, long) readlongt2() { var arr = readlongs(); return (arr[0], arr[1]); } // end of func /// <summary>読み込んだ数long3つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (long, long, long) readlongt3() { var arr = readlongs(); return (arr[0], arr[1], arr[2]); } // end of func /// <summary>読み込んだ数long4つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (long, long, long, long) readlongt4() { var arr = readlongs(); return (arr[0], arr[1], arr[2], arr[3]); } // end of func /// <summary>読み込んだfloat2つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (float, float) readfloatt2() { var arr = readfloats(); return (arr[0], arr[1]); } // end of func /// <summary>読み込んだfloat3つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (float, float, float) readfloatt3() { var arr = readfloats(); return (arr[0], arr[1], arr[2]); } // end of func /// <summary>読み込んだfloat4つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (float, float, float, float) readfloatt4() { var arr = readfloats(); return (arr[0], arr[1], arr[2], arr[3]); } // end of func /// <summary>読み込んだdouble2つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (double, double) readdoublet2() { var arr = readdoubles(); return (arr[0], arr[1]); } // end of func /// <summary>読み込んだdouble3つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (double, double, double) readdoublet3() { var arr = readdoubles(); return (arr[0], arr[1], arr[2]); } // end of func /// <summary>読み込んだdouble4つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (double, double, double, double) readdoublet4() { var arr = readdoubles(); return (arr[0], arr[1], arr[2], arr[3]); } // end of func /// <summary>読み込んだstring2つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (string, string) readstringt2() { var arr = ReadLine().Split(' '); return (arr[0], arr[1]); } // end of func /// <summary>読み込んだstring3つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (string, string, string) readstringt3() { var arr = ReadLine().Split(' '); return (arr[0], arr[1], arr[2]); } // end of func /// <summary>読み込んだstring3つをタプルで返す(分解代入用)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (string, string, string, string) readstringt4() { var arr = ReadLine().Split(' '); return (arr[0], arr[1], arr[2], arr[3]); } // end of func /// <summary>先頭に要素数(int)と次にでかい数字1つ</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (int, long) readintlongt2() { var arr = ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray(); return ((int)arr[0], arr[1]); } // end of func /// <summary>先頭に要素数(int)と次にでかい数字2つ</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (int, long, long) readintlongt3() { var arr = ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray(); return ((int)arr[0], arr[1], arr[2]); } // end of func /// <summary>先頭に要素数(int)と次にでかい数字2つ</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static (int, long, long, long) readintlongt4() { var arr = ReadLine().Split(' ').Select(x => long.Parse(x)).ToArray(); return ((int)arr[0], arr[1], arr[2], arr[3]); } // end of func /// <summary>小数点以下を16桁で表示(精度が厳しい問題に対応)</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteLine16<T>(T num) { WriteLine(string.Format("{0:0.################}", num)); } // end of func /// <summary>整数を二進数で表示</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteLine2bit(int num) { WriteLine(Convert.ToString(num, 2)); } // end of func /// <summary>整数を二進数で表示</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void WriteLine2bit(long num) { WriteLine(Convert.ToString(num, 2)); } // end of func /// <summary>整数を2進数表現した文字列に</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string IntToString2bit(int num) { return Convert.ToString(num, 2); } // end of func /// <summary>整数を2進数表現した文字列に</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static string LongToString2bit(long num) { return Convert.ToString(num, 2); } // end of func /// <summary>出力のflush削除</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void preprocess() { var sw = new StreamWriter(Console.OpenStandardOutput()) { AutoFlush = false }; System.Console.SetOut(sw); } // end of func /// <summary>出力をflush</summary> [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void finalprocess() { System.Console.Out.Flush(); } // end of func } // end of class /// 座標に便利(値型だけど16byteまではstructが速い) struct YX { public int y; public int x; public YX(int y, int x) { this.y = y; this.x = x; } } // end of class /// グラフをするときに(値型だけど16byteまではstructが速い) struct Edge { public int from; public int to; public long cost; public Edge(int from, int to, long cost) { this.from = from; this.to = to; this.cost = cost; } } // end of class class Kyopuro { static long ans = 0; public static void Main() { // preprocess(); var kyopuro = new Kyopuro(); kyopuro.Solve(); writeline(ans - 2); // finalprocess(); } // end of func HashSet<long> col0 = new HashSet<long>(); HashSet<long> col1 = new HashSet<long>(); long h; long w; [MethodImpl(MethodImplOptions.AggressiveInlining)] bool check(long c) { bool f0 = false; bool f1 = false; long y = c / w; long x = c % w; long up = 0 < y ? (y - 1) * w + x : -1; long down = y < h - 1 ? (y + 1) * w + x : -1; long left = 0 < x ? y * w + x - 1 : -1; long right = x < w - 1 ? y * w + x + 1 : -1; if (col0.Contains(up) || col0.Contains(down) || col0.Contains(left) || col0.Contains(right)) f0 = true; if (col1.Contains(up) || col1.Contains(down) || col1.Contains(left) || col1.Contains(right)) f1 = true; return f0 && f1; } public void Solve() { (h, w) = readintt2(); var masu = new long[h][]; for (int i = 0; i < h; ++i) masu[i] = readlongs(); var pq0 = new MyPriorityQueue<(long, long)>((a, b) => a.Item1 <= b.Item1); var pq1 = new MyPriorityQueue<(long, long)>((a, b) => a.Item1 <= b.Item1); pq0.Enqueue((masu[0][0], 0)); pq1.Enqueue((masu[h - 1][w - 1], (h - 1) * w + w - 1)); long y, x, c; long up, down, left, right; while (true) { // 0のターン y = -1; x = -1; c = -1; while (pq0.Count > 0) { var (num, yx) = pq0.Dequeue(); // すでに塗られているとだめ if (col0.Contains(yx) || col1.Contains(yx)) continue; y = yx / w; x = yx % w; c = yx; break; } if (c == -1) return; // 塗る col0.Add(c); ans += 1l; // writeline($"0のターン y:{y} x:{x} masu:{masu[y][x]}"); if (check(c)) return; up = (y - 1) * w + x; down = (y + 1) * w + x; left = y * w + x - 1; right = y * w + x + 1; if (0 < y) pq0.Enqueue((masu[y - 1][x], up)); if (y < h - 1) pq0.Enqueue((masu[y + 1][x], down)); if (0 < x) pq0.Enqueue((masu[y][x - 1], left)); if (x < w - 1) pq0.Enqueue((masu[y][x + 1], right)); // 1のターン y = -1; x = -1; c = -1; while (pq1.Count > 0) { var (num, yx) = pq1.Dequeue(); // すでに塗られているとだめ if (col0.Contains(yx) || col1.Contains(yx)) continue; y = yx / w; x = yx % w; c = yx; break; } if (c == -1) return; // 塗る col1.Add(c); ans += 1l; // writeline($"1のターン y:{y} x:{x} masu:{masu[y][x]}"); if (check(c)) return; up = (y - 1) * w + x; down = (y + 1) * w + x; left = y * w + x - 1; right = y * w + x + 1; if (0 < y) pq1.Enqueue((masu[y - 1][x], up)); if (y < h - 1) pq1.Enqueue((masu[y + 1][x], down)); if (0 < x) pq1.Enqueue((masu[y][x - 1], left)); if (x < w - 1) pq1.Enqueue((masu[y][x + 1], right)); } } // end of method } // end of class class MyPriorityQueue<T> { /// 内部で持つヒープ配列 public List<T> heap = new List<T>(); /// 現在の要素数 public int Count { get { return heap.Count; } } /// 比較用関数 (第1引数の方が優先度が高いときにtrue) private Func<T, T, bool> Compare; public MyPriorityQueue(Func<T, T, bool> compare) { this.Compare = compare; } // end of constructor /// 新規の値を追加する [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enqueue(T num) { // 追加する要素のノード番号 int node = this.heap.Count; this.heap.Add(num); // 可能な限り親と交換 while (node > 0) { // 親ノード int p = (node - 1) / 2; // 交換条件を満たさなくなったら終わり if (this.Compare(num, heap[p]) == false) break; // 親ノードの値を子に降ろす heap[node] = heap[p]; node = p; } // end of while // 新規の値を下ろす場所を見つけたので終わり heap[node] = num; } // end of method /// 一番優先度の高い値を返す [MethodImpl(MethodImplOptions.AggressiveInlining)] public T Peek() => this.heap[0]; /// 一番優先度の高い値を返して削除する [MethodImpl(MethodImplOptions.AggressiveInlining)] public T Dequeue() { // return用の優先度が一番高い値 T ret = this.heap[0]; // 先頭を削除 this.Pop(); return ret; } // end of method /// 一番優先度の高い値を削除する [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Pop() { // 根に持ってくる値 T last = heap[this.heap.Count - 1]; // 最後尾を削除 O(1) this.heap.RemoveAt(this.heap.Count - 1); // 要素がなくなったら終了 if (this.heap.Count == 0) return; // 先頭を置き換えて降ろしていく int node = 0; while (node * 2 + 1 < this.heap.Count) { int a = node * 2 + 1; int b = node * 2 + 2; // 右の子が存在して、なおかつ優先度が高いならば if (b < this.heap.Count && this.Compare(this.heap[b], this.heap[a])) a = b; // 交換条件を満たさなくなったら終わり if (this.Compare(last, this.heap[a])) break; // 優先度の高い子を上げる this.heap[node] = this.heap[a]; node = a; } // end of while // 先頭に持ってきた値の置き場所が決まったので更新 this.heap[node] = last; } // end of method } // end of class