[AtCoder]ABC130 D-Enough Array

【問題】

D - Enough Array
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.
問題キャプチャ

【方針】累積和を考える。numpyを用いてもいいが、

import itertools
itertools.accumulate(list)

が簡単。累積和を考えると、ある一定以上の項からは\(k\)以上となる(ならない場合もあるが)。それをまず

import bisect as bi
answer = n-bi.bisect_left(b, k)

として足しておく。後は、初項から順に見ていき、初めて和が\(k\)以下になってしまう項を求める。これも順に見ていかなくても、bisectで探すのが楽。

【解答】

#input
n, k = map(int, input().split())
a = list(map(int, input().split()))

#output
import itertools
import bisect as bi
b = list(itertools.accumulate(a))
#cumsumである一定以上の項からkを超えるとする。
#[a_1, a_2, ..., k+x, ..., ]
#xより小さい項は引ける。
c = bi.bisect_left(b, k)
answer = n-c

for i in range(c, n):
    answer += bi.bisect_right(b, b[i]-k)
        
print(answer)

【提出結果】

Submission #26382507 - AtCoder Beginner Contest 130
AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

コメント

タイトルとURLをコピーしました