タグ

Treeに関するagwのブックマーク (47)

  • 遅延伝播セグメント木の使い方,ACLPC: K – Range Affine Range Sum の解説

    処理したい更新クエリが条件 5 を満たしていない,つまり,$h$ が「同種の」クエリではなくなってしまう場合もあります.その場合,更新クエリの意味をより広く解釈すると上手くいくこともあるのですが,これは少し高度な話なのでこの記事では扱いません. 例題: ACLPC: K - Range Affine Range Sum実際にどのような思考過程で遅延セグ木の問題を解くのか,例題で解説します.AtCoder Library の lazysegtree を使って実装します. 問題ページ: AtCoder Library Practice Contest: K - Range Affine Range Sum $s_{[l, r)}$ の素朴な構成まず,$a_{[l, r)}$ から抽出する情報 $s_{[l, r)}$ を構成し,上で説明した $3$ つの条件を満たすかどうかを確認します. 取得

    遅延伝播セグメント木の使い方,ACLPC: K – Range Affine Range Sum の解説
  • Writing a storage engine in Rust: Writing a persistent BTree (Part 1)

    As part of a recent personal journey to better understand databases and better learn Rust, I have recently took on the project of writing a simple key-value storage engine. Crazy, right? Lets get started! B-Trees vs LSM TreesThe first thing one must think of when writing a key-value storage engine is -”How should I store my data so that I can perform reads and writes efficiently?”; The two most co

    Writing a storage engine in Rust: Writing a persistent BTree (Part 1)
  • 平衡二分探索木を使った2-optの効率化について - aspirator’s blog

    こんにちは。 平衡二分探索木で2-optを高速化する方法について研究したので、記事ではそれについて書こうと思います。 2-optとは 2-optは巡回セールスマン問題(TSP)の近似解を求めるヒューリスティックアルゴリズムです。 下図のように、サイクルに対してランダムに二つのパスを選び、パスを組み替えた方がサイクルの長さが短くなる場合、パスを組み替えます。具体的には、A→B + C→D > A→C + B→D の時、辺ABと辺CDを辺ACと辺BDに組み替えます。 しかし、辺を張り直すだけではサイクルにならないので、B~CまたはD~Aの間の順序を逆にする必要があります。 2-opt法では順路を配列などで管理することでこれを実現しています。 そしてこれが`測定で用いた2-optの実装です。 #include<iostream> #include<algorithm> #include<vec

    平衡二分探索木を使った2-optの効率化について - aspirator’s blog
  • atcoder::lazy_segtree に1行書き足すだけの抽象化 Segment Tree Beats - ひとなので

    AtCoder Library (ACL) の atcoder::lazy_segtree をもとにした Segment tree beats の抽象化の方法と,そのいくつかの具体的な使用例を紹介します.Segment tree beats は列に対する複雑な更新・取得処理を高速かつオンラインに実現する強力な手法ですが,実装の際に考慮すべきことが複雑でコーディング量も多く,体系立った実装方法の知見も整理されていないと筆者は認識しています.そこで稿では,ドキュメントを含め極めて整備された ACL のコードをわずかに変更して Segment tree beats として使用する方法を紹介します.この方法では,様々な Segment tree beats の実装の大部分が共通化され,個別の問題に応じた機能は atcoder::lazy_segtree の利用時と同様にクラスや関数として組み込ま

    atcoder::lazy_segtree に1行書き足すだけの抽象化 Segment Tree Beats - ひとなので
  • Segment Tree のお勉強(2) | maspyのHP

    遅延伝搬 Segment 木まで一通り、 $0$ から実装できるようことを目指して、丁寧に自習しました。折角なので記事化。 概要 前回 → Segment Tree のお勉強 (1) を前提としています。 1点更新、区間作用、区間積取得が可能な Segment 木。いわゆる非再帰実装 1-based index$N=2^n$ を仮定しない モノイド $A$ がモノイド $X$ に右作用するとします。各々のモノイドの二項演算を、積の形で、$$\begin{align*}A\times A\longrightarrow A;\quad (a,b)\mapsto ab,\\X\times X\longrightarrow X;\quad (x,y)\mapsto xy\end{align*}$$ と書きます。作用は、$$X\times A\longrightarrow X;\quad (x,a)

    Segment Tree のお勉強(2) | maspyのHP
  • 【全方位木DP】明日使える便利な木構造のアルゴリズム - Qiita

    この記事について この記事では、一部で全方位木DP、Rerooting等と呼ばれているアルゴリズムの紹介/解説と、その実装についての簡単な説明を行います。 全方位木DPなどと物騒そうな名前がついていますが、発想自体は全く難しくありません。また、実装もそこまで難しいものではないです。 前提知識として、最低限のグラフ理論の知識(特に木構造について)を要求します。(有向木の根/部分木等…) 謝辞 この記事中に挿入されている図は、殆どを @259_Momone さんに提供して頂きました。素晴らしく美しい図を提供して頂き、この記事を分かりやすいものとして頂いたことに感謝いたします。 全方位木DPとは 各点から深さ優先探索を行って解くことができる問題のうち特定の条件(後述)を満たすものについて、全頂点についての答えを同等の計算量で求めることができるアルゴリズムです。 まず、全方位木DPで解くことができ

    【全方位木DP】明日使える便利な木構造のアルゴリズム - Qiita
  • LCAをベースに構築するAuxiliary Treeのメモ - 日々drdrする人のメモ

    (2019/09/15 20:50頃追記) ただAuxiliary Treeと書くと(一般的すぎて)齟齬を生む可能性が高いので、タイトル及び一部文章を変更しました。申し訳ないです。今回はLCAをベースに構築するAuxiliary Treeについて取り上げてます。 最近、LCAを元に構築する Auxiliary Tree を使う問題に出会ったので書いた。 CodeChef July Challenge 2019 で以下の問題があった。 smijake3.hatenablog.com 自分は Auxiliary Tree を使わず解いたが、想定解法が Binarization of a tree + Centroid Decomposition on Edge + Auxiliary Tree だったらしい。 discuss.codechef.com 以下を参考にしている。 虚树学习笔记 -

    LCAをベースに構築するAuxiliary Treeのメモ - 日々drdrする人のメモ
  • https://kimiyuki.net/blog/2019/05/29/not-segment-tree/

  • B-treeインデックス入門 - Qiita

    Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? B-treeがMySQLで使用されている背景から、B-treeインデックスの構造、そしてそれに基づいたインデックスの使用方法の入門編です。以下の流れに沿ってまとめていきます。 インデックスってなに? B-treeってなんでインデックスに使われているの? B-treeインデックスの構造 インデックスの使用方法 ※ 勉強をかねてまとめていることもあり、間違っている箇所がございましたら教えていただけると嬉しいです。 インデックスってなに? 全体の内容の中から特定部分を探すために使用する、の索引のような概念のことです。これを用いることで、検索

    B-treeインデックス入門 - Qiita
  • VP trees: A data structure for finding stuff fast

  • untitled

  • もうひとつの全方位木DP - ei1333の日記

    なにもかくことがないね(えーん) もうひとつの全方位木DPなんですが、任意の全方位木DPが記述できるかは確認してない(多分できないと思う(うく))ので期待はしないでね ゴメンネ この記事は Competitive Programming (2) Advent Calendar 2018 の20日目の記事です。 adventar.org ei1333.hateblo.jp ※ 辺視点のほうが考えやすいので、辺視点で考えます。 頂点1を根とする根付き木があって、各辺についてDPの計算に必要な値が求まっているとします(根に向かう辺の値だけあればよい)。 下図のように別の頂点(今回は頂点 )に根をうつしたときの木について求めたい場合は、もともとの木の根から離れる辺の値についての値をトップダウンに求めていきます。 矢印の先が、それが指す頂点からみたときの辺の値を示すこととします。 この操作により、頂

    もうひとつの全方位木DP - ei1333の日記
  • 傾きの単調性が要らない Convex Hull Trick - kazuma8128’s blog

    はじめに 傾きに単調性がなくても insert ができる Convex Hull Trick を書きたいなーと思ったものの, 平衡二分木で書くのはめんどくさそうだし定数倍遅そうとか考えて色々調べてたら, セグメントツリーを使った簡単な方法を見つけたので, 備忘録的に書いておきます. http://codeforces.com/blog/entry/51275 ちなみにここの記事のコメント欄で見つけたものです. 中国では Li Chao Segment Tree と呼ばれているらしいです. あと, 自分なりの勝手な解釈が入ってるので, 元のものと少し違うかもです. Convex Hull Trickとは Convex Hull Trickとは, 直線集合を管理するデータ構造で, 以下の2種類のクエリをオンラインで処理できます. 直線の追加クエリ     : 直線 f(x) = a * x +

    傾きの単調性が要らない Convex Hull Trick - kazuma8128’s blog
  • C++ STL: Policy based data structures - Codeforces

  • UnionFindTree に関する知見の諸々 - noshi91のメモ

    2018/08/17 ポテンシャル付きUnionFindTreeの記述を変更し、RetroactiveUnionFind についての記述を追加しました。 2019/07/19 集合内の要素の列挙についての記述を追加しました。 はじめに UnionFindTree って知ってますか? 競プロでは恐らく最も使用頻度の高いデータ構造だと思います*1。この記事ではプログラミングコンテストで役に立つものから全く役に立たないものまで、UnionFindTree に関するいくつかの知見を書き留めておきます。記事の最後に各内容の実装例を貼っておきます。 計算量と実装のバリエーション UnionFindTree の操作辺りの計算量が O(α(N)) であることは良く知られていますが*2、この計算量を達成するアルゴリズムはいくつかのバリエーションがあります。併合時に木の高さと大きさのどちらを指標にするかという

    UnionFindTree に関する知見の諸々 - noshi91のメモ
  • Link-Cut 木 - ei1333の日記

    えーむずかしかったのでかきます. まちがってたらごめんね. コードはverifyしたので間違ってないはずです. あとからなんか書き加えたり修正したりするかも. 最初に このスライドがわかりやすいです(それはそう). ソースコードをほとんどこれ参考にしてるので, こっちも参考にしてね. プログラミングコンテストでのデータ構造 2 ~動的木編~ from Takuya Akiba www.slideshare.net HL分解 突然ですが, みなさんはHL分解を知っていますか. 僕は知っています(イキり). HL分解は木を分解するアルゴリズムの一つです. 次のような木が与えられたとします. 根はどこでもいいんですが, ここでは頂点 を根とする根付き木として考えます. 与えられる木 次に, それぞれの頂点に対して部分木の大きさ(頂点数)を求めます. 部分木の大きさを求めた木 最後に, それぞれの

    Link-Cut 木 - ei1333の日記
  • 競技プログラミングにおける無向グラフ上での特殊な数え上げ問題まとめ [スペクトルグラフ理論, 行列木定理, ケイリーの公式] - はまやんはまやんはまやん

    無向グラフ上で特殊な数え上げをする場合に使えるテク集 スペクトルグラフ理論 無向グラフをあるルールで行列に変換したものを使って色んな問題を解決する 参考1 参考2 ラプラシアン行列の固有値0の個数は無向グラフでの連結成分の個数と同じ 解説 行列木定理(ラプラシアン行列の任意の余因子は無向グラフの全域木の個数と等しい) 解説 隣接行列の行列式の偶奇とそのグラフの完全マッチングの総数の偶奇が一致する 解説 ケイリーの公式 参考 n頂点のラベル付きの木の総数はn^(n-2)通りある ラベル付きなので、木の形の組合せと木の頂点に数を割り当てる組合せを全て考慮した組み合わせ数 ケイリーの定理の問題は「行列木定理+多項式補間」の組合せでも解けるっぽい(かなり不確定)(HEのColorful Spanning Treesはこの組合せなのでケイリーの定理っぽくやっても解ける?)(Stranger Tree

    競技プログラミングにおける無向グラフ上での特殊な数え上げ問題まとめ [スペクトルグラフ理論, 行列木定理, ケイリーの公式] - はまやんはまやんはまやん
  • ケイリーの公式の証明6種類 - ジョイジョイジョイ

    ケイリーの公式の証明たちの紹介です。 ケイリーの公式とは ケイリーの公式とは 頂点のラベル付きの木の総数 が であるという公式のことです。 ここで、ラベル付きであるとは、それぞれの頂点を区別するということです。 たとえば のとき、頂点を区別しない場合は長さ のパスのみの 通りですが、ラベル付きの木の場合は , , の 通りです。 証明 1 (プリューファーコード) [1] おそらく一番有名な証明です。 頂点のラベル付きの木の集合から への全単射を以下のように構成します。 最もラベルが小さい葉を木から取り除き、その葉と繋がっていた頂点のラベル を数列の最初の値とします。 続けて、最もラベルが小さい葉を木から取り除き、その葉と繋がっていた頂点のラベル を数列の 番目の値とします。 以下同様に頂点が つになるまで操作を続けます。 こうしてできた数列 が木の値となります。 この数列をプリューファー

  • TCO2014R3BH TreeDistance

    August 11, 2017 SRM, interesting 問題概要(原文) $N$ 頂点の木が与えられる.$K$ 回まで,「辺を $1$ つ選んで削除したのち,新しい辺を(木になるように)追加する」という操作が可能である. 最終的に得られる木は何通りか? 考察 まず簡単な問題を考える. $T_{1},T_{2},\ldots, T_{k}$ なる $k$ 個の木に $k-1$ の辺を追加して,$1$ つの木にしたい.得られる木は何通りあるか? 結論からいうと,$|T|$ を木 $T$ を構成する頂点の数,$N = \sum{|T_i|}$ として,$\prod{|T_i|} N^{k-2}$ である. これはケイリーの式の「$N$ 頂点のラベル付きの頂点,辺の木の数え方」から示せる. 具体的には $k$ 個の根付き森に,$1,\ldots,k-1$ 番の有向辺を追加して,$1$

  • グラフの同型性判定

    説明 二つのグラフ g, h に対して同型すなわち頂点の置換 p であって (u,v) ∈ E(g) iff (p[u], p[v]) ∈ E(h) なるものが存在するかどうかを判定する. 今のところこの問題は NP 完全かどうかすらわかっていない(多くの人は NP 完全ではないが P でもないと信じていると思う).しかしバックトラックによる枝刈り付の全探索が多くの場合うまくいくことが実験によって分かっており,ランダムグラフに対しては O(V log V) で動くことも知られている. 以下の実装は次のアルゴリズムによる. g, h の頂点を次数の小さい順にソートする. 同じ次数のものに対して頂点を対応させてみる. それまでに対応を作った部分と整合性を確かめる. 整合していれば再帰的にチェックする. 計算量 最悪 O(V!).しかしランダムグラフを入力とした実験によると,V = 1000 く