結果

問題 No.1233 割り切れない気持ち
ユーザー AEn
提出日時 2023-05-24 00:48:55
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 2,852 ms / 3,153 ms
コード長 2,365 bytes
コンパイル時間 234 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 114,024 KB
最終ジャッジ日時 2024-12-23 09:06:01
合計ジャッジ時間 34,284 ms
ジャッジサーバーID
(参考情報)
judge5 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 39
権限があれば一括ダウンロードができます

ソースコード

diff #

class Binary_Indexed_Tree:
    def __init__(self, n) -> None:
        self._n = n
        self.data = [0] * (n+1)
        self.depth = n.bit_length()

    def add(self, p, x) -> None:
        """任意の要素ai←ai+xを行う O(logn)"""
        assert 0 <= p < self._n
        p += 1
        while p <= self._n:
            self.data[p-1] += x
            p += p & (-p)
    
    def sum(self, l, r) -> int:
        """区間[l,r)で計算"""
        assert 0 <= l <= r <= self._n
        return self._sum(r) - self._sum(l)
    
    def _sum(self, d) -> int:
        sm = 0
        while d > 0:
            sm += self.data[d-1]
            d -= d & (-d)
        return sm
    
    def lower_bound(self, x):
        """ 累積和がx以上になる最小のindexと、その直前までの累積和 """
        sum_ = 0
        pos = 0
        for i in range(self.depth, -1, -1):
            k = pos + (1 << i)
            if k <= self._n and sum_ + self.data[k-1] < x:
                sum_ += self.data[k-1]
                pos += 1 << i
        return pos, sum_

class RangeAddSum:
    def __init__(self,N) -> None:
        self.N = N
        self.bit1 = Binary_Indexed_Tree(N)
        self.bit2 = Binary_Indexed_Tree(N)
    
    def add(self,l,r,x):
        """[l,r) <- add x"""
        self.bit1.add(l,-x*(l-1))
        self.bit1.add(r-1,x*(r-1))
        self.bit2.add(l,x)
        self.bit2.add(r-1,-x)
    
    def sum(self,l,r):
        """return sum[l,r)"""
        return self.bit2._sum(r)*(r-1)+self.bit1._sum(r)-self.bit2._sum(l)*(l-1)-self.bit1._sum(l)

def RLE(S):
    """ランレングス圧縮して文字と数の組のリストで返す"""
    s = []
    cnt = 1
    for i in range(len(S)):
        if i+1<len(S):
            if S[i] == S[i+1]:
                cnt += 1
            else:
                s.append([S[i], cnt])
                cnt = 1
        else:
            s.append([S[i], cnt])
    return s

N = int(input())
A = list(map(int, input().split()))
A.sort()
rle = RLE(A)
sm = [0]*(2*10**5+5)
bit = RangeAddSum(2*10**5+5)
for i,cnt in rle:
    if i==1:continue
    bit.add(1,i,cnt)
    bit.add(i,i+1,cnt*(-i+1))
    for j in range(i+1,2*10**5+1,i):
        bit.add(j,min(j+i-1,2*10**5+3),cnt)
        bit.add(min(j+i-1,2*10**5+3),min(j+i,2*10**5+4),cnt*(-i+1))
res = 0
for num,cnt in rle:
    res += cnt*bit.sum(0,num+1)
print(res)
0