ABC 189 C問題


要約

(l, r, x)の組を決めるには,(l, r)の組み合わせが決まればその範囲の中の最小値をxにすればうまく行くと考え,(l, r)を決める全探索はO(N^2)で回るのでうまくいくと思っていた.

N = int(input())
A = list(map(int, input().split()))
ans = 0
for l in range(N+1):
   for r in range(l, N+1):
       s = A[l:r]
       if len(s) != 0:
           x = min(s)
           val = x * len(s)
           ans = max(ans, val)

print(ans)

しかし,このやり方だとTLEになる.

その理由は,二重for文の中の

s = A[l:r]

にある.python(PyPy)ではリストの中から一つの要素を取り出すのはO(1)だが,リストの中から複数の要素を取り出そうとしたら最悪O(N)になる.

そのため,このやり方だとO(N^3)で回ってしまいTLEとなる.

解決策

最初のやり方は,

・範囲を決める→最小値を決定する→計算

の順だったがそうではなくて,

・最小値を更新する → 次の要素とどっちが小さいか比較する → 小さい方の要素×範囲で値を更新する

という流れになる.イメージ的には

画像1

最初のやり方は図の上のようにfor文で範囲を決めていたが解決策では,図の下のように,for文で見る要素をずらしていくイメージで解いていく.

N = int(input())
A = list(map(int, input().split()))

ans = 0
for l in range(N):
   val = A[l]
   for r in range(l, N):
       val = min(val, A[r])
       ans = max(ans, val * (r-l+1))
print(ans)

この記事が気に入ったらサポートをしてみませんか?