結果
問題 | No.1300 Sum of Inversions |
ユーザー |
|
提出日時 | 2024-10-11 09:32:15 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,013 ms / 2,000 ms |
コード長 | 3,217 bytes |
コンパイル時間 | 343 ms |
コンパイル使用メモリ | 81,664 KB |
実行使用メモリ | 219,636 KB |
最終ジャッジ日時 | 2024-10-11 09:32:44 |
合計ジャッジ時間 | 26,877 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 34 |
ソースコード
class SegmentTree:def __init__(self, a):self.padding = 0self.n = len(a)self.N = 2 ** (self.n-1).bit_length()self.seg_data = [self.padding]*(self.N-1) + a + [self.padding]*(self.N-self.n)for i in range(2*self.N-2, 0, -2):self.seg_data[(i-1)//2] = self.seg_data[i] + self.seg_data[i-1]def __len__(self):return self.ndef __getitem__(self, i):return self.seg_data[self.N-1+i]def __setitem__(self, i, x):idx = self.N - 1 + iself.seg_data[idx] = xwhile idx:idx = (idx-1) // 2self.seg_data[idx] = self.seg_data[2*idx+1] + self.seg_data[2*idx+2]def query(self, i, j):# [i, j)if i == j:return 0else:idx1 = self.N - 1 + iidx2 = self.N - 2 + j # 閉区間にするresult = self.paddingwhile idx1 < idx2 + 1:if idx1&1 == 0: # idx1が偶数result = result + self.seg_data[idx1]if idx2&1 == 1: # idx2が奇数result = result + self.seg_data[idx2]idx2 -= 1idx1 //= 2idx2 = (idx2 - 1)//2return resultdef kth_left_idx(self, fr, k):if self.query(0, fr+1) < k:return -1remain = know = fr + self.N - 1while self.seg_data[now] < remain:if now % 2:remain -= self.seg_data[now]now -= 1else:now = (now - 1) // 2while now < self.N - 1:nl = 2*now + 1nr = nl + 1if self.seg_data[nr] < remain:remain -= self.seg_data[nr]now = nlelse:now = nrreturn now - (self.N - 1)def kth_right_idx(self, fr, k):if self.query(fr, self.n) < k:return -1remain = know = fr + self.N - 1while self.seg_data[now] < remain:if now % 2 == 0:remain -= self.seg_data[now]now += 1else:now //= 2while now < self.N - 1:nl = 2*now + 1nr = nl + 1if self.seg_data[nl] < remain:remain -= self.seg_data[nl]now = nrelse:now = nlreturn now - (self.N - 1)N = int(input())A = list(map(int, input().split()))B = sorted(set(A))M = len(B)a2id = dict(zip(B, range(M)))C = SegmentTree([0]*M)S = SegmentTree([0]*M)mod = 998244353cnt = [0] * Nans = [0] * Nfor i, ai in enumerate(A):idx = a2id[ai]c = C.query(idx+1, M)cnt[i] = cans[i] = S.query(idx+1, M)C[idx] += 1S[idx] += aiC = SegmentTree([0]*M)S = SegmentTree([0]*M)ANS = 0for i in range(N-1, -1, -1):ai = A[i]idx = a2id[ai]c = C.query(0, idx)s = S.query(0, idx)ANS += c * cnt[i] * ai % modANS += c * ans[i] % modANS += cnt[i] * s % modANS %= modC[idx] += 1S[idx] += aiprint(ANS)