G]競技プログラミングhttps://onlinejudge.u-aizu.ac.jp/beta/room.html#RitsCamp18Day1/problems/G解法https://onlinejudge.u-aizu.ac.jp/beta/review.html#RitsCamp18Day1/2755717クエリとエレベータを時系列順にソートしておく。クエリを処理していくが、時系列順に処理を行って答えを出し、最後にクエリの順番で答えるようにする。以下のコードでは、indexだけが入った配列(ord配列)を用意し、ソートして、それをつかって時系列順に処理を行っている。S[i]≧T[i]であれば、階段を降りることで到達可能である。ないなら、エレベータを使用する必要がある。i番目のクエリを処理しているとすると、E[i]日の昼より前にできているエレベータの区間は全て自由に行き来できるようになる。エレベータによって行き来できる所を連結しておくと、S[i]からT[i]へ到達可能であるとは、S[i]とT[i]が同じ連結成分に属すると言い換えられる。クエリを時系列順に処理しているので、エレベータの連結も時系列順に行っていけばいい。クエリを処理していくと時間が経過していく感じになるので、答えを出す前にその都度エレベ―タを作っていくようにしていく。残った問題は「A[i]~B[i]の区間を連結する」と「S[i]とT[i]が同じ連結成分に属するかの判定」の2つである。連結系で思いつくのがUnionFindであるが、毎回連結処理でO(N)かかる。隣接する区間の連結は、setで区間を管理するテクを使うことで実現できる。区間を{右端,左端}と保存しておく(普通と逆順に入れとく)すると、lower_bound({x,-1})とすることで高速にxが属する区間が得られる。結合する場合は、A[i]が属する区間の要素とB[i]が属する区間の要素とその間にある要素を全て消して、1つにまとめればいい。まとめる処理はならしO(N)となるので、全体として間に合う。setで区間を管理するテクはcodeforcesなどで割と出るので、練習しておこう。F]月別アーカイブスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。