Official

E - Uniqueness Editorial by kyopro_friends


それぞれの人に対し、自分以外に同じ数を持っている人がいるかを調べる以下のような実装では計算量が \(\Theta(N^2)\) となり、TLE (実行時間制限超過) になります。なお、見た目上は2重for文になっていない、filter や all などの関数・メソッドを使う実装も同様の計算量となることに注意してください。

for i in 1..N:
  ok = true
  for j in 1..N:
    if i != j and A[i] == A[j]:
      ok = false
  if ok:
    ...

次のような連想配列を考えます。
\(\mathrm{dict}[v]=v を持っている人の番号の集合\)
この連想配列は \(O(N\log N)\) で構築することができます。この連想配列において、集合の大きさが \(1\) であることが、その人以外に同じ数を持っている人がいないことと同値です。よって、連想配列の中身を走査することで、\(O(N\log N)\) で答えを求めることができます。

実装例(Python)

from collections import defaultdict

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

d=defaultdict(list)
for i,a in enumerate(A):
  d[a].append(i)

for key in sorted(d, reverse=True):
  if len(d[key])==1:
    print(d[key][0]+1)
    exit()

print(-1)

posted:
last update: