結果

問題 No.1233 割り切れない気持ち
ユーザー AEnAEn
提出日時 2023-05-24 00:48:55
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 2,273 ms / 3,153 ms
コード長 2,365 bytes
コンパイル時間 287 ms
コンパイル使用メモリ 87,056 KB
実行使用メモリ 114,848 KB
最終ジャッジ日時 2023-08-24 22:42:31
合計ジャッジ時間 31,900 ms
ジャッジサーバーID
(参考情報)
judge15 / judge12
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 181 ms
82,192 KB
testcase_01 AC 121 ms
82,536 KB
testcase_02 AC 548 ms
82,828 KB
testcase_03 AC 789 ms
83,396 KB
testcase_04 AC 758 ms
84,240 KB
testcase_05 AC 483 ms
82,200 KB
testcase_06 AC 553 ms
82,204 KB
testcase_07 AC 1,407 ms
92,632 KB
testcase_08 AC 1,299 ms
94,576 KB
testcase_09 AC 1,574 ms
101,540 KB
testcase_10 AC 1,611 ms
104,768 KB
testcase_11 AC 1,380 ms
91,544 KB
testcase_12 AC 1,584 ms
108,620 KB
testcase_13 AC 1,586 ms
108,436 KB
testcase_14 AC 1,669 ms
108,204 KB
testcase_15 AC 1,543 ms
108,124 KB
testcase_16 AC 1,555 ms
108,444 KB
testcase_17 AC 153 ms
109,308 KB
testcase_18 AC 2,273 ms
114,848 KB
testcase_19 AC 115 ms
111,376 KB
testcase_20 AC 107 ms
108,304 KB
testcase_21 AC 205 ms
112,384 KB
testcase_22 AC 199 ms
112,172 KB
testcase_23 AC 192 ms
111,740 KB
testcase_24 AC 189 ms
112,156 KB
testcase_25 AC 183 ms
112,312 KB
testcase_26 AC 183 ms
112,324 KB
testcase_27 AC 197 ms
112,744 KB
testcase_28 AC 193 ms
112,068 KB
testcase_29 AC 192 ms
112,216 KB
testcase_30 AC 192 ms
112,176 KB
testcase_31 AC 190 ms
112,580 KB
testcase_32 AC 188 ms
112,312 KB
testcase_33 AC 186 ms
112,420 KB
testcase_34 AC 185 ms
112,320 KB
testcase_35 AC 185 ms
112,212 KB
testcase_36 AC 179 ms
112,336 KB
testcase_37 AC 121 ms
82,736 KB
testcase_38 AC 106 ms
108,668 KB
testcase_39 AC 1,264 ms
106,576 KB
testcase_40 AC 1,338 ms
106,580 KB
権限があれば一括ダウンロードができます

ソースコード

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