結果

問題 No.2641 draw X
ユーザー kemuniku
提出日時 2024-02-19 22:58:07
言語 Nim
(2.2.0)
結果
AC  
実行時間 293 ms / 2,000 ms
コード長 8,853 bytes
コンパイル時間 3,969 ms
コンパイル使用メモリ 79,700 KB
実行使用メモリ 38,668 KB
最終ジャッジ日時 2024-09-29 02:41:35
合計ジャッジ時間 9,368 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 41
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import macros;macro ImportExpand(s:untyped):untyped = parseStmt($s[2])
import macros
ImportExpand "cplib/tmpl/sheep.nim" <=== "when not declared CPLIB_TMPL_SHEEP:\n const CPLIB_TMPL_SHEEP* = 1\n {.warning[UnusedImport]: off.}\n
     {.hint[XDeclaredButNotUsed]: off.}\n import algorithm\n import sequtils\n import tables\n import macros\n import math\n
    import sets\n import strutils\n import strformat\n import sugar\n import heapqueue\n import streams\n import deques\n import
    bitops\n import std/lenientops\n import options\n #\n proc scanf(formatstr: cstring){.header: \"<stdio.h>\", varargs.}\n
    proc getchar(): char {.importc: \"getchar_unlocked\", header: \"<stdio.h>\", discardable.}\n proc ii(): int {.inline.} = scanf(\"%lld\\n\",
    addr result)\n proc lii(N: int): seq[int] {.inline.} = newSeqWith(N, ii())\n proc si(): string {.inline.} =\n result = \"\"\n
     var c: char\n while true:\n c = getchar()\n if c == ' ' or c == '\\n':\n break\n result &
    = c\n #chmin,chmax\n template `max=`(x, y) = x = max(x, y)\n template `min=`(x, y) = x = min(x, y)\n #bit\n proc `%`(x: int, y
    : int): int = (((x mod y)+y) mod y)\n proc `//`(x: int, y: int): int = (((x) - (x%y)) div (y))\n proc `%=`(x: var int, y: int): void = x =
    x%y\n proc `//=`(x: var int, y: int): void = x = x//y\n proc `**`(x: int, y: int): int = x^y\n proc `^`(x: int, y: int): int = x xor y\n
     proc `|`(x: int, y: int): int = x or y\n proc `&`(x: int, y: int): int = x and y\n proc `>>`(x: int, y: int): int = x shr y\n proc `
    <<`(x: int, y: int): int = x shl y\n proc `^=`(x: var int, y: int): void = x = x ^ y\n proc `&=`(x: var int, y: int): void = x = x & y\n
     proc `|=`(x: var int, y: int): void = x = x | y\n proc `>>=`(x: var int, y: int): void = x = x >> y\n proc `<<=`(x: var int, y: int): void
    = x = x << y\n proc `[]`(x: int, n: int): bool = (x and (1 shl n)) != 0\n proc `@`(x: int): seq[int] =\n for i in 0..<64:\n
     if x[i]:\n result.add(i)\n #便\n proc `!`(x: char, a = '0'): int = int(x)-int(a)\n #\n const INF = int
    (3300300300300300491)\n #converter\n\n #range\n iterator range(start: int, ends: int, step: int): int =\n var i = start\n
    if step < 0:\n while i > ends:\n yield i\n i += step\n elif step > 0:\n while i < ends
    :\n yield i\n i += step\n iterator range(ends: int): int = (for i in 0..<ends: yield i)\n iterator range
    (start: int, ends: int): int = (for i in\n start..<ends: yield i)\n"
