A - Add and Swap Editorial
by
nok0
\(N\) が \(2\) の場合は操作を \(2\) 回行うと \(A_2-A_1\) は初期状態と一致するので,操作を \(2\) 回以上行う意味はありません.操作を行わない場合と \(1\) 回行う場合を確認すればよいです.
\(N\) が \(3\) 以上の場合は入力に依存せず常に可能であることを,構成手順と共に示します.
\(i=1,\ldots,N-1\) の順に,\(i\) を選んで操作を行うことを \(2iM+1\) 回行います.\(i\) を選んだ操作を \(2iM+1\) 回行うことは,\(A_i,A_{i+1}\) をそれぞれ \(A_{i+1} + (iM+1)K, A_{i} + iMK\) で置き換えることに対応しています.
そのため,この手続きが終わった後の数列は以下のようになります.
\(A'=(A_2+(M+1)K, A_3 + (2M+1)K, A_4 + (3M+1)K,\ldots, A_N+((N-1)M+1)K, A_1 + N(N-1)MK)\)
\(M\) として 十分大きい(\(\lceil \frac{A_\mathrm{MAX}}{K}\rceil\) 以上の)値を使えば,手続き終了後の \(A\) は必ず昇順となることがいくつかの計算により確かめられます.
操作回数が最大になるのは \(N=50,K=1,A_\mathrm{MAX}=50\) の場合ですが,この場合でも操作回数は \(\sum_{i=1}^{N-1} (2iM+1 )= 122549\) 回であり,操作回数の制限を満たします.
実装例 (Python):
op = []
def out():
print("Yes")
print(len(op))
print(*op)
exit()
n, k = map(int, input().split())
a = list(map(int, input().split()))
if a == sorted(a):
out()
if n == 2:
a[0], a[1] = a[1] + k, a[0]
if a[0] <= a[1]:
op.append(1)
out()
else:
print("No")
exit()
for i in range(n - 1):
for j in range(100 * (i + 1) + 1):
op.append(i + 1)
out()
posted:
last update: