結果
問題 | No.1300 Sum of Inversions |
ユーザー | shotoyoo |
提出日時 | 2020-11-27 22:40:53 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 540 ms / 2,000 ms |
コード長 | 2,340 bytes |
コンパイル時間 | 459 ms |
コンパイル使用メモリ | 82,640 KB |
実行使用メモリ | 145,524 KB |
最終ジャッジ日時 | 2024-07-26 19:02:12 |
合計ジャッジ時間 | 15,151 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 40 ms
53,636 KB |
testcase_01 | AC | 37 ms
53,436 KB |
testcase_02 | AC | 39 ms
53,416 KB |
testcase_03 | AC | 416 ms
128,396 KB |
testcase_04 | AC | 397 ms
128,000 KB |
testcase_05 | AC | 342 ms
116,932 KB |
testcase_06 | AC | 464 ms
128,228 KB |
testcase_07 | AC | 450 ms
131,696 KB |
testcase_08 | AC | 481 ms
133,804 KB |
testcase_09 | AC | 479 ms
131,332 KB |
testcase_10 | AC | 295 ms
111,456 KB |
testcase_11 | AC | 291 ms
111,808 KB |
testcase_12 | AC | 420 ms
128,268 KB |
testcase_13 | AC | 408 ms
127,580 KB |
testcase_14 | AC | 540 ms
143,448 KB |
testcase_15 | AC | 483 ms
132,788 KB |
testcase_16 | AC | 414 ms
128,900 KB |
testcase_17 | AC | 273 ms
107,696 KB |
testcase_18 | AC | 301 ms
112,636 KB |
testcase_19 | AC | 359 ms
121,556 KB |
testcase_20 | AC | 372 ms
121,864 KB |
testcase_21 | AC | 371 ms
122,420 KB |
testcase_22 | AC | 336 ms
116,800 KB |
testcase_23 | AC | 450 ms
130,980 KB |
testcase_24 | AC | 342 ms
116,884 KB |
testcase_25 | AC | 298 ms
112,236 KB |
testcase_26 | AC | 304 ms
112,208 KB |
testcase_27 | AC | 323 ms
117,172 KB |
testcase_28 | AC | 521 ms
142,940 KB |
testcase_29 | AC | 362 ms
122,072 KB |
testcase_30 | AC | 506 ms
131,536 KB |
testcase_31 | AC | 334 ms
116,472 KB |
testcase_32 | AC | 357 ms
117,100 KB |
testcase_33 | AC | 232 ms
115,268 KB |
testcase_34 | AC | 249 ms
126,752 KB |
testcase_35 | AC | 397 ms
142,248 KB |
testcase_36 | AC | 450 ms
145,524 KB |
ソースコード
import sys input = lambda : sys.stdin.readline().rstrip() sys.setrecursionlimit(max(1000, 10**9)) write = lambda x: sys.stdout.write(x+"\n") class BIT: ### BIT binary def __init__(self, n, values=None): self.bit = [0]*(n+1) self.n = n if values is not None: for i,v in enumerate(values): self.add(i,v) #a1 ~ aiまでの和 O(logn) def query(self,i): res = 0 while i > 0: res += self.bit[i] i -= i&(-i) return res #ai += x(logN) def add(self,i,x): i += 1 if i==0: raise RuntimeError while i <= len(self.bit)-1: self.bit[i] += x i += i&(-i) def check(self): l = [] prv = 0 for i in range(1,self.n+1): val = self.query(i) l.append(val-prv) prv = val print(" ".join(map(str, l))) def index(self, v): """a0,...,aiの和がv以上になる最小のindexを求める 存在しないとき配列サイズを返す """ if v <= 0: return 0 x = 0 r = 1 while r < n: r = r << 1; ll = r while ll>0: if x+ll<n and self.bit[x+ll]<v: v -= self.bit[x+ll] x += ll ll = ll>>1 return x from bisect import bisect_left def press(l): # xs[inds[i]]==l[i]となる xs = sorted(set(l)) inds = [None] * len(l) for i,item in enumerate(l): inds[i] = bisect_left(xs, item) return xs, inds M = 998244353 n = int(input()) a = list(map(int, input().split())) xs, inds = press(a) m = len(xs) bit = BIT(m) v0 = [] for i,v in enumerate(inds): v0.append(i - bit.query(v+1)) bit.add(v, 1) bit = BIT(m) v1 = [] for i,v in enumerate(inds[::-1]): v1.append(bit.query(v)) bit.add(v, 1) v1 = v1[::-1] bit = BIT(m) c1 = [] for i in range(n-1,-1,-1): v = inds[i] c1.append(bit.query(v)) bit.add(v, v1[i]) c1 = c1[::-1] bit = BIT(m) c0 = [] tmp = 0 for i in range(n): v = inds[i] c0.append(tmp-bit.query(v+1)) bit.add(v, v0[i]) tmp += v0[i] ans = 0 for i in range(n): ans += a[i]*v0[i]*v1[i] # print(ans) # for i in range(n): ans += a[i]*(c0[i] + c1[i]) ans %= M print(ans)