結果
| 問題 |
No.121 傾向と対策:門松列(その2)
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2022-02-09 09:12:20 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,607 bytes |
| コンパイル時間 | 754 ms |
| コンパイル使用メモリ | 12,800 KB |
| 実行使用メモリ | 129,272 KB |
| 最終ジャッジ日時 | 2024-06-24 07:34:54 |
| 合計ジャッジ時間 | 10,596 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 3 TLE * 1 -- * 5 |
ソースコード
class FenwickTree:
"""
Implements fenwick tree
"""
def __init__(self, N: int):
"""
Initializes fenwick tree with size N, indexed from 0 to N-1.
"""
self.__N = N
self.__data = [0] * N
def add(self, pos: int, val: int):
"""
Applies A[pos] += val
"""
assert 0 <= pos < self.__N
pos += 1
while pos <= self.__N:
self.__data[pos - 1] += val
pos += pos & -pos
def sum(self, s: int, e: int):
"""
Calculates sum(A[s:e]), where 0 <= s <= e <= N.
"""
assert 0 <= s <= e <= self.__N
return self.__sum(e) - self.__sum(s)
def __sum(self, pos: int):
ans = 0
while pos > 0:
ans += self.__data[pos - 1]
pos -= pos & -pos
return ans
def main():
N = int(input())
*A, = map(int, input().split())
D = {}
for i in range(N):
if A[i] not in D:
D[A[i]] = []
D[A[i]].append(i)
ans = 0
F = FenwickTree(N)
for k in sorted(D.keys()):
for i in D[k]:
ans += F.sum(0, i) * F.sum(i+1, N)
for i in D[k]:
F.add(i, 1)
F = FenwickTree(N)
for k in sorted(D.keys(), reverse=True):
for i in D[k]:
ans += F.sum(0, i) * F.sum(i+1, N)
for i in D[k]:
F.add(i, 1)
for k in D.keys():
v = D[k]
for i in range(len(v)):
ans += (len(v)-1-2*i) * v[i]
ans += i * (len(v)-i)
print(ans)
if __name__ == '__main__':
main()