結果
問題 | No.2873 Kendall's Tau |
ユーザー |
![]() |
提出日時 | 2024-09-06 22:08:37 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,106 ms / 4,500 ms |
コード長 | 2,570 bytes |
コンパイル時間 | 467 ms |
コンパイル使用メモリ | 82,248 KB |
実行使用メモリ | 200,724 KB |
最終ジャッジ日時 | 2024-09-06 22:10:18 |
合計ジャッジ時間 | 17,522 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
import sysinput = sys.stdin.readlinefrom collections import *class Fenwick_Tree:def __init__(self, n):self._n = nself.data = [0] * ndef add(self, p, x):assert 0 <= p < self._np += 1while p <= self._n:self.data[p - 1] += xp += p & -pdef sum(self, l, r):assert 0 <= l <= r <= self._nreturn self._sum(r) - self._sum(l)def _sum(self, r):s = 0while r > 0:s += self.data[r - 1]r -= r & -rreturn s# T.sum(0, x) <= kとなる最大のxを返す。def get(self, k):k += 1x, r = 0, 1while r < self._n:r <<= 1len = rwhile len:if x + len - 1 < self._n:if self.data[x + len - 1] < k:k -= self.data[x + len - 1]x += lenlen >>= 1return xdef __str__(self):temp = []for i in range(self._n):temp.append(str(self.sum(i, i + 1)))return ' '.join(temp)from bisect import *from copy import deepcopydef compress(lst):'''B: lstを座圧したリストidx_to_val: indexから元の値を取得するリストval_to_idx: 元の値からindexを取得する辞書'''B = []val_to_idx = {}idx_to_val = deepcopy(lst)idx_to_val = list(set(idx_to_val))idx_to_val.sort()for i in range(len(lst)):ind = bisect_left(idx_to_val, lst[i])B.append(ind)for i in range(len(B)):val_to_idx[lst[i]] = B[i]return B, idx_to_val, val_to_idxN = int(input())X, Y = [], []D = []for i in range(N):x, y = map(int, input().split())X.append(x)Y.append(y)X, _, _ = compress(X)Y, _, _ = compress(Y)D = [[] for i in range(N)]for i in range(N):D[X[i]].append(Y[i])Cx = Counter(X)Cy = Counter(Y)R, S = N * (N - 1) // 2, N * (N - 1) // 2for k, v in Cx.items():R -= v * (v - 1) // 2for k, v in Cy.items():S -= v * (v - 1) // 2P = 0T = Fenwick_Tree(N + 1)for x in range(N):for y in D[x]:T.add(y, 1)for x in range(N):for y in D[x]:T.add(y, -1)for y in D[x]:P += T.sum(y + 1, N + 1)Q = 0T = Fenwick_Tree(N + 1)for x in range(N-1, -1, -1):for y in D[x]:T.add(y, 1)for x in range(N-1, -1, -1):for y in D[x]:T.add(y, -1)for y in D[x]:Q += T.sum(y + 1, N + 1)print((P - Q) / (R * S) ** 0.5)