結果
問題 | No.1300 Sum of Inversions |
ユーザー |
|
提出日時 | 2020-11-27 22:32:46 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 849 ms / 2,000 ms |
コード長 | 1,796 bytes |
コンパイル時間 | 360 ms |
コンパイル使用メモリ | 82,192 KB |
実行使用メモリ | 173,892 KB |
最終ジャッジ日時 | 2024-07-26 18:50:46 |
合計ジャッジ時間 | 21,382 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
class BIT:def __init__(self, n):self.size = nself.tree = [0]*(n+1)def build(self, list):self.tree[1:] = list.copy()for i in range(self.size+1):j = i + (i & (-i))if j < self.size+1:self.tree[j] += self.tree[i]def sum(self, i):# [0, i) の要素の総和を返すs = 0while i>0:s += self.tree[i]i -= i & -ireturn s# 0 index を 1 index に変更 転倒数を求めるなら1を足していくdef add(self, i, x):i += 1while i <= self.size:self.tree[i] += xi += i & -i# 総和がx以上になる位置のindex をbinary searchdef bsearch(self,x):le = 0ri = 1<<(self.size.bit_length()-1)while ri > 0:if le+ri <= self.size and self.tree[le+ri]<x:x -= self.tree[le+ri]le += riri >>= 1return le+1n = int(input())mod = 998244353a = list(map(int,input().split()))dic = {}s = sorted(list(set(a)))for num,i in enumerate(s):dic[i] = numle = len(s)bitl = BIT(le+1)L = [0]*nfor num,i in enumerate(a):c = bitl.sum(dic[i]+1)L[num] = num-cbitl.add(dic[i],1)bitr = BIT(le+1)R = [0]*nfor i in range(n-1,-1,-1):c = bitr.sum(dic[a[i]])R[i] = cbitr.add(dic[a[i]],1)ans = 0for i in range(n):ans += L[i]*R[i]*a[i]%modans %= modbitl = BIT(le+1)s = 0for num,i in enumerate(a):c = bitl.sum(dic[i]+1)ans += (s-c)*i%modans %= mods += L[num]bitl.add(dic[i],L[num])bitr = BIT(le+1)for i in range(n-1,-1,-1):c = bitr.sum(dic[a[i]])ans += c*a[i]%modans %= modbitr.add(dic[a[i]],R[i])print(ans)