結果
| 問題 |
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 |
ソースコード
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)
AEn