提出 #73106940


ソースコード 拡げる

N,D=map(int,input().split())
A=list(map(int,input().split()))
C=[N for i in range(N)]
# N: 処理する区間の長さ
N = ...

def gindex(l, r):
    L = (l + N0) >> 1; R = (r + N0) >> 1
    lc = 0 if l & 1 else (L & -L).bit_length()
    rc = 0 if r & 1 else (R & -R).bit_length()
    for i in range(LV):
        if rc <= i:
            yield R
        if L < R and lc <= i:
            yield L
        L >>= 1; R >>= 1
 
# 遅延伝搬処理
def propagates(*ids):
    for i in reversed(ids):
        v = lazy[i-1]
        if v is None:
            continue
        lazy[2*i-1] = lazy[2*i] = data[2*i-1] = data[2*i] = v >> 1
        lazy[i-1] = None
 
# 区間[l, r)をxに更新
def update(l, r, x):
    *ids, = gindex(l, r)
    propagates(*ids)
 
    L = N0 + l; R = N0 + r
    v = x
    while L < R:
        if R & 1:
            R -= 1
            lazy[R-1] = data[R-1] = v
        if L & 1:
            lazy[L-1] = data[L-1] = v
            L += 1
        L >>= 1; R >>= 1; v <<= 1
    for i in ids:
        data[i-1] = data[2*i-1] + data[2*i]
 
# 区間[l, r)内の合計を求める
def query(l, r):
    propagates(*gindex(l, r))
    L = N0 + l; R = N0 + r
 
    s = 0
    while L < R:
        if R & 1:
            R -= 1
            s += data[R-1]
        if L & 1:
            s += data[L-1]
            L += 1
        L >>= 1; R >>= 1
    return s
data=A
def binary_search(data, value):
    left = 0            # 探索する範囲の左端を設定
    right = len(data) - 1            # 探索する範囲の右端を設定
    while left <= right:
        mid = (left + right) // 2            # 探索する範囲の中央を計算
        if data[mid] == value:
            # 中央の値と一致した場合は位置を返す
            return mid
        elif data[mid] < value:
            # 中央の値より大きい場合は探索範囲の左を変える
            left = mid + 1
        else:
            # 中央の値より小さい場合は探索範囲の右を変える
            right = mid - 1
    return -1            # 見つからなかった場合
#これは事故らない二分探索です
def binary_min(data, lower_bound):
    value=lower_bound
    left = 0            # 探索する範囲の左端を設定
    right = len(data) - 1            # 探索する範囲の右端を設定
    while left < right:
        mid = (left + right) // 2# 探索する範囲の中央を計算
        if data[mid] < value:
            # 中央の値より大きい場合は探索範囲の左を変える
            left = mid +1
        else:
            # 中央の値より小さい場合は探索範囲の右を変える
            right = mid
    mid = (left + right) // 2
    return mid            # 見つからなかった場合
#これは事故らない二分探索です
def binary_max(data, upper_bound):
    value=upper_bound
    left = 0            # 探索する範囲の左端を設定
    right = len(data) - 1            # 探索する範囲の右端を設定
    while left < right:
        mid = (left + right+1) // 2# 探索する範囲の中央を計算
        if data[mid] > value:
            # 中央の値より大きい場合は探索範囲の左を変える
            right = mid -1
        else:
            # 中央の値より小さい場合は探索範囲の右を変える
            left = mid
    mid = (left + right) // 2
    return mid            # 見つからなかった場合
for y in range(1) :
    V=data.copy()
    V=sorted(V)
    last="^o^"
    E=[]
    F=[]
    for i in range(len(V)):
        if V[i]!=last :
            E.append(V[i])
        last=V[i]
    for i in range(len(V)) :
        F.append(binary_search(E,data[i]))
R={}
for i in range(len(E)) :
    R[E[i]]=i

LV = (len(E)-1).bit_length()
N0 = 2**LV
data = [0]*(2*N0)
lazy = [None]*(2*N0)
N=len(A)
ans=0
for i in range(N) :
    l=binary_min(E,A[i]-D+1)
    r=binary_max(E,A[i]+D-1)
    update(l,r+1,0)
    update(F[i],F[i]+1,1)
    ans+=query(0,len(E))
print(ans)

提出情報

提出日時
問題 E - Sparse Range
ユーザ Youteru
言語 Python (PyPy 3.11-v7.3.20)
得点 0
コード長 4142 Byte
結果 WA
実行時間 > 2000 ms
メモリ 249520 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 0 / 450
結果
AC × 3
AC × 9
WA × 10
TLE × 2
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt
All min1.txt, min2.txt, random_01.txt, random_02.txt, random_03.txt, random_04.txt, random_05.txt, random_06.txt, random_07.txt, random_08.txt, random_09.txt, random_10.txt, random_11.txt, random_12.txt, random_13.txt, random_14.txt, random_15.txt, random_16.txt, sample_01.txt, sample_02.txt, sample_03.txt
ケース名 結果 実行時間 メモリ
min1.txt AC 52 ms 80640 KiB
min2.txt AC 52 ms 80680 KiB
random_01.txt WA 1714 ms 249012 KiB
random_02.txt WA 1455 ms 229092 KiB
random_03.txt WA 1683 ms 249520 KiB
random_04.txt WA 1451 ms 229420 KiB
random_05.txt WA 1838 ms 235024 KiB
random_06.txt WA 1082 ms 170208 KiB
random_07.txt TLE > 2000 ms 248932 KiB
random_08.txt WA 1653 ms 207624 KiB
random_09.txt TLE > 2000 ms 246424 KiB
random_10.txt WA 1439 ms 204600 KiB
random_11.txt WA 1386 ms 219224 KiB
random_12.txt AC 372 ms 133524 KiB
random_13.txt AC 287 ms 212732 KiB
random_14.txt AC 1742 ms 249392 KiB
random_15.txt WA 1767 ms 234464 KiB
random_16.txt AC 1736 ms 248868 KiB
sample_01.txt AC 52 ms 80528 KiB
sample_02.txt AC 52 ms 80796 KiB
sample_03.txt AC 51 ms 80372 KiB