結果
問題 |
No.1300 Sum of Inversions
|
ユーザー |
![]() |
提出日時 | 2025-03-20 18:52:18 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 522 ms / 2,000 ms |
コード長 | 2,488 bytes |
コンパイル時間 | 148 ms |
コンパイル使用メモリ | 82,376 KB |
実行使用メモリ | 186,512 KB |
最終ジャッジ日時 | 2025-03-20 18:53:30 |
合計ジャッジ時間 | 15,531 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
MOD = 998244353 class FenwickTree: def __init__(self, size): self.n = size self.tree = [0] * (self.n + 2) # 1-based indexing def update(self, idx, delta): while idx <= self.n: self.tree[idx] = (self.tree[idx] + delta) % MOD idx += idx & -idx def query(self, idx): res = 0 while idx > 0: res = (res + self.tree[idx]) % MOD idx -= idx & -idx return res def compress_coordinates(arr): unique = sorted(set(arr)) rank = {v:i+1 for i, v in enumerate(unique)} # 1-based compressed = [rank[x] for x in arr] return compressed, len(unique) def main(): import sys input = sys.stdin.read().split() idx = 0 N = int(input[idx]) idx += 1 A = list(map(int, input[idx:idx+N])) idx += N if N < 3: print(0) return compressed_rank, max_rank = compress_coordinates(A) right = [0] * N ft_right = FenwickTree(max_rank) for j in range(N-1, -1, -1): cr = compressed_rank[j] count = ft_right.query(cr - 1) right[j] = count % MOD ft_right.update(cr, 1) sum_pairs = [0] * N ft_sum_pairs = FenwickTree(max_rank) for i in range(N-1, -1, -1): cr = compressed_rank[i] sum_p = ft_sum_pairs.query(cr - 1) sum_pairs[i] = sum_p % MOD ft_sum_pairs.update(cr, right[i] % MOD) sum_part1 = 0 for i in range(N): sum_part1 = (sum_part1 + sum_pairs[i] * A[i]) % MOD left = [0] * N ft_left = FenwickTree(max_rank) for j in range(N): cr = compressed_rank[j] count_so_far = j cnt_le = ft_left.query(cr) left_j = (count_so_far - cnt_le) % MOD left[j] = left_j ft_left.update(cr, 1) sum_part2 = 0 for j in range(N): l = left[j] % MOD r = right[j] % MOD contrib = (l * r) % MOD contrib = (contrib * A[j]) % MOD sum_part2 = (sum_part2 + contrib) % MOD sum_part3 = 0 sum_left_total = 0 ft_part3 = FenwickTree(max_rank) for k in range(N): cr = compressed_rank[k] sum_le = ft_part3.query(cr) sum_gr = (sum_left_total - sum_le) % MOD sum_part3 = (sum_part3 + sum_gr * A[k]) % MOD sum_left_total = (sum_left_total + left[k]) % MOD ft_part3.update(cr, left[k] % MOD) total = (sum_part1 + sum_part2 + sum_part3) % MOD print(total) if __name__ == "__main__": main()