結果
| 問題 |
No.1561 connect x connect
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-11-27 03:08:21 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 1,978 bytes |
| コンパイル時間 | 227 ms |
| コンパイル使用メモリ | 82,448 KB |
| 実行使用メモリ | 268,780 KB |
| 最終ジャッジ日時 | 2024-06-25 07:57:19 |
| 合計ジャッジ時間 | 10,959 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 TLE * 2 -- * 21 |
ソースコード
import dataclasses
import sys
sys.setrecursionlimit(500005)
stdin = sys.stdin
ni = lambda: int(ns())
na = lambda: list(map(int, stdin.readline().split()))
ns = lambda: stdin.readline().strip()
@dataclasses.dataclass
class State:
clus: [int]
val: int
hidden: int
def h(self):
return (*self.clus, self.hidden)
MOD = 1000000007
def normalize(a: [int]) -> [int]:
label = {}
p = 0
for i in range(len(a)):
if a[i] == -1:
continue
if a[i] not in label:
label[a[i]] = p
p += 1
a[i] = label[a[i]]
return a
def add(s: State, dp: [int, State]):
key = s.h()
if key in dp:
dp[key].val = (dp[key].val + s.val) % MOD
else:
dp[key] = s
n, m = na()
initial = State([-1] * n, 1, 0)
dp: [int, State] = {}
dp[initial.h()] = initial
for j in range(m+1):
for i in range(n):
ndp = {}
for s in dp.values():
# 黒いセルを追加
nclus = [n] + s.clus[:-1]
if i > 0 and s.clus[0] != -1:
for k in range(1, n):
if nclus[k] == s.clus[0]:
nclus[k] = n
if s.clus[-1] != -1:
for k in range(1, n):
if nclus[k] == s.clus[-1]:
nclus[k] = n
normalize(nclus)
ns = State(nclus, s.val, s.hidden)
add(ns, ndp)
nclus = [-1] + s.clus[:-1]
nhidden = s.hidden
if s.clus[-1] != -1 and all(s.clus[_] != s.clus[-1] for _ in range(n-1)):
nhidden += 1
numclus = nhidden + (1 if any(_ != -1 for _ in nclus) else 0)
if numclus <= 1:
normalize(nclus)
ns = State(nclus, s.val, nhidden)
add(ns, ndp)
dp = ndp
ans = 0
for s in dp.values():
if s.hidden == 1 and all(_ == -1 for _ in s.clus):
ans += s.val
print(ans % MOD)