結果

問題 No.629 グラフの中に眠る門松列
ユーザー mai
提出日時 2018-01-11 21:06:50
言語 Ruby
(3.4.1)
結果
AC  
実行時間 108 ms / 4,000 ms
コード長 1,178 bytes
コンパイル時間 47 ms
コンパイル使用メモリ 7,424 KB
実行使用メモリ 12,672 KB
最終ジャッジ日時 2024-12-23 17:33:47
合計ジャッジ時間 5,550 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 6
other AC * 36
権限があれば一括ダウンロードができます
コンパイルメッセージ
Syntax OK

ソースコード

diff #

def ascan; gets.split.map(&:to_i);end


N, M = ascan
A    = ascan

# 隣接リスト
adjacents = Array.new(N){[]}

M.times do
    u, v = ascan
    u -= 1; v -= 1
    adjacents[u] << v
    adjacents[v] << u
end


ans = 0

# 頂点vを中心とする長さ2のパスについて調べたい
0.upto(N-1) do |v|
    
    # 頂点 v に書かれた数字
    a = A[v]
    
    # aより小さな数字が書かれた頂点 {key:数字, value:個数}
    small = Hash.new(0)
    # aより大きな数字が書かれた頂点
    large = Hash.new(0)
    
    adjacents[v].each do |u|
        small[A[u]] += 1 if A[u] < a
        large[A[u]] += 1 if A[u] > a
    end
    
    # aが最大となる🎍パスの数え上げ
    unless small.empty?
        cnt = small.values.reduce(:+)
        ans += cnt*(cnt-1)/2
        small.each do |key, val|
            ans -= val*(val-1)/2
        end
    end
    
    # aが最小となる🎍パスの数え上げ
    unless large.empty?
        cnt = large.values.reduce(:+)
        ans += cnt*(cnt-1)/2
        large.each do |key, val|
            ans -= val*(val-1)/2
        end
    end
    
end

# 個数
# p ans

puts ans > 0 ? :YES: :NO
0