結果
| 問題 |
No.629 グラフの中に眠る門松列
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2017-05-08 23:39:39 |
| 言語 | Ruby (3.4.1) |
| 結果 |
AC
|
| 実行時間 | 101 ms / 4,000 ms |
| コード長 | 1,798 bytes |
| コンパイル時間 | 78 ms |
| コンパイル使用メモリ | 7,552 KB |
| 実行使用メモリ | 12,544 KB |
| 最終ジャッジ日時 | 2024-09-14 17:39:43 |
| 合計ジャッジ時間 | 5,325 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 6 |
| other | AC * 36 |
コンパイルメッセージ
Syntax OK
ソースコード
def scan; gets.split.map(&:to_i); end
def yes ; puts "YES" ; exit 0 ; end
def no ; puts "NO" ; exit 0 ; end
LARGE = 0
SMALL = 1
#
#
# 存在判定であれば,全列挙する必要はなく O(M) で出来る ・・・
#
#
n,m = scan
vertex = scan
vertex.unshift(nil)
memo = Array.new(n+1){[nil, nil]}
m.times{
u,v = scan
# ある辺の両端が同じ値なら,その辺は無視.
next if vertex[u] == vertex[v]
if (vertex[u] > vertex[v])
# もし,u が v 以外に vertex[u] より小さい頂点 x に隣接していて,
# その値が vertex[v] と異なるならば yes()
# 式で書くと,vertex[x] < vertex[u] > vertex[v] && vertex[x] != vertex[v]
yes if (memo[u][SMALL] && memo[u][SMALL] != vertex[v])
# もし,v が u 以外に vertex[v] より大きい頂点 x に隣接していて,
# その値が vertex[u] と異なるならば yes()
# 式で書くと,vertex[x] > vertex[v] < vertex[u] && vertex[x] != vertex[v]
yes if (memo[v][LARGE] && memo[v][LARGE] != vertex[u])
# u には,自分自身u より小さい値を持つ v と接続していることが分かった.
memo[u][SMALL] = vertex[v]
# v には,自分自身v より大きい値を持つ u と接続していることが分かった.
memo[v][LARGE] = vertex[u]
else
# ほとんど同じ
# vertex[x] > vertex[u] < vertex[v] && vertex[x] != vertex[v]
yes if (memo[u][LARGE] && memo[u][LARGE] != vertex[v])
# vertex[x] < vertex[v] > vertex[u] && vertex[x] != vertex[v]
yes if (memo[v][SMALL] && memo[v][SMALL] != vertex[u])
memo[u][LARGE] = vertex[v];
memo[v][SMALL] = vertex[u];
end
}
no