結果
問題 | No.2873 Kendall's Tau |
ユーザー |
![]() |
提出日時 | 2024-09-11 13:53:05 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,541 ms / 4,500 ms |
コード長 | 2,387 bytes |
コンパイル時間 | 313 ms |
コンパイル使用メモリ | 82,128 KB |
実行使用メモリ | 230,920 KB |
最終ジャッジ日時 | 2024-09-11 13:53:33 |
合計ジャッジ時間 | 26,655 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 30 |
ソースコード
import ioimport sysfrom collections import defaultdict, deque, Counterfrom itertools import permutations, combinations, accumulatefrom heapq import heappush, heappopfrom bisect import bisect_right, bisect_leftfrom math import gcdimport math_INPUT = """\631 41 59 221 12 254 45 70 42 10-6 4"""class BIT: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 & -p#合計にはrを含まないdef 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#pの位置をxという値にセットdef set(self, p, x):self.add(p, -self.sum(p, p+1) + x)def input():return sys.stdin.readline()[:-1]def solve(test):N=int(input())data=[list(map(int, input().split())) for _ in range(N)]d={x:i for i,x in enumerate(sorted(set([x for x,y in data]+[y for x,y in data])))}data=[(d[x],d[y]) for x,y in data]data.sort(key=lambda x:(x[0],x[1]))bit=BIT(len(d))Q=0for x,y in data:Q+=bit.sum(y+1,len(d))bit.add(y,1)bit=BIT(len(d))data.sort(key=lambda x:(x[0],-x[1]))# print(data)P=0for x,y in data:P+=bit.sum(0,y)bit.add(y,1)C1=Counter([x for x,y in data])C2=Counter([y for x,y in data])R=sum([(N-C1[x])*C1[x] for x in C1])//2S=sum([(N-C2[y])*C2[y] for y in C2])//2print((P-Q)/(R*S)**0.5)def random_input():from random import randint,shuffleN=randint(1,10)M=randint(1,N)A=list(range(1,M+1))+[randint(1,M) for _ in range(N-M)]shuffle(A)return (" ".join(map(str, [N,M]))+"\n"+" ".join(map(str, A))+"\n")*3def simple_solve():return []def main(test):if test==0:solve(0)elif test==1:sys.stdin = io.StringIO(_INPUT)case_no=int(input())for _ in range(case_no):solve(0)else:for i in range(1000):sys.stdin = io.StringIO(random_input())x=solve(1)y=simple_solve()if x!=y:print(i,x,y)print(*[line for line in sys.stdin],sep='')break#0:提出用、1:与えられたテスト用、2:ストレステスト用main(0)