Buggy python submission (verdict: Time Limit Exceeded):
from collections import Counter

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

# 書かれた番号の頻度
Cntr = Counter(A)
Freq = sorted(Cntr.items(), key=lambda x: x[1], reverse=True)

# 答えの最大値 (1個しか存在しない番号は、取り除いても答えに影響しない)
ans_max = 0
for kv in Freq:
  if kv[1] < 2: break
  ans_max += kv[1] * (kv[1] - 1) // 2

# 答えのメモ (複数回計算しないように)
memo = dict()

for a in A:
  # 取り除いても答えに影響しない
  if Cntr.get(a) == 1:
    print(ans_max)
    continue

  # 過去に計算済みの番号
  if memo.get(a) != None:
    print(memo[a])
    continue

  ans = 0
  for kv in Freq:
    # 大きい順に見ているので1個になったら終了
    if kv[1] < 2: break
    # key -> value : 番号 -> ボール個数
    cnt = kv[1]
    # 自身は取り除く
    if kv[0] == a: cnt -= 1
    # 2個未満はスキップ
    if cnt < 2: continue
    # 2つ選ぶ方法は n*(n-1)//2
    ans += cnt * (cnt-1) // 2
  print(ans)
  memo[a] = ans

Fixed submission:
from collections import Counter

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

# 書かれた番号の頻度
Freq = dict(sorted(Counter(A).items(), key=lambda x: x[1], reverse=True))

# 答えの最大値
ans_max = 0
for kv in Freq.items():
  ans_max += kv[1] * (kv[1] - 1) // 2

