結果
問題 | No.1096 Range Sums |
ユーザー | c-yan |
提出日時 | 2020-06-28 07:41:44 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
AC
|
実行時間 | 1,039 ms / 2,000 ms |
コード長 | 1,522 bytes |
コンパイル時間 | 631 ms |
コンパイル使用メモリ | 12,928 KB |
実行使用メモリ | 177,260 KB |
最終ジャッジ日時 | 2024-07-07 00:56:50 |
合計ジャッジ時間 | 6,900 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 24 ms
10,752 KB |
testcase_01 | AC | 25 ms
10,752 KB |
testcase_02 | AC | 25 ms
10,880 KB |
testcase_03 | AC | 24 ms
10,880 KB |
testcase_04 | AC | 27 ms
10,752 KB |
testcase_05 | AC | 25 ms
10,752 KB |
testcase_06 | AC | 25 ms
10,752 KB |
testcase_07 | AC | 25 ms
10,880 KB |
testcase_08 | AC | 25 ms
10,752 KB |
testcase_09 | AC | 24 ms
10,880 KB |
testcase_10 | AC | 1,010 ms
177,124 KB |
testcase_11 | AC | 1,002 ms
177,124 KB |
testcase_12 | AC | 1,012 ms
177,236 KB |
testcase_13 | AC | 1,039 ms
177,260 KB |
testcase_14 | AC | 1,015 ms
177,116 KB |
ソースコード
# Disjoint segment tree (+) from itertools import accumulate from operator import add class DisjointSparseTable: _f = None _data = None _lookup = None def __init__(self, a, f): self._f = f b = 0 while (1 << b) <= len(a): b += 1 _data = [[0] * len(a) for _ in range(b)] _data[0] = a[:] for i in range(1, b): shift = 1 << i for j in range(0, len(a), shift << 1): t = min(j + shift, len(a)) _data[i][t - 1] = a[t - 1] for k in range(t - 2, j - 1, -1): _data[i][k] = f(a[k], _data[i][k + 1]) if t >= len(a): break _data[i][t] = a[t] r = min(t + shift, len(a)) for k in range(t + 1, r): _data[i][k] = f(_data[i][k - 1], a[k]) self._data = _data _lookup = [0] * (1 << b) for i in range(2, len(_lookup)): _lookup[i] = _lookup[i >> 1] + 1 self._lookup = _lookup def query(self, start, stop): stop -= 1 if start >= stop: return self._data[0][start] p = self._lookup[start ^ stop] return self._f(self._data[p][start], self._data[p][stop]) N, *A = map(int, open(0).read().split()) a = list(accumulate(A)) st = DisjointSparseTable(a, add) result = 0 result += st.query(0, N) for i in range(1, N): result += st.query(i, N) - a[i - 1] * (N - i) print(result)