結果

問題 No.1233 割り切れない気持ち
ユーザー AEnAEn
提出日時 2023-05-24 00:48:55
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 2,067 ms / 3,153 ms
コード長 2,365 bytes
コンパイル時間 521 ms
コンパイル使用メモリ 81,920 KB
実行使用メモリ 113,624 KB
最終ジャッジ日時 2024-06-02 11:49:13
合計ジャッジ時間 26,579 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 142 ms
80,640 KB
testcase_01 AC 91 ms
81,152 KB
testcase_02 AC 486 ms
81,076 KB
testcase_03 AC 711 ms
82,560 KB
testcase_04 AC 690 ms
84,360 KB
testcase_05 AC 415 ms
81,024 KB
testcase_06 AC 499 ms
81,024 KB
testcase_07 AC 1,167 ms
92,124 KB
testcase_08 AC 1,155 ms
100,480 KB
testcase_09 AC 1,357 ms
101,504 KB
testcase_10 AC 1,380 ms
104,704 KB
testcase_11 AC 1,162 ms
90,496 KB
testcase_12 AC 1,374 ms
108,160 KB
testcase_13 AC 1,391 ms
108,288 KB
testcase_14 AC 1,452 ms
107,520 KB
testcase_15 AC 1,388 ms
107,904 KB
testcase_16 AC 1,421 ms
107,904 KB
testcase_17 AC 124 ms
108,160 KB
testcase_18 AC 2,067 ms
113,624 KB
testcase_19 AC 89 ms
107,520 KB
testcase_20 AC 78 ms
101,760 KB
testcase_21 AC 181 ms
111,872 KB
testcase_22 AC 177 ms
110,976 KB
testcase_23 AC 161 ms
110,848 KB
testcase_24 AC 165 ms
111,488 KB
testcase_25 AC 161 ms
111,616 KB
testcase_26 AC 161 ms
111,360 KB
testcase_27 AC 167 ms
112,000 KB
testcase_28 AC 164 ms
111,616 KB
testcase_29 AC 160 ms
111,360 KB
testcase_30 AC 161 ms
111,360 KB
testcase_31 AC 157 ms
111,488 KB
testcase_32 AC 165 ms
111,744 KB
testcase_33 AC 164 ms
111,488 KB
testcase_34 AC 157 ms
111,104 KB
testcase_35 AC 158 ms
111,360 KB
testcase_36 AC 150 ms
112,128 KB
testcase_37 AC 92 ms
80,896 KB
testcase_38 AC 81 ms
101,632 KB
testcase_39 AC 1,124 ms
107,136 KB
testcase_40 AC 1,148 ms
107,008 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