結果
| 問題 |
No.1036 Make One With GCD 2
|
| コンテスト | |
| ユーザー |
tpyneriver
|
| 提出日時 | 2020-04-24 22:02:22 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
TLE
(最新)
AC
(最初)
|
| 実行時間 | - |
| コード長 | 2,662 bytes |
| コンパイル時間 | 795 ms |
| コンパイル使用メモリ | 82,304 KB |
| 実行使用メモリ | 225,256 KB |
| 最終ジャッジ日時 | 2024-11-07 02:23:07 |
| 合計ジャッジ時間 | 8,857 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | -- * 4 |
| other | TLE * 1 -- * 40 |
ソースコード
import sys
readline = sys.stdin.readline
def gcd(a,b):
if b == 0:
return a
return gcd(b,a%b)
class Segtree:
def __init__(self, A, intv, initialize = True, segf = max):
self.N = len(A)
self.N0 = 2**(self.N-1).bit_length()
self.intv = intv
self.segf = segf
if initialize:
self.data = [intv]*self.N0 + A + [intv]*(self.N0 - self.N)
for i in range(self.N0-1, 0, -1):
self.data[i] = self.segf(self.data[2*i], self.data[2*i+1])
else:
self.data = [intv]*(2*self.N0)
def update(self, k, x):
k += self.N0
self.data[k] = x
while k > 0 :
k = k >> 1
self.data[k] = self.segf(self.data[2*k], self.data[2*k+1])
def query(self, l, r):
L, R = l+self.N0, r+self.N0
s = self.intv
while L < R:
if R & 1:
R -= 1
s = self.segf(s, self.data[R])
if L & 1:
s = self.segf(s, self.data[L])
L += 1
L >>= 1
R >>= 1
return s
def binsearch(self, l, r, check, reverse = False):
L, R = l+self.N0, r+self.N0
SL, SR = [], []
while L < R:
if R & 1:
R -= 1
SR.append(R)
if L & 1:
SL.append(L)
L += 1
L >>= 1
R >>= 1
if reverse:
for idx in (SR + SL[::-1]):
if check(self.data[idx]):
break
else:
return -1
while idx < self.N0:
if check(self.data[2*idx+1]):
idx = 2*idx + 1
else:
idx = 2*idx
return idx - self.N0
else:
pre = self.data[l+self.N0]
for idx in (SL + SR[::-1]):
if not check(self.segf(pre, self.data[idx])):
pre = self.segf(pre, self.data[idx])
else:
break
else:
return -1
while idx < self.N0:
if check(self.segf(pre, self.data[2*idx])):
idx = 2*idx
else:
pre = self.segf(pre, self.data[2*idx])
idx = 2*idx + 1
return idx - self.N0
N = int(readline())
A = list(map(int, readline().split()))
T = Segtree(A, 0, initialize = True, segf = gcd)
ans = 0
N0 = T.N0
for i in range(N):
k = T.binsearch(i, N0, lambda x: x == 1)
if k != -1:
ans += N-k
print(ans)
tpyneriver