タグ

ProgrammingとTreeに関するagwのブックマーク (37)

  • 遅延伝播セグメント木の使い方,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する人のメモ
  • Rubias19 porno gratis

  • 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

  • 傾きの単調性が要らない 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のメモ
  • 競技プログラミングにおける無向グラフ上での特殊な数え上げ問題まとめ [スペクトルグラフ理論, 行列木定理, ケイリーの公式] - はまやんはまやんはまやん

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

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

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

  • 根付き木のハッシュ - あなたは嘘つきですかと聞かれたら「YES」と答えるブログ

    りんごさん方式の記事 正当性を証明するにはユニークな多項式の形にしてmodを素数にしておけば、Schwartz–Zippel lemmaを使えて良いっぽい? multisetのハッシュ、0になりやすいなぁと思ったけど0になる確率がat most n/modなのか。 記事での根付き木のハッシュの取り方を日語にまとめておきます。 根付き木のハッシュ まず、深さ i に対応する乱数 を [0,mod) から取っておきます。 深さ i の頂点 v について、v 以下の部分木のハッシュは「( + 子のハッシュ)の積」として計算します。 特に、葉のハッシュ値は 1 です。 詳細は実際に記事を読んで下さい。 僕は根付き木のハッシュをどのように取っていたかの話と、それは良くなかったという話と、ならどうすれば良かったかの話をします。 計算法 まず素数p,modを用意する。 ある頂点以下の部分木ハッシュ値は

    根付き木のハッシュ - あなたは嘘つきですかと聞かれたら「YES」と答えるブログ
  • hoge木 - けんちょんの競プロ精進記録

    Qiita に移植しました 重みつき Union-Find 木とそれが使える問題のまとめ、および、牛ゲーについて

    hoge木 - けんちょんの競プロ精進記録
  • 遅延評価セグメント木をソラで書きたいあなたに - hogecoder

    最下段が N-1 から始まるのと、親と子の取得方法がわかってればセグ木は書けます (ホンマか?)— 009_tsutaj@CODE FESTIVAL (@_TTJR_) 2017年3月29日 この記事は前記事: 「セグメント木をソラで書きたいあなたに」の続編です。セグ木をソラで実装するのはまだ厳しい・・・という方はまずはこちらの記事を読んでみてください。 tsutaj.hatenablog.com この記事は「セグメント木はソラで書けるけど、遅延評価セグ木は書けない・・・」という人を対象にしています。 遅延評価って何? まず遅延評価について軽く説明しておきます。 遅延評価というのは、値の伝播*1を遅らせるテクニックです。これは区間に対して更新を行うときに必要になる時が多いです。例えば、値の更新を普通のセグメント木でやろうとしたとき、範囲の長さを とするとこの範囲の長さだけクエリを呼ばなけれ

    遅延評価セグメント木をソラで書きたいあなたに - hogecoder
  • 木の重心列挙アルゴリズム - Learning Algorithms

    木の重心列挙アルゴリズム English version is available here. 木の重心を列挙するアルゴリズムです。重心の性質をよく知っている方にとっては自明な木$dp$を実装するだけだと思います。 これで $verify$ しています。計算量は $O(n)$ です。 中のアルゴリズムとしては、基的には各頂点についてその頂点からのびる部分木のサイズがすべて $\cfrac {n}{2}$ 以下であるような頂点を求めているだけです。 では、そのような頂点が $3$ 個以上存在しないことを示しておきます。 まず、重心が $2$ 個あるとき、それらは必ず隣接していることを示します。 仮に以下の画像のように、重心 $u$ と重心 $v$ が存在して、これらが隣接していないと仮定します。すると $u$ と $v$ のパス上には必ず一つ以上の頂点が存在することになります。そのうちの一

    木の重心列挙アルゴリズム - Learning Algorithms