Задача Задача №3449922
А
А
Задача просит посчитать четыре количества пар между нажатиями клавиш и вывести коэффициент по формуле (sqrt(G) + sqrt(P)) / (sqrt(B) + sqrt(N)), где N в задаче — число почти плохих пар (назовём его N_ab, чтобы не путать с количеством нажатий).
Как считать без квадратичного перебора:
- G (хорошие пары): пары с одинаковыми k и одинаковыми c. G = sum по всем парам (k, c) от freq(k, c) выбиванию C(freq(k, c), 2).
- B (плохие пары): пары с одинаковым k, но разными c. B = sum по всем k C(freq(k), 2) minus G.
- N (почти плохие пары): пары с разными k, но одинаковыми c. N = sum по всем c C(freq(c), 2) minus G.
- P (почти хорошая пара): остальные пары, то есть P = total_pairs - G - B - N. total_pairs = C(N, 2).
После этого коэффициент
- если sqrt(B) + sqrt(N) = 0, выводим -1;
- иначе coef = (sqrt(G) + sqrt(P)) / (sqrt(B) + sqrt(N)).
Код на Python 3.11:
import sys
import math
def main():
data = list(map(int, sys.stdin.buffer.read().split()))
if not data:
return
it = iter(data)
n = next(it)
ks = [next(it) for _ in range(n)]
cs = [next(it) for _ in range(n)]
# Подсчёт частот по k, по c и частот по паре (k, c)
freq_k = {}
freq_c = {}
freq_pair = {}
for k, c in zip(ks, cs):
freq_k[k] = freq_k.get(k, 0) + 1
freq_c[c] = freq_c.get(c, 0) + 1
key = (k, c)
freq_pair[key] = freq_pair.get(key, 0) + 1
# G: суммарное число пар с одинаковыми (k, c)
G = 0
for v in freq_pair.values():
if v >= 2:
G += v * (v - 1) // 2
# B: пары с одинаковым k, но разными c
sum_ck2 = 0
for v in freq_k.values():
if v >= 2:
sum_ck2 += v * (v - 1) // 2
B = sum_ck2 - G
# N_ab: пары с одинаковым c, но разными k
sum_cc2 = 0
for v in freq_c.values():
if v >= 2:
sum_cc2 += v * (v - 1) // 2
N_ab = sum_cc2 - G
total_pairs = n * (n - 1) // 2
P = total_pairs - G - B - N_ab
# Проверка на полностью рабочую клавиатуру
denom = math.sqrt(B) + math.sqrt(N_ab)
if denom == 0.0:
print(-1)
return
coef = (math.sqrt(G) + math.sqrt(P)) / denom
# Вывод с достаточной точностью
print(f"{coef:.12f}")
if __name__ == "__main__":
main()
Пояснения по использованию:
- Входные данные следует подать в том порядке, как в условии: N, затем N чисел ki, затем N чисел ci.
- Программа работает за O(N) времени и O(U) памяти, где U — число уникальных значений ki, ci и пар (ki, ci). Подход подходит для N до 1e5.