Submission #20202419


Source Code Expand

import sys
import numpy as np
import numba
from numba import njit, b1, i1, i4, i8, f8

read = sys.stdin.buffer.read
readline = sys.stdin.buffer.readline
readlines = sys.stdin.buffer.readlines

def from_read(dtype=np.int64):
    return np.fromstring(read().decode(), dtype=dtype, sep=' ')


def from_readline(dtype=np.int64):
    return np.fromstring(readline().decode(), dtype=dtype, sep=' ')

@njit
def build(raw_data):
    shape = raw_data.shape
    N = len(raw_data)
    bit = np.zeros((N + 1, ) + shape[1:], np.int64)
    for i in range(1, N + 1):
        bit[i] += raw_data[i - 1]
        j = i + (i & (-i))
        if j < len(bit):
            bit[j] += bit[i]
    return bit


@njit
def get_sum(bit, i):
    """sum on [0, i)"""
    s = 0
    while i:
        s += bit[i]
        i -= i & -i
    return s


@njit
def add(bit, i, x=1):
    assert i >= 0
    i += 1
    while i < len(bit):
        bit[i] += x
        i += i & -i


@njit
def find_kth_element(bit, k):
    assert k > 0
    N = len(bit)
    x, sx = 0, 0
    dx = 1
    while 2 * dx < N:
        dx *= 2
    while dx:
        y = x + dx
        if y < N:
            sy = sx + bit[y]
            if sy < k:
                x, sx = y, sy
        dx //= 2
    return x

@njit((i8[:], i8[:, :]), cache=True)
def main(A, PD):
    A = A[::-1].copy()
    N = len(A)
    ans = 0
    for i in range(N):
        if (N - 1 - i) % 2 == 0:
            ans += A[i]

    # 係数

    dp = np.zeros(N, np.int64)
    dp[0] = A[0]
    for i in range(1, N):
        x = A[i]
        dp[i] = min(dp[i - 1], x)

    C = np.zeros(N, np.int64)
    for i in range(N - 1):
        if (N - i) % 2 == 0:
            C[i] = 1
        else:
            C[i] = -1
    ans += (dp * C).sum()
    print(ans)

    Ccum = np.append(0, np.cumsum(C))
    """
    累積 min の様子だけが問題。累積 min になる瞬間の座標の集合を管理する
    """
    X = np.zeros(N, np.int64)
    H = np.zeros(N, np.int64)
    X[0], H[0] = 1, A[0]
    h = A[0]
    for i in range(1, N):
        if h > A[i]:
            X[i] = 1
            h = A[i]
            H[i] = h
    X = np.append(X, 1)
    H = np.append(H, -1)
    bit = build(X)
    X_sum = X.sum()

    def coef(L, R):
        return Ccum[R] - Ccum[L]

    for q in range(len(PD)):
        i, d = PD[q]
        i = N - i
        A[i] -= d
        if (N - 1 - i) % 2 == 0:
            ans -= d
        k = get_sum(bit, i + 1)
        L = find_kth_element(bit, k)
        R = find_kth_element(bit, k + 1)
        if L == i:
            ans += coef(L, R) * (A[i] - H[i])
            H[i] = A[i]
        elif H[L] > A[i]:
            assert X[i] == 0
            ans -= coef(L, R) * H[L]
            ans += coef(L, i) * H[L]
            X[i] = 1
            H[i] = A[i]
            add(bit, i, 1)
            ans += coef(i, R) * H[i]
        if X[i] == 1:
            # 右の長方形を削るかどうか
            while True:
                k = get_sum(bit, i + 1)
                R = find_kth_element(bit, k + 1)
                assert i < R
                if H[i] > H[R]:
                    break
                RR = find_kth_element(bit, k + 2)
                ans += (H[i] - H[R]) * coef(R, RR)
                X[R] = 0
                H[R] = 0
                add(bit, R, -1)
        print(ans)

N = int(readline())
A = from_readline()
Q = int(readline())
PD = from_read().reshape(Q, 2)

main(A, PD)

Submission Info

Submission Time
Task D - コインの取り合い
User maspy
Language Python (3.8.2)
Score 180
Code Size 3561 Byte
Status AC
Exec Time 805 ms
Memory 124196 KiB

Judge Result

Set Name Sample Subtask1 Subtask2 Subtask3
Score / Max Score 0 / 0 10 / 10 80 / 80 90 / 90
Status
AC × 2
AC × 7
AC × 14
AC × 35
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
Subtask1 subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt
Subtask2 sample_01.txt, sample_02.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt
Subtask3 sample_01.txt, sample_02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt, subtask3_01.txt, subtask3_02.txt, subtask3_03.txt, subtask3_04.txt, subtask3_05.txt, subtask3_06.txt, subtask3_07.txt, subtask3_08.txt, subtask3_09.txt, subtask3_10.txt, subtask3_11.txt, subtask3_12.txt, subtask3_13.txt, subtask3_14.txt
Case Name Status Exec Time Memory
sample_01.txt AC 507 ms 108060 KiB
sample_02.txt AC 492 ms 107484 KiB
subtask1_01.txt AC 490 ms 107500 KiB
subtask1_02.txt AC 509 ms 119832 KiB
subtask1_03.txt AC 504 ms 116600 KiB
subtask1_04.txt AC 510 ms 119676 KiB
subtask1_05.txt AC 511 ms 119228 KiB
subtask1_06.txt AC 507 ms 120224 KiB
subtask1_07.txt AC 510 ms 119564 KiB
subtask2_01.txt AC 495 ms 106784 KiB
subtask2_02.txt AC 615 ms 117144 KiB
subtask2_03.txt AC 506 ms 120240 KiB
subtask2_04.txt AC 630 ms 122484 KiB
subtask2_05.txt AC 633 ms 122924 KiB
subtask2_06.txt AC 573 ms 121332 KiB
subtask2_07.txt AC 668 ms 123544 KiB
subtask2_08.txt AC 509 ms 119860 KiB
subtask2_09.txt AC 615 ms 115056 KiB
subtask2_10.txt AC 634 ms 122436 KiB
subtask2_11.txt AC 634 ms 122904 KiB
subtask2_12.txt AC 638 ms 122936 KiB
subtask3_01.txt AC 620 ms 114816 KiB
subtask3_02.txt AC 633 ms 123756 KiB
subtask3_03.txt AC 641 ms 123140 KiB
subtask3_04.txt AC 634 ms 123120 KiB
subtask3_05.txt AC 512 ms 119796 KiB
subtask3_06.txt AC 805 ms 122096 KiB
subtask3_07.txt AC 680 ms 122836 KiB
subtask3_08.txt AC 771 ms 122916 KiB
subtask3_09.txt AC 763 ms 123112 KiB
subtask3_10.txt AC 642 ms 123512 KiB
subtask3_11.txt AC 686 ms 116280 KiB
subtask3_12.txt AC 721 ms 123564 KiB
subtask3_13.txt AC 720 ms 124196 KiB
subtask3_14.txt AC 637 ms 123164 KiB