AtCoder-ABC217 D - Cutting Woods【Python解答例】
AtCoder Beginner Contest217のD問題についてPythonの解答例を記事にしていきます。
AtCoder Beginner Contest 217 - AtCoder
AtCoder Beginner Contest217 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