AtCoder ARC132 個人的メモ
A - Permutation Grid
問題文と制約にもあるが、
例1の場合について実際に色を塗ってみる。
まず
同様に
次に
そのため、新たに黒く塗るマスは4つの白マスの内の3つになる。
また、この時の白マスは
ここで
よって、
同様に
N = int(input())
R = list(map(int, input().split()))
C = list(map(int, input().split()))
Q = int(input())
ans = []
for _ in range(Q):
r, c = map(lambda n: int(n) - 1, input().split())
if R[r] + C[c] > N:
ans.append("#")
else:
ans.append(".")
print("".join(ans))
B - Shift and Reverse
数列
数字は数列のインデックス(何番目か)を示す
# 操作前の状態
8 1 2
7 3
6 5 4
# 全体をひっくりかえす
1 8 7
2 6
3 4 5
# 先頭の項を末尾に移動させる
1 2 3
8 4
7 6 5
この図から、操作によって各要素の順番を変えることはできず、数列の先頭を任意の要素に変更することしかできないと分かる。
制約により与えられる
したがって以下のように場合分けして解けばおk。
-
から時計回りに昇順になっている場合(P_i=1 の場合)P_{i+1}=2
のようになっているので、以下の2つのどちらかが答え。P=(4, 5, 1, 2, 3) - 2つ目の操作のみによって1よりも前の要素を全て末尾に移動させる場合(今の
だと2回操作)P - 最初に反転し、その後1よりも前の要素と1を全て末尾に移動させて、最後に再び反転する場合(5回)
の場合だとP=(4, 5, 1, 2, 3) を移動させる。1,2,3
- 2つ目の操作のみによって1よりも前の要素を全て末尾に移動させる場合(今の
-
から反時計回りに昇順になっている場合(P_{i+1}!=2の場合)P_i=1
のようになっているP=(3, 2, 1, 5, 4) - 2つ目の操作によって1よりも前の要素と1を全て末尾に移動させて、最後に再び反転する場合(4回)
- 最初に反転し、その後1よりも前の要素を全て末尾に移動させる場合(3回)
N = int(input())
P = list(map(int, input().split()))
i = P.index(1)
j = (i + 1) % N
# 小さい順になっている場合
if P[j] == 2:
ans = min(i, N - i + 2)
# 大きい順になっている場合
else:
ans = min(j + 1, 1 + N - j)
print(ans)
Discussion