ハードウェアエンジニアの守破離

国内電機メーカーに勤務しているハードウェアエンジニア

Atcorder_ABC199:C問題のTLE解決できず

参加は二回目ですが、残念ながらA, Bの2完。

当分はCまでの完答を目標にしていたので、早くも残念な結果に。

Cはアルゴリズムは構築できたが、規定時間内に処理できないため提出できず。

提出したコードの記録を残すとともに、C問題の解析を実施しました。

A問題

a, b, c = map(int, input().split())
if (a**2)+(b**2) < (c**2):
print("Yes")
else:
print("No")

1分30秒で提出。

B問題

A = []
B = []
N = int(input())

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

if min(B)-max(A)+1 > 0:
print(min(B)-max(A)+1)
else:
print(0)

7分30秒で提出。

C問題

自身が提出したコード:TLE

N = int(input())
S = input()
Q = int(input())
s = list(S)
# 以降、Sはリストとして扱う
for i in range(Q):
t, a, b = map(int, input().split())

if t == 2: # 前半後半を入れ替える
s[0:N], s[N:2 * N] = s[N:2 * N], s[0:N]

else: #AiBiを入れ替える
s[a - 1], s[b - 1] = s[b - 1], s[a - 1]
S = "".join(s)
print(S)

2213 ms (制限時間2,000msなので、213msオーバー (>_<)

・文字列Sは即座にリストsに変換する (例: FLIP→'F', 'L', 'I', 'P')

・クエリ先頭tに応じて分岐処理する (2 or 1)

解答例:AC

N = int(input())
S = input()
Q = int(input())
s0, s1 = list(S[:N]), list(S[N:2*N])
# 以降、Sはリストとして扱う
for i in range(Q):
t, a, b = map(int, input().split())

if t == 2: # 前半後半を入れ替える
s0, s1 = s1, s0

else: #AiBiを入れ替える
if b <= N:
s0[a-1], s0[b-1] = s0[b-1], s0[a-1]
elif N < a:
s1[a - 1 -N], s1[b - 1 - N] = s1[b - 1 - N], s1[a - 1 - N]
else:
s0[a - 1], s1[b - 1 - N] = s1[b - 1 - N], s0[a - 1]

S = "".join(s0 + s1)
print(S)

実行時間:459 ms (約1/5の処理時間に短縮)

・文字列Sは即座に2つのリストに分解する

【メリット】

・各リストが最大2×10^5文字まで短縮でき、前半後半の入れ替えがスムーズ

(分割しない場合、最大4×10^5文字になる可能性がある)

f:id:Subarukun:20210425001424p:plain

今回の反省点

  • 日々、計算時間を配慮に入れた演習を心がける
  • 処理時間が早い参加者のコードを参照して写経する
  • 処理内容に応じてリスト分割できないか試験中に検討する