Open customaddone opened 2 years ago
距離 2つの頂点間の最短距離が一意に定まる 木の直経は0から最も遠い頂点をrとすると、rから最も遠い頂点までの距離 https://atcoder.jp/contests/arc022/submissions/18528908 C - ロミオとジュリエット 最短パスはO(N)で求められ、最短パス長さはO(logN)で求められる(LCA) K経由のdist(i, j) = dist(i, K) + dist(K, j) https://atcoder.jp/contests/abc070/submissions/27503717 D - Transit Tree Path グラフAに任意の本数辺を加えたグラフをBとすると、グラフA内の任意の頂点i, jの最短距離 >= グラフB内の頂点i, jの最短距離 同様に減らすと グラフAの<=グラフB スターグラフは距離1の点対がN-1個、距離2の点対が(N - 1) * (N - 2) // 2ある木グラフ ここから辺を1本増やすごとに距離2の点対が1個ずつ減っていく https://atcoder.jp/contests/abc131/submissions/27940519 E - Friendships 木上の任意の点vに他各頂点を1近づける を行うと任意の2点 a, bの距離は lca(a, b) = a or b: そのまま v = a or b: 1近づく not lca(a, b) = a or b: 2近づく https://atcoder.jp/contests/agc033/submissions/17877411 C - Removing Coins パスグラフ上の点はそれぞれ最も遠い点との距離がmax(N, N - i)の点である 最も遠い点との距離がd-1の頂点に葉を1つ加えるとその頂点と最も遠い点との距離はd https://atcoder.jp/contests/agc005/submissions/18100652 C - Tree Restoring N - sizeで全ての頂点間の総和を求められる https://atcoder.jp/contests/typical90/submissions/22556849 Tree Distance(★5) 「N頂点の木について、a-b, b-c, c-aのいずれかのパスに属する辺の数が最大になるようなa, b, cを求める」 の答えが「直径の端点a, bとパスa-bから最も遠い点c」 https://codeforces.com/contest/1294/submission/144940988 F. Three Paths on a Tree q1, q2, q3...について根から頂点uへのパスからの距離が1以内な頂点uは存在するか? q1, q2...をそれぞれ根の方向に1ずつ遡ってそれが1本のパス(距離が0)を構成しているか ダブリングのライブラリを使う https://codeforces.com/contest/1328/submission/145003749 E. Tree Queries 木の中心はどの木の直径パスにとっても中心である 辺の真ん中に頂点を作ればいい感じになる 木の中心の子要素それぞれについてその子孫に候補となる頂点がいくつあるかを記録する https://atcoder.jp/contests/abc221/submissions/29351013 F - Diameter set 直径d,最大次数kの木の最大頂点数は r = (d+1)//2とし、k>=3のとき dが偶数の時 k((k-1)^r-1)/(k-2) +1 dが奇数の時 2((k-1)^r-1)/(k-2) いい感じに頂点N, 直径D, 最大次数Kの木を構築できる https://codeforces.com/contest/1003/submission/155571872 E. Tree Constructing
累積和 基本 https://atcoder.jp/contests/abc138/submissions/27937966 D - Ki 応用 補集合を考える https://atcoder.jp/contests/abc187/submissions/27456385 E - Through Path https://yukicoder.me/submissions/733323 Reversed Edges
部分木 親とか深さとか部分木のサイズとかを保持しておくと良い 親を辿っていくとその頂点から根へのパスが分かる https://atcoder.jp/contests/abc067/submissions/27938841 D - Fennec VS. Snuke 深さiの時点で葉にならない頂点の上限F[i]は、葉の枚数をAiとして F[i] + A[i] = 2F[i-1]より F[i] = 2F[i-1] - A[i] https://atcoder.jp/contests/nomura2020/submissions/17531565 C - Folia N頂点の木上の任意のQ個の点を訪れる頂点の合計が最小になるよう全て巡回する時、その頂点の個数(C(Q)とする)= (あるQ内の頂点を根にした時)自身又は子孫にQ内の頂点がある頂点の個数で、最短巡回距離は(C(Q) - 1) * 2 スタートとゴールが異なる場合はそこからスタート-ゴールの距離を引く https://atcoder.jp/contests/arc030/submissions/27961716 B - ツリーグラフ https://codeforces.com/contest/1675/submission/157109874 F. Vlad and Unfinished Business 親を見るときはdfs(v)の前、子を見るときはdfs(v)の後にすればいい 相手が最善の手を打つ→相手がどんな手を使ってきても勝ち筋が最低1つあるか https://codeforces.com/contest/1611/submission/143372625 E1 - Escape The Maze (easy version) それぞれの頂点の子要素の個数 は全方位DPしなくても求まる https://atcoder.jp/contests/arc028/submissions/18532641 C - 高橋王国の分割統治 入次と出次の際にrec https://atcoder.jp/contests/abc202/submissions/26090156 E - Count Descendants サイズiの部分木を作る: 1~iまでを全てiにつなげる サイズiの部分木を作らない: 1 ~ i-1はiより後ろのどこかの頂点に繋げる 自身はサイズ1の葉になる https://atcoder.jp/contests/arc103/submissions/28319648 E - Tr/ee parent-childの部分木を木から分離していく それぞれの部分木を連結(N-1回できる)させる毎にいずれかの部分木の葉が一枚なくなるのでansは各成分の葉の数-(連結成分の個数-1) https://codeforces.com/contest/1566/submission/144986352 E. Buds Re-hanging 各頂点に0か1かが貼られた完全二分木のある頂点の子要素が同型であるかどうかを部分木を辞書順にソートして調べる 二分木を葉から探索していくためのforループ https://codeforces.com/contest/1671/submission/159232035 E. Preorder
mod 根からの距離が偶数/奇数な頂点は互いに偶数距離(もう一方のグループを全て消したとすると奇数(消した頂点に入る)+奇数(消した頂点から出る)になるため) https://atcoder.jp/contests/abc126/submissions/14053977 D - Even Relation 2点a, b上のパスに1を加算しても、a ~ kのパスに+1 & b ~ kのパスに+1してもそれぞれの辺に加算されたポイントの偶奇は変わらない (LCA ~ kまでは2回加算されるため) https://atcoder.jp/contests/agc014/submissions/17571916 B - Unplanned Queries
連結性 グループ内の頂点とグループ外の頂点を辺で結ぶ をN-1回行うとN頂点の木ができる グループ内の頂点同士を結ぶ操作があればその頂点集合は木ではなくなる 超頂点に繋ごう https://atcoder.jp/contests/arc037/submissions/27941172 B - バウムテスト N-1回繋ぐ、つまり合計2(N - 1)個かつ各グループから最低1個は選ぶ をすると連結になる M個グループがあるとすると各グループの最小をまず選ぶ 残りは小さい方からM個選ぶをする 小さい方から選ぶM個を保有する木から繋げていけばいいから https://atcoder.jp/contests/apc001/submissions/17772361 D - Forest 閉路が存在しないならば「連結成分の個数 = 頂点数 - 辺の数」が成り立つ。 数え上げ問題みたいにマイナス成分はいつ作用するか?ということを考える https://atcoder.jp/contests/abc173/submissions/18253380 F - Intervals on Tree 木の辺を〜する→木の頂点のうちN-1個を〜するに言い換えて良い 子要素と辺をセットにすると子から見て親は1つ https://atcoder.jp/contests/abc146/submissions/16639199 D - Coloring Edges on Tree https://atcoder.jp/contests/arc108/submissions/19114340 C - Keep Graph Connected 連結成分内の頂点同士のペアの総数は連結するたびにacc += U.size(u) * U.size(v)をすればいい https://codeforces.com/contest/1213/submission/144078273 G. Path Queries
LCA ダブリングしてLCAを求めている https://github.com/customaddone/beginPython/blob/cf3f9a027e107eb3bd4bf2ef7712699b08235565/cgi-bin/index.py https://atcoder.jp/contests/abc014/submissions/15371356 D - 閉路 dist(根,a) + dist(根,b) - 2*dist(根,lca(a,b))を使って数え上げ dfsでa, b, lcaのn色の本数と合計を集計しておく https://atcoder.jp/contests/abc133/submissions/22776931 F - Colorful Tree 木上のM点が全てある一つのパス上に乗っているか ①rootから深い順にM点を並べる 一番深い点をp1にする ②深い順から頂点を探索する(piとする) lca(p1, pi) == piならpiはp1の祖先である lca(p1, pi) != piならlca(p1, pi)から分岐してlca(p1, pi)~p1とlca(p1, pi)~piの2つの流れができる このようなpiをp2と置く ③残りの頂点が全てlca(p1, p2)~p1かlca(p1, p2)~p2上にあれば条件を満たす 残りの頂点をpjと置くと全てのpjでpj == lca(p1, p2) or ((lca(p1, pj) == pj) ^ (lca(p2, pj) == pj)))を満たせるか? https://codeforces.com/contest/1702/submission/170044051 G2. Passable Paths (hard version)
木DP 部分木を考える問題はdfs https://atcoder.jp/contests/abc036/submissions/18630187 D - 塗り絵 https://atcoder.jp/contests/abc133/submissions/18500857 E - Virus Tree 2
木構造とは、N頂点をN-1本の辺で閉路がなく連結につなぐグラフのことである 幅優先探索 高さ0の頂点が全て探索される→高さ1の頂点が全て探索される... https://atcoder.jp/contests/abc138/submissions/27937966 深さ優先探索 pypyでやると超遅くなる sys.setrecursionlimit(10000000)つけよう dfs(v)の実行直前と実行直後の間にvの子要素が全て探索される つまりdfsで探索した順に頂点に番号を新たに振っていくとし、頂点iに再び戻ってきた時に現在まで使用したカウンターの数をpos[i]で保持するとすると、 iの部分木の頂点:[i ~ pos[i]]になる RMQなどでいっぺんに操作すると部分木全てに操作したことになる https://atcoder.jp/contests/abc138/submissions/27938042 葉は次数が1の頂点 葉で閉じ込められる https://atcoder.jp/contests/abc148/submissions/15552564 F - Playing Tag on Tree 好きな頂点を1つ選んでそこから2つのエッジを伸ばしていくとHamiltonish Pathができる このパスは必ずできる https://atcoder.jp/contests/agc013/submissions/17640693 B - Hamiltonish Path 非再帰dfs 要するにスタック芸 https://codeforces.com/contest/1566/submission/145356639 E. Buds Re-hanging https://codeforces.com/contest/1399/submission/145353108 E1. Weights Division (easy version) https://codeforces.com/contest/1714/submission/166769384 G. Path Prefixes