結果
問題 |
No.3047 Verification of Sorting Network
|
ユーザー |
👑 |
提出日時 | 2025-01-16 00:48:14 |
言語 | C# (.NET 8.0.404) |
結果 |
AC
|
実行時間 | 468 ms / 2,000 ms |
コード長 | 4,060 bytes |
コンパイル時間 | 17,725 ms |
コンパイル使用メモリ | 172,332 KB |
実行使用メモリ | 224,428 KB |
最終ジャッジ日時 | 2025-03-05 20:31:19 |
合計ジャッジ時間 | 41,584 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 61 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (114 ミリ秒)。 main -> /home/judge/data/code/bin/Release/net8.0/main.dll main -> /home/judge/data/code/bin/Release/net8.0/publish/
ソースコード
const int MAX_T = 10000; const int MAX_N = 27; const double MAX_COST = 1e8; var t = int.Parse(Console.ReadLine()); if (t > MAX_T) throw new ArgumentException($"t must be <= {MAX_T}"); var phi = Math.Sqrt(1.25) + 0.5; double cost = 0.0; for (int i = 0; i < t; i++) { var input = Console.ReadLine().Split(); var n = int.Parse(input[0]); var m = int.Parse(input[1]); var cmps = new List<(int, int)>(); if (n < 2 || n > MAX_N || m < 1 || m > n * (n - 1) / 2) throw new ArgumentException("Invalid input"); cost += m * Math.Pow(phi, n); int[] va = Console.ReadLine().Split().Select(int.Parse).ToArray(); int[] vb = Console.ReadLine().Split().Select(int.Parse).ToArray(); if (va.Length != m || vb.Length != m) throw new InvalidDataException("Invalid data length"); for (int j = 0; j < m; j++) { if (!(1 <= va[j] && va[j] < vb[j] && vb[j] <= n)) throw new ArgumentException("Invalid input"); cmps.Add((va[j] - 1, vb[j] - 1)); } var result = IsSortingNetwork(n, cmps.ToArray()); Console.WriteLine(result.to_string); if (result.is_ok) { if (result.data.Length != m) throw new InvalidDataException("Invalid unused_cmp data length"); } else { if (result.data.Length != n - 1) throw new InvalidDataException("Invalid unsorted_node data length"); } var index = result.data.AsEnumerable().Select((k, i) => (k, i)).Where(x => x.k).Select(x => x.i).ToArray(); Console.WriteLine(index.Length); Console.WriteLine(string.Join(" ", index.AsEnumerable().Select(k => k + 1))); } if (cost > MAX_COST) throw new ArgumentException("Cost exceeds limit"); static Result<bool[]> IsSortingNetwork(int n, (int, int)[] cmps) { var stack = new Stack<(int, State[], int, int)>(n); stack.Push((0, Enumerable.Range(0, n).Select(i => State.Unknown).ToArray(), 0, n - 1)); bool[] unused = Enumerable.Repeat(true, cmps.Length).ToArray(); bool[] unsorted = new bool[n - 1]; while (stack.Count > 0) { var (i, p, z, o) = stack.Pop(); while (i < cmps.Length) { var (a, b) = cmps[i++]; if (p[a] == State.Unknown && p[b] == State.Unknown) { unused[i - 1] = false; State[] q = (State[])p.Clone(); q[a] = q[b] = State.Zero; p[b] = State.One; for (var j = z; j < o; j++) { if (p[j] != State.Zero) { stack.Push((i, q, j, o)); break; } } while (p[o] == State.One) { o--; if (z >= o) { goto A; } } } else if (p[a] != State.Zero && p[b] != State.One) { unused[i - 1] = false; (p[a], p[b]) = (p[b], p[a]); while (p[z] == State.Zero) { z++; if (z >= o) { goto A; } } while (p[o] == State.One) { o--; if (z >= o) { goto A; } } } } for (int j = 0; j < n - 1; ++j) { if (p[j] != State.Zero && p[j + 1] != State.One) { unsorted[j] = true; } } A:; } if (unsorted.Any(u => u)) { return new Result<bool[]>(false, unsorted); } return new Result<bool[]>(true, unused); } enum State { Zero, One, Unknown } class Result<T> { public bool is_ok; public T data; public string to_string => is_ok ? "Yes" : "No"; public Result(bool is_ok, T data) { this.is_ok = is_ok; this.data = data; } }