🌟

競技プログラミングの鉄則 アルゴリズムと思考力を高める77の技術をpythonで解いていく 第2章

2023/01/24に公開

A06 - How Many Guests?

import itertools 
 
N, Q = map(int, input().split())
A = list(map(int, input().split()))
 
L = []
R = []
 
for i in range(Q):
    x, y = map(int, input().split())
    L.append(x)
    R.append(y)

# 累積和を求めるitertoolライブラリのaccumulate関数
accumulation = list(itertools.accumulate(A))  
 
for i in range(Q):
  # Lが1日目以外の場合は、R日目までの累積和からL-1日目までの累積和を引く
    if (L[i]) != 1: 
        answer = accumulation[R[i]-1] - accumulation[L[i]-2]
        print(answer) #累積和を求めるitertoolライブラリのaccumulate関数
	
  # Lが1日目の場合は、R日目までの累積和が答えになる
    else:
        answer = accumulation[R[i]-1]
        print(answer)

itertoolライブラリで累積和を求めればあとはそこまで難しくない。

B07 - Convenience Store 2

T = int(input())
N = int(input())
 
L = []
R = []
 
for i in range(N):
    x, y = map(int, input().split())
    L.append(x)
    R.append(y)
 
# t-0.5とt+0.5にコンビニにいる従業員数の差分を格納する配列
difference = [0] * (T+1)
for i in range(N):
    difference[L[i]] += 1
    difference[R[i]] -= 1
 
# 累積和を数列に格納する(最初の要素は格納しておく)
accumulation = [0] * (T+1)
accumulation[0] = difference[0]
for i in range(1, T+1):
    accumulation[i] = accumulation[i-1] + difference[i]
 
for i in range(T):
    print(accumulation[i])

負の数が要素に含まれているとitertoolライブラリaccumulate関数は使えないっぽい?

Discussion