結果
問題 |
No.956 Number of Unbalanced
|
ユーザー |
![]() |
提出日時 | 2025-04-15 22:11:05 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,402 bytes |
コンパイル時間 | 458 ms |
コンパイル使用メモリ | 82,096 KB |
実行使用メモリ | 331,592 KB |
最終ジャッジ日時 | 2025-04-15 22:12:38 |
合計ジャッジ時間 | 4,036 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 6 |
other | TLE * 1 -- * 23 |
ソースコード
import bisect class FenwickTree: def __init__(self, size): self.n = size self.tree = [0] * (self.n + 2) def update(self, idx, delta=1): while idx <= self.n: self.tree[idx] += delta idx += idx & -idx def query(self, idx): res = 0 while idx > 0: res += self.tree[idx] idx -= idx & -idx return res def main(): import sys input = sys.stdin.read().split() N = int(input[0]) A = list(map(int, input[1:N+1])) from collections import defaultdict freq = defaultdict(int) for num in A: freq[num] += 1 ans = 0 for x in freq: cnt_x = freq[x] if cnt_x == N: ans += N * (N + 1) // 2 continue s = [0] * (N + 1) prefix = 0 for i in range(1, N + 1): if A[i-1] == x: prefix += 1 s[i] = 2 * prefix - i sorted_s = sorted(set(s)) rank_dict = {v: i+1 for i, v in enumerate(sorted_s)} ft = FenwickTree(len(sorted_s)) count = 0 ft.update(rank_dict[s[0]]) for i in range(1, N + 1): idx = bisect.bisect_left(sorted_s, s[i]) count += ft.query(idx) ft.update(rank_dict[s[i]]) ans += count print(ans) if __name__ == "__main__": main()