for a in A:
  # 1個しか存在しない番号は、取り除いても答えに影響しない
  if Freq.get(a) == 1:
    print(ans_max)
    continue

  # x個の場合と、x-1個の場合と、の差分
  x = Freq.get(a)
  diff = (x * (x-1) // 2) - ((x-1) * (x-2) // 2)

  # そのぶんだけ、答えの最大値から減らす
  ans = ans_max - diff
  print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
from collections import Counter

def solve():
  n = int(input())
  A = list(map(int, input().split()))

  # 書かれた番号の頻度
  Freq = sorted(Counter(A).items(), key=lambda x: x[1], reverse=True)

  # 答えのメモ (複数回計算しないように)
  memo = dict()

  for a in A:
    if memo.get(a) != None:
      print(memo[a])
      continue

    ans = 0
    for kv in Freq:
      # 大きい順に見ているので1個になったら終了
      if kv[1] < 2: break
      # key -> value : 番号 -> ボール個数
      cnt = kv[1]
      # 自身は取り除く
      if kv[0] == a: cnt -= 1
      # 2個未満はスキップ
      if cnt < 2: continue
      # 2つ選ぶ方法は n*(n-1)//2
      ans += cnt * (cnt-1) // 2
    print(ans)
    memo[a] = ans

solve()

Fixed submission:
from collections import Counter

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

# 書かれた番号の頻度
Freq = dict(sorted(Counter(A).items(), key=lambda x: x[1], reverse=True))

# 答えの最大値
ans_max = 0
for kv in Freq.items():
  ans_max += kv[1] * (kv[1] - 1) // 2

for a in A:
  # 1個しか存在しない番号は、取り除いても答えに影響しない
  if Freq.get(a) == 1:
    print(ans_max)
    continue

  # x個の場合と、x-1個の場合と、の差分
  x = Freq.get(a)
  diff = (x * (x-1) // 2) - ((x-1) * (x-2) // 2)

  # そのぶんだけ、答えの最大値から減らす
  ans = ans_max - diff
  print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
from collections import Counter

def solve():
  n = int(input())
  A = list(map(int, input().split()))

  # 書かれた番号の頻度
  Freq = Counter(A)

  # 答えのメモ (複数回計算しないように)
  memo = dict()

  for a in A:
    if memo.get(a) != None:
      print(memo[a])
      continue

    ans = 0
    for kv in Freq.items():
      # key -> value : 番号 -> ボール個数
      cnt = kv[1]
      # 自身は取り除く
      if kv[0] == a: cnt -= 1
      # 2個未満はスキップ
      if cnt < 2: continue
      # 2つ選ぶ方法は n*(n-1)//2
      ans += cnt * (cnt-1) // 2
    print(ans)
    memo[a] = ans

solve()

Fixed submission:
from collections import Counter

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

# 書かれた番号の頻度
Freq = dict(sorted(Counter(A).items(), key=lambda x: x[1], reverse=True))

# 答えの最大値
ans_max = 0
for kv in Freq.items():
  ans_max += kv[1] * (kv[1] - 1) // 2

for a in A:
  # 1個しか存在しない番号は、取り除いても答えに影響しない
  if Freq.get(a) == 1:
    print(ans_max)
    continue

  # x個の場合と、x-1個の場合と、の差分
  x = Freq.get(a)
  diff = (x * (x-1) // 2) - ((x-1) * (x-2) // 2)

  # そのぶんだけ、答えの最大値から減らす
  ans = ans_max - diff
  print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
from collections import Counter

def solve():
  n = int(input())
  A = list(map(int, input().split()))

  # 書かれた番号の頻度
  Freq = Counter(A)

  # 答えのメモ (複数回計算しないように)
  memo = dict()

  for a in A:
    if memo.get(a) != None:
      print(memo[a])
      continue

    ans = 0
    for kv in Freq.items():
      # key -> value : 番号 -> ボール個数
      cnt = kv[1]
      # 自身は取り除く
      if kv[0] == a: cnt -= 1
      # 2個未満はスキップ
      if cnt < 2: continue
      # 2つ選ぶ方法は n*(n-1)//2
      ans += cnt * (cnt-1) // 2
    print(ans)
    memo[a] = ans

solve()

Fixed submission:
from collections import Counter

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

# 書かれた番号の頻度
Freq = dict(sorted(Counter(A).items(), key=lambda x: x[1], reverse=True))

# 答えの最大値
ans_max = 0
for kv in Freq.items():
  ans_max += kv[1] * (kv[1] - 1) // 2

for a in A:
  # 1個しか存在しない番号は、取り除いても答えに影響しない
  if Freq.get(a) == 1:
    print(ans_max)
    continue

  # x個の場合と、x-1個の場合と、の差分
  x = Freq.get(a)
  diff = (x * (x-1) // 2) - ((x-1) * (x-2) // 2)

  # そのぶんだけ、答えの最大値から減らす
  ans = ans_max - diff
  print(ans)

Buggy python submission (verdict: Time Limit Exceeded):
from collections import Counter

def solve():
  n = int(input())
  A = list(map(int, input().split()))

  # 書かれた番号の頻度
  Freq = Counter(A)

  for a in A:
    ans = 0
    for kv in Freq.items():
      # key -> value : 番号 -> ボール個数
      cnt = kv[1]
      # 自身は取り除く
      if kv[0] == a: cnt -= 1
      # 2個未満はスキップ
      if cnt < 2: continue
      # 2つ選ぶ方法は n*(n-1)//2
      ans += cnt * (cnt-1) // 2
    print(ans)

solve()

Fixed submission:
from collections import Counter

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

# 書かれた番号の頻度
Freq = dict(sorted(Counter(A).items(), key=lambda x: x[1], reverse=True))

# 答えの最大値
ans_max = 0
for kv in Freq.items():
  ans_max += kv[1] * (kv[1] - 1) // 2

for a in A:
  # 1個しか存在しない番号は、取り除いても答えに影響しない
  if Freq.get(a) == 1:
    print(ans_max)
    continue

  # x個の場合と、x-1個の場合と、の差分
  x = Freq.get(a)
  diff = (x * (x-1) // 2) - ((x-1) * (x-2) // 2)

  # そのぶんだけ、答えの最大値から減らす
  ans = ans_max - diff
  print(ans)