Official

A - Gold and Silver Editorial by maroonrk_admin


最終的な解は,なんらかの数列 \(1 \leq x_1<y_1<x_2<y_2<\cdots<x_k<y_k \leq N\) を用いて,以下のように表されます.

  • \(x_1\) 日目に金を銀に交換し,\(y_1\) 日目に銀を金に交換して,金の量を \(A_{x_1}/A_{y_1}\) 倍にする.
  • \(x_2\) 日目に金を銀に交換し,\(y_2\) 日目に銀を金に交換して,金の量を \(A_{x_2}/A_{y_2}\) 倍にする.
  • \(\vdots\)
  • \(x_k\) 日目に金を銀に交換し,\(y_k\) 日目に銀を金に交換して,金の量を \(A_{x_k}/A_{y_k}\) 倍にする.

ところで,\(1\) 日に何度も交換を行えると考えても最終的な金の量は変わりません.(\(1\) 日に \(2\) 回交換を行うことは,\(0\) 回交換するのと同じ.) よって,”\(x_i\) 日目に金を銀に交換し,\(y_i\) 日目に銀を金に交換して,金の量を \(A_{x_i}/A_{y_i}\) 倍にする” という操作は,以下と同値です.

  • \(x_i\) 日目に金を銀に交換し,\(x_i+1\) 日目に銀を金に交換して,金の量を \(A_{x_i}/A_{x_i+1}\) 倍にする.
  • \(x_i+1\) 日目に金を銀に交換し,\(x_i+2\) 日目に銀を金に交換して,金の量を \(A_{x_i+1}/A_{x_i+2}\) 倍にする.
  • \(\vdots\)
  • \(y_i-1\) 日目に金を銀に交換し,\(y_i\) 日目に銀を金に交換して,金の量を \(A_{y_i-1}/A_{y_i}\) 倍にする.

以上をまとめると,どのタイミングで交換を行うかを決めることは,各 \(1 \leq i \leq N-1\) について,”\(i\) 日目に金を銀に交換し,\(i+1\) 日目に銀を金に交換して,金の量を \(A_{i}/A_{i+1}\) 倍にする” かどうかを決めるのと同じです.

明らかに,\(A_i > A_{i+1}\) である \(i\) についてのみ上の操作をするのが最適です. よって,次のようなコードを書くことができます.

n=int(input())
a=list(map(int,input().split()))

ans=[0]*n

for i in range(n-1):
	if a[i]>a[i+1]:
		ans[i]^=1
		ans[i+1]^=1

print(*ans)

計算量は \(O(N)\) です.

posted:
last update: