
C - Distance Indicators
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
2重ループするとTLEになってしまうということで工夫が必要な問題でした
元の式j−i=Ai+Aj
を変形するとj−Aj=i+Ai
になります
i+Ai
の数を記録・カウントしておくと、記録していた数の中からj−Aj
に当てはまる数を数えることで
を満たすものを算出できますj−Aj=i+Ai
j(i+Ai)を先に記録してしまうとi<j
の制約に引っ掛かるため先にi(i-Ai)をansに追加しています
def i_map():
return map(int, input().split())
def i_list():
return list(map(int, input().split()))
n = int(input())
a = i_list()
d = dict()
ans = 0
for i in range(0, n):
if i - a[i] in d:
ans += d[i - a[i]]
if i + a[i] not in d:
d[i + a[i]] = 1
else:
d[i + a[i]] += 1
print(ans)
全く解法が思いつかなかったし、解説理解するのも時間かかった、、
ちなみに後で見たらPythonでもっと短くかける方法がありました
コメント