結果
| 問題 |
No.1300 Sum of Inversions
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-11-27 21:53:37 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 910 ms / 2,000 ms |
| コード長 | 1,904 bytes |
| コンパイル時間 | 262 ms |
| コンパイル使用メモリ | 81,884 KB |
| 実行使用メモリ | 172,384 KB |
| 最終ジャッジ日時 | 2024-07-26 12:24:01 |
| 合計ジャッジ時間 | 23,934 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 34 |
ソースコード
class BIT():
__slots__ = ["func", "e", "n", "data"]
def __init__(self, length_or_list, func, e):
self.func = func
self.e = e
if isinstance(length_or_list, int):
self.n = length_or_list + 1
self.data = [self.e] * self.n
else:
self.n = len(length_or_list) + 1
self.data = [self.e] + length_or_list
for i in range(1, self.n):
if i + (i & -i) < self.n:
self.data[i + (i & -i)] = self.func(self.data[i + (i & -i)], self.data[i])
def point_append(self, index, delta):
index += 1
while index < self.n:
self.data[index] = self.func(self.data[index], delta)
index += index & -index
def prefix_folded(self, end):
res = 0
while end > 0:
res = self.func(res, self.data[end])
end -= end & -end
return res
from operator import add
MOD = 998244353
N = int(input())
As = list(map(int, input().split()))
a2A = sorted(set(As))
A2a = {A: a for a, A in enumerate(a2A)}
def modadd(a, b):
return (a + b) % MOD
ansi = []
cnti = []
ansk = []
cntk = []
cnt_bit = BIT(N, add, 0)
A_bit = BIT(N, modadd, 0)
for A in As:
a = A2a[A]
ansi.append(A_bit.prefix_folded(N - a))
cnti.append(cnt_bit.prefix_folded(N - a))
A_bit.point_append(N - a, A)
cnt_bit.point_append(N - a, 1)
cnt_bit = BIT(N, add, 0)
A_bit = BIT(N, modadd, 0)
for A in reversed(As):
a = A2a[A]
ansk.append(A_bit.prefix_folded(a))
cntk.append(cnt_bit.prefix_folded(a))
A_bit.point_append(a, A)
cnt_bit.point_append(a, 1)
ansk = ansk[::-1]
cntk = cntk[::-1]
# print(ansi, ansk, cnti, cntk)
ans = 0
for ai, ci, ak, ck, A in zip(ansi, cnti, ansk, cntk, As):
ans += ci * ck * A % MOD
ans += ci * ak % MOD
ans += ai * ck % MOD
ans %= MOD
print(ans)