ImportExpand "cplib/collections/segtree.nim" <=== "when not declared CPLIB_COLLECTIONS_SEGTREE:\n const CPLIB_COLLECTIONS_SEGTREE* = 1\n import
    algorithm\n type SegmentTree*[T] = ref object\n default: T\n merge: proc(x: T, y: T): T\n arr*: seq[T]\n lastnode:
    int\n length: int\n proc initSegmentTree*[T](v: seq[T], merge: proc(x: T, y: T): T, default: T): SegmentTree[T] =\n ##
    \n ## vmerge\n
    var lastnode = 1\n while lastnode < len(v):\n lastnode*=2\n var arr = newSeq[T](2*lastnode)\n arr.fill(default)\n
     var self = SegmentTree[T](default: default, merge: merge, arr: arr, lastnode: lastnode, length: len(v))\n #1-indexed\n
     for i in 0..<len(v):\n self.arr[self.lastnode+i] = v[i]\n for i in countdown(lastnode-1, 1):\n self.arr[i] =
    self.merge(self.arr[2*i], self.arr[2*i+1])\n return self\n\n proc update*[T](self: SegmentTree[T], x: Natural, val: T) =\n ##
    xval\n assert x < self.length\n var x = x\n x += self.lastnode\n self.arr[x] = val\n
    while x > 1:\n x = x shr 1\n self.arr[x] = self.merge(self.arr[2*x], self.arr[2*x+1])\n proc get*[T](self:
    SegmentTree[T], q_left: Natural, q_right: Natural): T =\n ## [q_left,q_right)\n assert q_left
    <= q_right and 0 <= q_left and q_right <= self.length\n var q_left = q_left\n var q_right = q_right\n q_left += self
    .lastnode\n q_right += self.lastnode\n var (lres, rres) = (self.default, self.default)\n while q_left < q_right:\n
     if (q_left and 1) > 0:\n lres = self.merge(lres, self.arr[q_left])\n q_left += 1\n if (q_right and 1)
    > 0:\n q_right -= 1\n rres = self.merge(self.arr[q_right], rres)\n q_left = q_left shr 1\n
    q_right = q_right shr 1\n return self.merge(lres, rres)\n proc get*[T](self: SegmentTree[T], segment: HSlice[int, int]): T =\n
    assert segment.a <= segment.b + 1 and 0 <= segment.a and segment.b+1 <= self.length\n return self.get(segment.a, segment.b+1)\n proc
    `[]`*[T](self: SegmentTree[T], index: Natural): T =\n assert index < self.length\n return self.arr[index+self.lastnode]\n proc
    `[]=`*[T](self: SegmentTree[T], index: Natural, val: T) =\n assert index < self.length\n self.update(index, val)\n proc get_all
    *[T](self: SegmentTree[T]): T =\n ## [0,len(self))O(1)\n return self.arr[1]\n proc len*[T](self:
    SegmentTree[T]): int =\n return self.length\n\n template newSegWith*(V, merge, default: untyped): untyped =\n initSegmentTree(V,
    (l, r{.inject.}: typeof(default)) => merge, default)\n\n"
#[
#
]#
var H,W = ii()
var S = newSeqWith(H,si())
var count = newSeqWith(4,newSeqWith(H,newSeqWith(W,0)))
for X in range(4):
var start : seq[(int,int)]
#
if X == 0:
for i in range(W):
start.add((0,i))
for i in range(1,H):
start.add((i,0))
#
elif X == 1:
for i in range(W):
start.add((H-1,i))
for i in range(H-1):
start.add((i,0))
#
elif X == 2:
for i in range(W):
start.add((0,i))
for i in range(1,H):
start.add((i,W-1))
#
elif X == 3:
for i in range(W):
start.add((H-1,i))
for i in range(1,H):
start.add((i,W-1))
for (i,j) in start:
var i = i
var j = j
let (di,dj) = [(1,1),(-1,1),(1,-1),(-1,-1)][X]
var now = 0
while true:
if S[i][j] == '#':
now += 1
else:
now = 0
count[X][i][j] = now
i += di
j += dj
if i notin 0..<H or j notin 0..<W:
break
var alr = newSeqWith(H,newSeqWith(W,false))
for X in range(4):
var start : seq[(int,int)]
#
if X == 0:
for i in range(W):
start.add((0,i))
for i in range(1,H):
start.add((i,0))
#
elif X == 1:
for i in range(W):
start.add((H-1,i))
for i in range(H-1):
start.add((i,0))
#
elif X == 2:
for i in range(W):
start.add((0,i))
for i in range(1,H):
start.add((i,W-1))
#
elif X == 3:
for i in range(W):
start.add((H-1,i))
for i in range(1,H):
start.add((i,W-1))
for (i,j) in start:
var i = i
var j = j
let (di,dj) = [(1,1),(-1,1),(1,-1),(-1,-1)][X]
var now = 0
while true:
var tmp = min([count[0][i][j],count[1][i][j],count[2][i][j],count[3][i][j]])
if tmp > 1:
now = max([0,now,tmp])
else:
now = max(0,now)
if now != 0:
alr[i][j] = true
i += di
j += dj
now -= 1
if i notin 0..<H or j notin 0..<W:
break
# for i in range(H):
# var tmp = ""
# for j in range(W):
# tmp.add($(min([count[0][i][j],count[1][i][j],count[2][i][j],count[3][i][j]])))
# echo tmp
# for i in range(H):
# var tmp = ""
# for j in range(W):
# if alr[i][j]:
# tmp.add('T')
# else:
# tmp.add('F')
# echo tmp
for i in range(H):
for j in range(W):
if S[i][j] == '#' and (not alr[i][j]):
echo "No"
quit()
echo "Yes"
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0