ebisukeプログラミング初心者脱出黙示録

30歳を過ぎてから始めたプログラミングと競プロの記録。Pythonで取り組んでいます。Arduinoで電子工作も

AtCoder-ABC217 D - Cutting Woods【Python解答例】

AtCoder Beginner Contest217のD問題についてPythonの解答例を記事にしていきます。
AtCoder Beginner Contest 217 - AtCoder


AtCoder Beginner Contest217 D - Cutting Woods

D - Cutting Woods

問題文

長さ L メートルの直線状の木材があります。
x=1,2,…,L−1 に対して、木材の左端から x メートルの地点には目印として線 x が引かれています。

Q 個のクエリが与えられます。 i 番目のクエリは数の組 (c i​ ,x i​ ) によって表されます。
以下の説明に従ってクエリを i の昇順に処理してください。

・c i​ =1 のとき : 線 x i​ がある地点で木材を 2 つに切る。
・c i​ =2 のとき : 線 x i​ を含む木材を選び、その長さを出力する。
ただし c i​ =1,2 の両方に対して、線 x i​ はクエリを処理する時点で切られていないことが保証されます。

制約

・1≤L≤10 ^9
・1≤Q≤2×10 ^5
・c i​ =1,2 (1≤i≤Q)
・1≤x i​ ≤L−1 (1≤i≤Q)
・全ての i (1≤i≤Q) に対して次が成り立つ: 1≤j

解答例

import bisect
import array

l, Q = map(int,input().split())

L = array.array("i",[0,l])
for i in range(Q):
    c, x = map(int,input().split())
    if c == 1:
        bisect.insort(L,x)
    else:
        point = bisect.bisect(L,x)
        res = L[point] - L[point-1]
        print(res)

解説

こちらの記事を読むことでACできました。
ありがとうございました。
【AtCoder】ABC217をPython3で解説(ABCD) - Qiita

ci =1 のときの配列への要素の追加や、ci = 2 のときの出力で二分探索ライブラリbisectを使い高速化しました。
ebisuke33.hatenablog.com

詳しい説明ができませんが、今回の配列Lはリスト型を使うとTLEしてしまいます。
arrayをインポートしてarray型を使用すると時間内で問題を解くことができました。
理由はわかりませんが、かなり差がつくポイントでした。

このような方針でもACすることができました。



ABC217の関連記事はこちら
ebisuke33.hatenablog.com
ebisuke33.hatenablog.com
ebisuke33.hatenablog.com