アメーバがたくさん
問題
前処理
- まず、N,D,Tを取得した後、アメーバの初期位置(e)を取得し、(e%D+D)%D(=mod)ごとに分けます。
 - 「modごとに分け」て以降にDを考慮しなくても良いよう、分けられたアメーバは、その中で [(e-mod)/D-T,(e-mod)/D+T] という範囲(閉区間)に分裂するとします。
 - ※言語によってはeが負だとバグるので、mod計算はきちんとやったほうが良いでしょう。
- Ruby/Pythonだとe//D-TでACですが、C++ではそうではない。
 
 
解法
- ここからが本題で、現在yukicoderに上がっている解説ですと、範囲集合を事前にソートするとしていますが、それは必ずしも必要ではありません。逐一マージすれば良いからです。
 - マージするには、二分探索で右側を求め、左側と重なっているかチェックして、右側はいくつ先まで重なっているかもチェック。それらを消して、新しい範囲を挿入すればよいです。
- Python2/3 http://yukicoder.me/submissions/4190
 - Ruby http://yukicoder.me/submissions/56062
 - C++
- vector http://yukicoder.me/submissions/56075
 - deque <http://yukicoder.me/submissions/56074
 - set http://yukicoder.me/submissions/56079
 - dequeはvectorと比較しておおよそ定数倍の高速化が望めます。(cf: CODE FESTIVAL 2014 あさぷろD 枕決め)
 - この問題はNが小さいので実行時間の差があまり出ませんが、Nが大きいとvector > deque > setの順番に時間がかかることが如実にわかります。
 - 順序が重要ですので、当然ながらunordered_setは使えないことに注意して下さい。
 
 - Crystal https://yukicoder.me/submissions/227018
 
 
発展
- 事前にソートしない利点として、以下のように変形した問題も容易に解けることが上げられます。
 - 「N個の初期位置が与えられる。あなたは与えられた順番通りにN匹のアメーバを数直線上に配置する。配置されたアメーバは、分裂を開始してT秒後に停止する。停止するまで次のアメーバを配置することはない。さて、i番目のアメーバが停止した時点で合計何匹のアメーバが数直線上に存在するか?」
 
マスと駒と色塗り
問題
- CODE FESTIVAL 2015 予選B D問題
 - http://code-festival-2015-qualb.contest.atcoder.jp/tasks/codefestival_2015_qualB_d
 
解答例
- 先述の発展の考え方で解けますが、この問題は制約が大きいため、Ruby/PythonだとTLEします。C++でもset解法だと100ms切れますが、deque解法だとぎりぎりなので、Crystalも厳しそうです。(ちなみにvectorは
4075点) - あと、
if(l<=left->second+1)の「+1」は必須。 - set gcc https://code-festival-2015-qualb.contest.atcoder.jp/submissions/2077679
 - set clang https://code-festival-2015-qualb.contest.atcoder.jp/submissions/2077677
 - deque gcc https://code-festival-2015-qualb.contest.atcoder.jp/submissions/2077680
 - deque clang https://code-festival-2015-qualb.contest.atcoder.jp/submissions/2077670
 
Painting Wall
- CheckiO
 - http://www.checkio.org/mission/painting-wall/share/8a0e0061de3ff95664776d904d309e57/
 - こちらも逐一マージが想定解です。
 
n連勤
問題
解答例
- 右に接する場合もマージしないといけないので、
while(right!=se.end() && right->first-1<=r)の「-1」は必須となります。- 逆にマスと駒と色塗りでは右に接する場合はマージしてはいけないことに注意してください。
 
 - set https://yukicoder.me/submissions/252271
 - deque https://yukicoder.me/submissions/252272
 - vector https://yukicoder.me/submissions/252273