結果

問題 No.956 Number of Unbalanced
ユーザー lam6er
提出日時 2025-04-15 22:14:01
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 1,402 bytes
コンパイル時間 303 ms
コンパイル使用メモリ 81,984 KB
実行使用メモリ 285,480 KB
最終ジャッジ日時 2025-04-15 22:15:39
合計ジャッジ時間 4,340 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 6
other TLE * 1 -- * 23
権限があれば一括ダウンロードができます

ソースコード

diff #

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()
0