💨

AtCoder ARC112 個人的メモ

2021/02/14に公開

所感

AB2完
arc112score
A問題とB問題の問題名ちょっと笑った

A - B = C

A-B=CA=B+Cと変形できるので,後者の式で考える
B=bとした時のA,Cの取り得る場合の数をS_bとする
数列S_bは初項R - 2L+1,公差-1,末項1の等差数列で表される
よって,等差数列の和の公式を用いれば,解が各ケース当たりO(1)で求められる

T = int(input())
for _ in range(T):
    L, R = map(int, input().split())
    res = max(0, R - 2 * L + 1)
    print(res * (res + 1) // 2)

B - -- - B

数直線を描いて,場合分け

制約より1\leq Cなので,(-1)を掛ける操作は必ず1回はできる

ansの初期値は以下の様に場合分け

  • B=0の場合
    0-1を掛けても0なので,ansの初期値は1
  • B\neq 0の場合
    B(-1)を掛けると正負反転するので,ansの初期値は2

続きは明日書くかも

B, C = map(int, input().split())

if B == 0:
    ans = 1
    # 減算のみ
    ans += C // 2
    # 減算後,最後に(-1)を一回掛ける
    ans += (C - 1) // 2
else:
    ans = 2
    if B > 0:
        # 減算のみ
        ans += min(C // 2, B)
        # 減算後,最後に(-1)を一回掛ける
        ans += min((C - 1) // 2, B - 1)
        # 最初に(-1)を一回掛けた後,減算
        ans += (C - 1) // 2
        # 最初に(-1)を一回掛けた後,減算,その後再び(-1)を掛ける
        ans += max(0, C - 2) // 2
    else:
        # 減算のみ
        ans += C // 2
        # 最初に(-1)を一回掛けた後,減算
        ans += min((C - 1) // 2, (abs(B) - 1) * 2 + 1)
        # 減算後,最後に(-1)を一回掛ける
        ans += (C - 1) // 2

print(ans)

Discussion