AtCoder Begginer Contest 103 A〜C問題・典型90問(10問目)

前書き

AtCoder Begginer Contest 103 A〜C問題・典型90問(10問目)を解きました。

A問題 (ABC103)

  • 難易度:灰
  • 時間:3分

atcoder.jp

A=list(map(int,input().split()))
print(max(A)-min(A))

B問題

  • 難易度:灰
  • 時間:3分

atcoder.jp

import sys
S=input()
T=input()
for i in range(len(S)):
  S=S[-1]+S[:-1]
  if S==T: 
    print('Yes')
    sys.exit()
print('No')

C問題

  • 難易度:茶
  • 時間:5分

サンプル例の入力と出力の規則を解き解法を導きました。
f(m)が最大となるときは各(ai - 1)の最小公倍数であり、これは必ず存在します。
全ての(ai-1)の積は存在するためです。
ならば(ai - 1)の合計がf(m)となります。


atcoder.jp

N=int(input())
a = map(int,input().split())
print(sum(a)-N)

典型90問(10問目)

  • 難易度:C問題クラス
  • 時間:16分

瞬時に累積和を使えば1重ループで解けると確信できました。
1組、2組のそれぞれで学籍番号順にスコアの累積和を格納した配列を作成します。
その後、境界となる学籍番号L〜Rに該当する累積和の差分を取得すれば区間和を出力できます。

N=int(input())
lis = [[0 for i in range(N)] for j in range(2)]
for n in range(N):
  C,P = map(int,input().split())
  lis[C-1][n]=P
  
for j in range(2):
  _sum = 0
  for i in range(N):
    _sum += lis[j][i]
    lis[j][i] = _sum

Q = int(input())
for q in range(Q):
  L,R = map(int,input().split())
  if L>1: class1,class2 = lis[0][R-1]-lis[0][L-2],lis[1][R-1]-lis[1][L-2]
  else: class1,class2 = lis[0][R-1],lis[1][R-1]
  print(class1,class2)