G - Segment Sum Constraints Editorial by kyopro_friends

矛盾判定パートについて

矛盾判定はポテンシャル付きDSUを使うことでサボることができます。

疑似コード

// dsu.merge(i, j, x) で iからjへのポテンシャルの差を x とする。既存の情報と矛盾していたら False を返す
// dsu.diff(i, j) で iからjへのポテンシャルの差を返す
// その他はatcoder::dsuと同じ


// 適当な変換により、正整数列ではなく非負整数列を求める問題に変換済みとする

d <- dsu(N+1)
for i in 0..M:
  if d.merge(L[i]-1,R[i],S[i]) is False:
    ans_is_zero()

for i in 0..N+1:
  for j in i+1..N+1:
    for ii in i..j+1:
      for jj in ii..j+1:
        if d.same(i,j) and d.same(ii,jj) and d.diff(i,j)<d.diff(ii,jj):
           ans_is_zero()

if min(L)!=1 or max(R)!=N:
  ans_is_infinity()

// ここに到達した場合、答えは0でもinfinityでもない

posted:
last update: