-
-
Notifications
You must be signed in to change notification settings - Fork 120
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[問題案] Minimum Distance Sum On Tree (Incremental) #995
Comments
自由に根付き木にして、重心を毎回 1 から計算することにします。重心の内最も根に近いものを c とすると、c を根とする部分木の重みは全体の重みの半分を超えます (全体の重みが 0 の場合を除く)。部分木の重みは DFS pre-order で並べた列の区間和として表現されるわけですが、この列で左端から見て重みが半分になる位置 h を考えると、c についての区間は必ず h を含みます。よって、c の候補が根からのあるパス上に絞られました。 ここまでやるなら top tree を持ち出した方が良いのかもしれない。 |
根から過半数を子孫に持つ頂点を辿っていく事で重心に突き当たる事から、答えはS上の過半数の頂点の祖先になるので、見つかるまでS上の頂点を選んでダブリングを繰り返すアルゴリズムが作れそうです |
https://twitter.com/hotmanww/status/1658641996981088256 |
いまのところ、割と実装量が変わりそうなので、この issue に関しては Incremental ということにします。 |
作業者募集。 |
この問題では木の根は関係ないので各辺の両端の点を与えるのがよいと思いますが、そうすると「動的木の場合の元ネタ」がそうであるように、順列 p を与える必要が皆無だと思います。 p 無くしませんか? |
なくせるのはそうなんですが、なくした方が問題設定が自然であるとはあまり思っていないです。 |
むしろ問題の綺麗さだったら余計な順列を挟まないほうが察しやすくてよいと思いますが。 オンラインクエリを意識して作ったからそっちのほうが自然だ、という意味だったら、それもありだと思います |
個人的に頂点ラベルはラベル以上の意味を持たせることに消極的です。 |
問題概要
木がある。辺重みがある。
順列$p_0, \ldots, p_{n-1}$ が与えられる。 $k=1,2,\ldots,n$ に対して次に答えよ:
$S = {p_0,\ldots,p_{k-1}}$ とする。 $f(v) = \sum_{s\in S} dist(v, s)$ とするとき、 $\min_v f(v)$ を出力。
制約
解法
重心を管理する。1 頂点追加すると、重心はそのままの位置のままにできるか、
そうでない場合は、追加頂点の方向に進む。(木を圧縮したときの次の頂点みたいなところに行く。)
LCA, EulerTour+FenwickTree くらいで全部できるはず。$O(N\log N)$。
直近で複数回欲しくなったので。
分かっていないこと。
その他。
参考:動的木の場合
https://yukicoder.me/problems/no/772
The text was updated successfully, but these errors were encountered: