(英語力がないので関数名が…)
(英語力がないので関数名が…)
#Java #Coding #Interview
github.com/PacktPublish...
#Java #Coding #Interview
github.com/PacktPublish...
大量データの重複検出をUnionFindと逆引きインデックスで劇的に高速化した話
https://developers.techouse.com/entry/union-find
大量データの重複検出をUnionFindと逆引きインデックスで劇的に高速化した話
https://developers.techouse.com/entry/union-find
https://developers.techouse.com/entry/union-find
https://developers.techouse.com/entry/union-find
なんか謎のUnionFind系データ構造が転がってるけど、あんまり使わないから忘れかけてたし、名前もごっちゃになってる
自分でつけた名前なのに
なんか謎のUnionFind系データ構造が転がってるけど、あんまり使わないから忘れかけてたし、名前もごっちゃになってる
自分でつけた名前なのに
自作ライブラリ整備してたらたまたまみつけた謎のデータ構造RepresentedUnionFind(結合UnionFind)で一撃だったけどナニコレ
G問題は式をコネコネして因数分解して約数列挙
Y=(与式)としてなんやかんやすると(2Y+2n+1)(2Y-2n-1)=4X-1という式が得られる
右辺は定数なので、4X-1の約数を列挙していって左辺の因数にそれぞれ当てはめて連立方程式を2つ作り、それぞれ解いてnの値を求める
実は約数列挙は片方が正の約数になることを仮定してよかったりする
自作ライブラリ整備してたらたまたまみつけた謎のデータ構造RepresentedUnionFind(結合UnionFind)で一撃だったけどナニコレ
G問題は式をコネコネして因数分解して約数列挙
Y=(与式)としてなんやかんやすると(2Y+2n+1)(2Y-2n-1)=4X-1という式が得られる
右辺は定数なので、4X-1の約数を列挙していって左辺の因数にそれぞれ当てはめて連立方程式を2つ作り、それぞれ解いてnの値を求める
実は約数列挙は片方が正の約数になることを仮定してよかったりする
A substr
B 0で削除済みを表し愚直
C A_i-iの個数をmapで管理しながら追加していく
D 後ろからDPできるんだけど、大きいときの着地を二分探索する必要もありやりたくない
E UnionFindでギリ間に合うと思ったらNを1個余分に付けてTLE
F 難しいと思ってDに戻ったけど、遅延セグ木やるだけで一番簡単だった
G 愚直に辿っては長すぎるけどX_iもばらばらで不可能に見える
A substr
B 0で削除済みを表し愚直
C A_i-iの個数をmapで管理しながら追加していく
D 後ろからDPできるんだけど、大きいときの着地を二分探索する必要もありやりたくない
E UnionFindでギリ間に合うと思ったらNを1個余分に付けてTLE
F 難しいと思ってDに戻ったけど、遅延セグ木やるだけで一番簡単だった
G 愚直に辿っては長すぎるけどX_iもばらばらで不可能に見える
That’s basically Union-Find.
This autism-friendly coding tutorial makes it click:
🎥 youtu.be/IJuupDWkzqE
#UnionFind #AutisticDev #GraphAlgorithms #CodingForBeginners #LearnToCode #NeurodivergentTech
That’s basically Union-Find.
This autism-friendly coding tutorial makes it click:
🎥 youtu.be/IJuupDWkzqE
#UnionFind #AutisticDev #GraphAlgorithms #CodingForBeginners #LearnToCode #NeurodivergentTech
Dと並んで最難候補。
ゴールのマスは0で確定として、それ以外のマスを順次確定させていくことを考える。
あるマスAに注目し、Aに隣り合う4つのマスのうち2つのマスの答えが確定していたら、そのうちの答えの大きい方+1がAの答えになる。
答えが小さいマスから順に確定させていく感じになるよう実装する必要があるっぽい?
G
右上と左下が障害物でつながっているかどうかを UnionFind で判定
Dと並んで最難候補。
ゴールのマスは0で確定として、それ以外のマスを順次確定させていくことを考える。
あるマスAに注目し、Aに隣り合う4つのマスのうち2つのマスの答えが確定していたら、そのうちの答えの大きい方+1がAの答えになる。
答えが小さいマスから順に確定させていく感じになるよう実装する必要があるっぽい?
G
右上と左下が障害物でつながっているかどうかを UnionFind で判定
木を根付き木とみなすと、葉にある陽電子や電子は上にしか行けなくて、陽電子と電子は最小共通祖先で対消滅したいことがわかる
これをDFSっぽい木DPで表現する
F問題は解けなかった
クエリ2をセグメントツリーの配列、クエリ3をUnionFindで高速に解決できそうだったけど、すでに連結している2頂点をクエリ2でご検知するケースに対処できず終了
もう少し気づくのが早ければ……
木を根付き木とみなすと、葉にある陽電子や電子は上にしか行けなくて、陽電子と電子は最小共通祖先で対消滅したいことがわかる
これをDFSっぽい木DPで表現する
F問題は解けなかった
クエリ2をセグメントツリーの配列、クエリ3をUnionFindで高速に解決できそうだったけど、すでに連結している2頂点をクエリ2でご検知するケースに対処できず終了
もう少し気づくのが早ければ……
A Tのリストの先頭に0を入れて、隣り合うTの要素の差がSを超えてないかをチェック
B ABC史上最易候補では? sort して unique
C imos法で最も砲台数少ない場所を探す
D 左側区間+中央区間の長さが 1~N それぞれに対して、コストが最も安いものを短い順に求めていく。右側区間は累積和とかで簡単にコスト求められる
E 上位bitから順に、UnionFind使ってそのbitを含む必要があるかどうかを確定させてく
F セグ木で適当に
G Stern-Brocot Tree を潜っていって最初に区間に含まれる有理数が答え。愚直に潜ると TLE するので二分探索する
A Tのリストの先頭に0を入れて、隣り合うTの要素の差がSを超えてないかをチェック
B ABC史上最易候補では? sort して unique
C imos法で最も砲台数少ない場所を探す
D 左側区間+中央区間の長さが 1~N それぞれに対して、コストが最も安いものを短い順に求めていく。右側区間は累積和とかで簡単にコスト求められる
E 上位bitから順に、UnionFind使ってそのbitを含む必要があるかどうかを確定させてく
F セグ木で適当に
G Stern-Brocot Tree を潜っていって最初に区間に含まれる有理数が答え。愚直に潜ると TLE するので二分探索する
G `1000000-階数` を時刻とする永続UnionFindで殴れる
G `1000000-階数` を時刻とする永続UnionFindで殴れる
D問題は苦手な確率問題で、愚直実装ではTLEが剥がれず断念
これ5500人に解かれてるってマジ?
E問題は比較的得意なグラフ問題だったが、自作ライブラリのUnionFindが機能不足でそのままでは使い物にならなかったので、急遽機能を付け足して滑り込みAC
E問題も2000人以上に解かれてるから、総合的に見ればRating冷えてそうで結果を見るのが怖い
D問題は苦手な確率問題で、愚直実装ではTLEが剥がれず断念
これ5500人に解かれてるってマジ?
E問題は比較的得意なグラフ問題だったが、自作ライブラリのUnionFindが機能不足でそのままでは使い物にならなかったので、急遽機能を付け足して滑り込みAC
E問題も2000人以上に解かれてるから、総合的に見ればRating冷えてそうで結果を見るのが怖い
A `next_permutation` 使ったけど、最大の値を右辺に持っていけば使うまでもないか
B `exists` 配列作って全探索
C むずい。落ち着いて日本語を読む。
D 各配列 `A` はあらかじめソートしておく。`O(N**2)` のループを回す。ループ内ではマージテク的な発想で小さい方の配列を全探索、大きい方に同じ値が何個あるかを調べて確率を求める。
E UnionFind でダブった辺を接続に使う
F `P` を逆順に舐めていって PBDS で殴った
G NTT で畳み込み。係数があんまり大きくならないし、浮動小数点数で FFT でも誤差生じないので可。
A `next_permutation` 使ったけど、最大の値を右辺に持っていけば使うまでもないか
B `exists` 配列作って全探索
C むずい。落ち着いて日本語を読む。
D 各配列 `A` はあらかじめソートしておく。`O(N**2)` のループを回す。ループ内ではマージテク的な発想で小さい方の配列を全探索、大きい方に同じ値が何個あるかを調べて確率を求める。
E UnionFind でダブった辺を接続に使う
F `P` を逆順に舐めていって PBDS で殴った
G NTT で畳み込み。係数があんまり大きくならないし、浮動小数点数で FFT でも誤差生じないので可。
docs.rs/ac-library-r...
docs.rs/ac-library-r...
ABC 3完 13:18
秋のstring祭り、周期性が見つからない
A:stringをソート。122333と一致するか?
B:最初の|を捨てる。-の数を数え|が来たら出力
C:1始まりなら最初に0が0個あるとする。すると配列が0の個数・1の個数の繰り返しとみなせるので変えたいところをSWAP
D:大文字小文字を入れ替えたものをTとする。結局欲しい文字がSなのかTなのかさえ分かればいい。だが周期を見抜けず。
雑に言えば2^nより上に来てたら反転というのを繰り返せばよかった。
E:左右、色情報を載せたUnionFindをコツコツ
次回のRateどうなるか?
ABC 3完 13:18
秋のstring祭り、周期性が見つからない
A:stringをソート。122333と一致するか?
B:最初の|を捨てる。-の数を数え|が来たら出力
C:1始まりなら最初に0が0個あるとする。すると配列が0の個数・1の個数の繰り返しとみなせるので変えたいところをSWAP
D:大文字小文字を入れ替えたものをTとする。結局欲しい文字がSなのかTなのかさえ分かればいい。だが周期を見抜けず。
雑に言えば2^nより上に来てたら反転というのを繰り返せばよかった。
E:左右、色情報を載せたUnionFindをコツコツ
次回のRateどうなるか?
github.com/NAVYSHUNTA/a...
github.com/NAVYSHUNTA/a...
ちなみに k が大きい場合でも、C++ だったら pbds の tree 使えば解けそう
ちなみに k が大きい場合でも、C++ だったら pbds の tree 使えば解けそう