(クエリ平方分割解法)問題http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2667解法クエリをB個ごとのブロックに分割する。ブロックのはじめにやる処理をSetUp,ブロックのおわりにやる処理をTearDownと呼ぶことにする。SetUpブロック内のクエリで関係する頂点だけを使って,縮約されたO(B)頂点の森を作る。ブロック内のクエリで関係する頂点とは,具体的には以下のとおり。vとLCA(u,v)この処理はO(N)でできる。LCA(u,v)までの距離が分かればよい(「その他の解法」のリンク参照)ので,根から頂点xまでの距離を計算する方法を考える。これは縮約された森でxから根まで辿ることで,以下のような方法で計算できる。addCurrent[x]addCurrentの意味はTearDownで説明する。parentは縮約された森での親,depthはもともとの木での頂点の深さである。縮約された森では頂点数はO(B)個なので,この処理はO(B)でできる。TearDownもともとの木の根から葉の方向にaddLazyの値を伝搬させて,addCurrentという配列に「もともとの木での根から頂点xまでの距離」が格納された状態にする。その後でaddLazyを0で埋める。この処理はO(N)でできる。程度にすると2.93secで通った。(1)はてなブログをはじめよう!kujira16さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。