結果
| 問題 |
No.2641 draw X
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-19 23:23:38 |
| 言語 | C# (.NET 8.0.404) |
| 結果 |
AC
|
| 実行時間 | 284 ms / 2,000 ms |
| コード長 | 4,824 bytes |
| コンパイル時間 | 8,451 ms |
| コンパイル使用メモリ | 166,612 KB |
| 実行使用メモリ | 231,464 KB |
| 最終ジャッジ日時 | 2024-09-29 03:07:10 |
| 合計ジャッジ時間 | 14,485 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 41 |
コンパイルメッセージ
復元対象のプロジェクトを決定しています... /home/judge/data/code/main.csproj を復元しました (99 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/
ソースコード
namespace AtCoder;
#nullable enable
using System.Numerics;
static class Extensions
{
public static T[] Repeat<T>(this int time, Func<T> F) => Enumerable.Range(0, time).Select(_ => F()).ToArray();
public static T[,] Rotated<T>(this T[,] g)
{
var (h, w) = (g.GetLength(0), g.GetLength(1));
var res = new T[w, h];
for (var i = 0; i < h; i++) for (var j = 0; j < w; j++) res[w - 1 - j, i] = g[i, j];
return res;
}
public static bool Is<T>(this T[,] g, T[,] a)
{
var (h, w) = (g.GetLength(0), g.GetLength(1));
var (ha, wa) = (a.GetLength(0), a.GetLength(1));
if (h != ha || w != wa) return false;
for (var i = 0; i < h; i++) for (var j = 0; j < w; j++)
{
var (vg, va) = (g[i, j], a[i, j]);
if (vg == null) { if (va != null) return false; }
else if (!vg.Equals(va)) return false;
}
return true;
}
}
class AtCoder
{
object? Solve()
{
var h = Int();
var w = Int();
var s = new bool[h, w];
for (var i = 0; i < h; i++)
{
var row = String();
for (var j = 0; j < w; j++) s[i, j] = row[j] == '#';
}
var t = new bool[h, w];
var g = new int[4][,];
for (var k = 0; k < 4; k++)
{
var gg = new int[h, w];
for (var i = 0; i < h; i++)
{
var (x, y) = (i, 0);
var l = 0;
while (x < h && y < w)
{
if (s[x, y]) gg[x, y] = ++l;
else l = 0;
x++;
y++;
}
}
for (var j = 1; j < w; j++)
{
var (x, y) = (0, j);
var l = 0;
while (x < h && y < w)
{
if (s[x, y]) gg[x, y] = ++l;
else l = 0;
x++;
y++;
}
}
s = s.Rotated();
(h, w) = (w, h);
for (var i = 4; i > k; i--) gg = gg.Rotated();
g[k] = gg;
}
var b = new int[h, w];
for (var i = 0; i < h; i++) for (var j = 0; j < w; j++) b[i, j] = int.MaxValue / 2;
for (var k = 0; k < 4; k++) for (var i = 0; i < h; i++) for (var j = 0; j < w; j++) b[i, j] = Math.Min(b[i, j], g[k][i, j]);
for (var i = 0; i < h; i++) for (var j = 0; j < w; j++) if (b[i, j] == 1) b[i, j] = 0;
for (var k = 0; k < 4; k++)
{
for (var i = 0; i < h; i++)
{
var (x, y) = (i, 0);
var l = 0;
while (x < h && y < w)
{
l = Math.Max(l, b[x, y]);
if (l > 0)
{
t[x, y] = true;
l--;
}
x++;
y++;
}
}
for (var j = 1; j < w; j++)
{
var (x, y) = (0, j);
var l = 0;
while (x < h && y < w)
{
l = Math.Max(l, b[x, y]);
if (l > 0)
{
t[x, y] = true;
l--;
}
x++;
y++;
}
}
t = t.Rotated();
b = b.Rotated();
(h, w) = (w, h);
}
return s.Is(t);
}
public static void Main() => new AtCoder().Run();
public void Run()
{
var res = Solve();
if (res != null)
{
if (res is bool yes) res = yes ? "Yes" : "No";
sw.WriteLine(res);
}
sw.Flush();
}
string[] input = Array.Empty<string>();
int iter = 0;
readonly StreamWriter sw = new(Console.OpenStandardOutput()) { AutoFlush = false };
#pragma warning disable IDE0051
string String()
{
while (iter >= input.Length) (input, iter) = (Console.ReadLine()!.Split(' '), 0);
return input[iter++];
}
T Input<T>() where T : IParsable<T> => T.Parse(String(), null);
int Int() => Input<int>();
void Out(object? x, string? separator = null)
{
separator ??= Environment.NewLine;
if (x is System.Collections.IEnumerable obj and not string)
{
var firstLine = true;
foreach (var item in obj)
{
if (!firstLine) sw.Write(separator);
firstLine = false;
sw.Write(item);
}
}
else sw.Write(x);
sw.WriteLine();
}
#pragma warning restore IDE0051
}