<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>김신건의 로그 - 위키 / algorithm</title><description>&apos;algorithm&apos; 카테고리 위키 페이지 최신 업데이트</description><link>https://shinkeonkim.com/</link><language>ko-KR</language><item><title>Binary Lifting: 2의 지수 doubling</title><link>https://shinkeonkim.com/wiki/algorithm/math/binary-lifting/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/math/binary-lifting/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;트리에서 정점의 &lt;strong&gt;2^k 조상&lt;/strong&gt; 을 O(N log N) 전처리 후 O(log N) 쿼리로 답하는 기법. LCA, k-th ancestor 등에 사용.&lt;/p&gt;
&lt;h2 id=&quot;전처리&quot;&gt;전처리&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; LOG &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 20&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&gt; &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;up&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;(LOG));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; u&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    up[u][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; LOG; k&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        up[u][k] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; up[u][k&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; ?&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; :&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; up[up[u][k&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;]][k&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v : adj[u]) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (v &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        depth[v] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; depth[u] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(v, u);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;lca-쿼리&quot;&gt;LCA 쿼리&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; lca&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; u&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; v&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (depth[u] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; depth[v]) &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;swap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(u, v);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; diff &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; depth[u] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; depth[v];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; LOG; k&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (diff &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k)) u &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; up[u][k];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (u &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; u;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; LOG &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; k&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (up[u][k] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; up[v][k]) { u &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; up[u][k]; v &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; up[v][k]; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; up[u][&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O(log N) per query.&lt;/p&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LCA&lt;/strong&gt; in O(log N)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kth ancestor&lt;/strong&gt; in O(log N)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Path sum on tree&lt;/strong&gt; (BIT + LCA)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Functional graph next state&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[lca|LCA]]&lt;/li&gt;
&lt;li&gt;[[euler-tour-technique|Euler Tour]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>math</category><category>tree</category><category>lca</category><author>koa (김신건)</author></item><item><title>Binary Search Tree (BST): 정렬된 이진 트리</title><link>https://shinkeonkim.com/wiki/algorithm/data-structure/binary-search-tree/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/data-structure/binary-search-tree/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Binary Search Tree (BST)&lt;/strong&gt; 는 각 노드가 다음을 만족하는 이진 트리입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;왼쪽 서브트리의 모든 키 &amp;#x3C; 노드 키&lt;/li&gt;
&lt;li&gt;오른쪽 서브트리의 모든 키 &gt; 노드 키&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;연산&lt;/strong&gt;: 탐색, 삽입, 삭제 모두 &lt;strong&gt;평균 O(log N)&lt;/strong&gt;. 최악은 O(N) (편향 트리).&lt;/p&gt;
&lt;h2 id=&quot;연산&quot;&gt;연산&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Node&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; key; Node &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;l, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;r; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; search&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; k&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r-&gt;key &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r-&gt;key &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; search&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(r-&gt;l, k) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; search&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(r-&gt;r, k);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; insert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; k&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;r) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Node{k, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;nullptr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;nullptr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r-&gt;key) r-&gt;l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; insert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(r-&gt;l, k);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    else&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r-&gt;key) r-&gt;r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; insert&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(r-&gt;r, k);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;중위 순회 (inorder)&lt;/strong&gt; 로 방문하면 키가 정렬된 순서로 출력됩니다.&lt;/p&gt;
&lt;h2 id=&quot;왜-균형이-필요한가&quot;&gt;왜 균형이 필요한가&lt;/h2&gt;
&lt;p&gt;정렬된 입력을 순서대로 삽입하면 &lt;strong&gt;일자 트리&lt;/strong&gt; 가 되어 O(N) 로 퇴화합니다.&lt;/p&gt;
&lt;p&gt;균형 유지 자료구조:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;[[avl-tree|AVL Tree]]: 엄격한 균형 (높이 차 &amp;#x3C;= 1)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Red-Black Tree&lt;/strong&gt;: 완화된 균형 (색 기반)&lt;/li&gt;
&lt;li&gt;[[bbst|Treap]]: 우선순위 무작위화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Splay Tree&lt;/strong&gt;: 접근 시 회전&lt;/li&gt;
&lt;li&gt;[[order-statistics-tree|Order Statistics Tree]]: BST + 서브트리 크기&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[segtree|Segment Tree]] (구간 쿼리)&lt;/li&gt;
&lt;li&gt;관련 [[bbst|BBST]] (균형 트리)&lt;/li&gt;
&lt;li&gt;관련 [[fenwick-tree|Fenwick Tree]] (prefix sum)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>data-structure</category><category>tree</category><category>bst</category><author>koa (김신건)</author></item><item><title>Branch and Bound: 분기 한정</title><link>https://shinkeonkim.com/wiki/algorithm/foundation/branch-and-bound/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/foundation/branch-and-bound/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Branch and Bound (B&amp;#x26;B)&lt;/strong&gt; 는 완전 탐색을 하되, &lt;strong&gt;상한/하한을 계산해 유망하지 않은 서브트리를 가지치기&lt;/strong&gt; 하는 기법. 최적화 문제에 적용.&lt;/p&gt;
&lt;h2 id=&quot;구성-요소&quot;&gt;구성 요소&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Branching&lt;/strong&gt;: 해 공간을 서브문제로 나누기&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bounding&lt;/strong&gt;: 각 서브문제의 최선 가능한 답 상한/하한 추정&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pruning&lt;/strong&gt;: 현재 best 보다 나쁠 수 밖에 없는 가지 제거&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;예시-tsptsp&quot;&gt;예시: [[tsp|TSP]]&lt;/h2&gt;
&lt;p&gt;Bound: 지금까지 비용 + 남은 도시의 MST 하한 + 남은 도시의 최소 간선 두 개.&lt;/p&gt;
&lt;p&gt;이 bound 가 현재 best solution 보다 크면 그 가지 버림.&lt;/p&gt;
&lt;h2 id=&quot;예시-0-1-knapsackknapsack&quot;&gt;예시: 0-1 [[knapsack|Knapsack]]&lt;/h2&gt;
&lt;p&gt;Bound: 남은 아이템을 fractional 로 채운 최대 가치.&lt;/p&gt;
&lt;h2 id=&quot;best-first-vs-dfs&quot;&gt;Best-first vs DFS&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DFS&lt;/strong&gt;: 스택 작음, 메모리 유리&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best-first ([[priority-queue-heap|priority queue]])&lt;/strong&gt;: 유망한 것부터, 더 빠르지만 큰 큐&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[brute-force|Brute Force]]&lt;/li&gt;
&lt;li&gt;[[dp-bitfield|DP Bitfield]]&lt;/li&gt;
&lt;li&gt;[[a-star|A*]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>foundation</category><category>search</category><category>pruning</category><author>koa (김신건)</author></item><item><title>Brute Force: 완전 탐색</title><link>https://shinkeonkim.com/wiki/algorithm/foundation/brute-force/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/foundation/brute-force/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Brute Force&lt;/strong&gt; 는 문제의 모든 후보 해를 하나씩 검증하는 접근. 최적은 아니지만 &lt;strong&gt;정확&lt;/strong&gt; 하고 &lt;strong&gt;명확&lt;/strong&gt; 하며, 큰 문제에도 부분 검증 도구로 사용.&lt;/p&gt;
&lt;h2 id=&quot;패턴&quot;&gt;패턴&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;모든 부분집합&lt;/strong&gt;: &lt;code&gt;for mask in 0..2^n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모든 순열&lt;/strong&gt;: &lt;code&gt;next_permutation&lt;/code&gt; 또는 재귀&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모든 조합&lt;/strong&gt;: nested loop 또는 &lt;code&gt;combinations&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모든 위치&lt;/strong&gt;: nested for&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;언제-유효한가&quot;&gt;언제 유효한가&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;N ≤ 20 subset (2^N ≤ 10⁶)&lt;/li&gt;
&lt;li&gt;N ≤ 10 permutation (10! ≈ 3.6M)&lt;/li&gt;
&lt;li&gt;N ≤ 100 quadratic (10⁴)&lt;/li&gt;
&lt;li&gt;N ≤ 1000 quadratic (10⁶)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;최적화로-발전&quot;&gt;최적화로 발전&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;가지치기 (pruning)&lt;/strong&gt; → [[branch-and-bound|Branch and Bound]]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메모이제이션&lt;/strong&gt; → DP&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;비트마스크&lt;/strong&gt; → [[dp-bitfield|Bitmask DP]]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[branch-and-bound|Branch and Bound]]&lt;/li&gt;
&lt;li&gt;[[dp-bitfield|DP Bitfield]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>foundation</category><category>search</category><author>koa (김신건)</author></item><item><title>Carmichael Function λ(n)</title><link>https://shinkeonkim.com/wiki/algorithm/math/carmichael-function/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/math/carmichael-function/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Carmichael function&lt;/strong&gt; λ(n) 은 gcd(a, n) = 1 인 모든 a 에 대해 a^m ≡ 1 (mod n) 을 만족하는 최소 양의 정수 m.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;핵심 성질&lt;/strong&gt;: 항상 λ(n) | φ(n). 즉 [[euler-phi-function|Euler Phi]] 는 항상 유효하지만 tight 하지 않을 수 있음.&lt;/p&gt;
&lt;h2 id=&quot;계산&quot;&gt;계산&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;λ(1) = 1&lt;/li&gt;
&lt;li&gt;λ(2) = 1, λ(4) = 2&lt;/li&gt;
&lt;li&gt;λ(2^k) = 2^(k-2) for k ≥ 3&lt;/li&gt;
&lt;li&gt;λ(p^k) = p^(k-1)(p-1) for odd prime p&lt;/li&gt;
&lt;li&gt;λ(prod p_i^k_i) = lcm(λ(p_i^k_i))&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RSA-CRT&lt;/strong&gt;: 개인 키 지수 e^{-1} mod λ(n) 이 정확한 exponent&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Order 문제&lt;/strong&gt;: 임의 a 의 곱셈적 order 는 λ(n) 의 약수&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[euler-phi-function|Euler Phi Function]]&lt;/li&gt;
&lt;li&gt;[[flt|Fermat’s Little Theorem]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>math</category><category>number-theory</category><author>koa (김신건)</author></item><item><title>Catalan Number: C_n</title><link>https://shinkeonkim.com/wiki/algorithm/math/catalan-number/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/math/catalan-number/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Catalan number&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;$$
C_n = \frac{1}{n+1} \binom{2n}{n} = \frac{(2n)!}{(n+1)! , n!}
$$&lt;/p&gt;
&lt;p&gt;C_0 = 1, C_1 = 1, C_2 = 2, C_3 = 5, C_4 = 14, C_5 = 42.&lt;/p&gt;
&lt;h2 id=&quot;응용-모두-c_n-개&quot;&gt;응용 (모두 C_n 개)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;balanced parenthesis&lt;/strong&gt; n 쌍&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;binary tree&lt;/strong&gt; with n internal nodes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dyck path&lt;/strong&gt; length 2n (only up-right moves)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;triangulation&lt;/strong&gt; of convex (n+2)-gon&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;stack-permutations&lt;/strong&gt; of 1..n&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;점화식&quot;&gt;점화식&lt;/h2&gt;
&lt;p&gt;$$
C_{n+1} = \sum_{i=0}^{n} C_i C_{n-i}
$$&lt;/p&gt;
&lt;p&gt;또는 $C_n = \frac{2(2n-1)}{n+1} C_{n-1}$.&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[combinatorics|조합론]]&lt;/li&gt;
&lt;li&gt;[[pascal-triangle|Pascal Triangle]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>math</category><category>combinatorics</category><category>catalan</category><author>koa (김신건)</author></item><item><title>Convex Hull 3D: 3차원 볼록 껍질</title><link>https://shinkeonkim.com/wiki/algorithm/geometry/convex-hull-3d/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/geometry/convex-hull-3d/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;3D 점집합의 &lt;strong&gt;볼록 껍질&lt;/strong&gt;: 모든 점을 포함하는 최소 볼록 다면체. 면 (face) 들이 삼각형으로 구성됨.&lt;/p&gt;
&lt;h2 id=&quot;incremental-construction&quot;&gt;Incremental Construction&lt;/h2&gt;
&lt;p&gt;한 번에 한 점씩 추가:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;초기 정사면체 (일반 위치의 4 점)&lt;/li&gt;
&lt;li&gt;점 P 추가:
&lt;ul&gt;
&lt;li&gt;P 에서 보이는 (visible) 면 제거&lt;/li&gt;
&lt;li&gt;경계 (horizon) 를 따라 새 삼각형 부채 형성&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;O(N²) worst case, O(N log N) expected with random shuffle.&lt;/p&gt;
&lt;h2 id=&quot;gift-wrapping-3d&quot;&gt;Gift Wrapping (3D)&lt;/h2&gt;
&lt;p&gt;각 면을 하나씩 “감싸” 나가는 방식. O(N · F), F = 면 개수. 정확하지만 느림.&lt;/p&gt;
&lt;h2 id=&quot;randomized-incremental-구현-편함&quot;&gt;Randomized Incremental (구현 편함)&lt;/h2&gt;
&lt;p&gt;무작위 셔플 + incremental 로 O(N log N) 기대 시간.&lt;/p&gt;
&lt;h2 id=&quot;chans-algorithm&quot;&gt;Chan’s Algorithm&lt;/h2&gt;
&lt;p&gt;O(N log H), H = 껍질 면 수. 이론적 최적.&lt;/p&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;3D 물체의 최소 감싸는 다면체&lt;/li&gt;
&lt;li&gt;최대 이격 두 점 (diameter)&lt;/li&gt;
&lt;li&gt;Voronoi diagram, Delaunay triangulation&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[convex-hull|2D Convex Hull]]&lt;/li&gt;
&lt;li&gt;[[geometry-3d|3D Geometry]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>geometry</category><category>convex-hull</category><category>3d</category><author>koa (김신건)</author></item><item><title>Cycle Detection: 그래프 사이클 탐지</title><link>https://shinkeonkim.com/wiki/algorithm/graph/cycle-detection/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/graph/cycle-detection/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;그래프에 &lt;strong&gt;사이클이 존재하는가&lt;/strong&gt;, 또는 &lt;strong&gt;어느 사이클인가&lt;/strong&gt; 를 찾는 문제.&lt;/p&gt;
&lt;h2 id=&quot;무향-그래프&quot;&gt;무향 그래프&lt;/h2&gt;
&lt;h3 id=&quot;union-find-접근&quot;&gt;Union-Find 접근&lt;/h3&gt;
&lt;p&gt;간선 (u, v) 삽입 시 &lt;code&gt;find(u) == find(v)&lt;/code&gt; 이면 사이클.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;DSU&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dsu&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [u, v] : edges) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (dsu.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;same&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(u, v)) {&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt; /* 사이클! */&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dsu.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;merge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(u, v);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;dfs-접근&quot;&gt;DFS 접근&lt;/h3&gt;
&lt;p&gt;부모가 아닌 방문 완료 정점으로 되돌아가면 사이클.&lt;/p&gt;
&lt;h2 id=&quot;유향-그래프&quot;&gt;유향 그래프&lt;/h2&gt;
&lt;h3 id=&quot;dfs--3-색&quot;&gt;DFS + 3 색&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;흰색: 미방문&lt;/li&gt;
&lt;li&gt;회색: DFS 스택 위&lt;/li&gt;
&lt;li&gt;검은색: 완료
회색 정점으로 가는 간선 = &lt;strong&gt;back edge&lt;/strong&gt; = 사이클.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; color;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 0/1/2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; u&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; adj&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    color[u] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v : adj[u]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (color[v] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;              // back edge&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (color[v] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(v, adj)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    color[u] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;kahns-활용&quot;&gt;Kahn’s 활용&lt;/h3&gt;
&lt;p&gt;[[topological-sorting|위상 정렬]] 로 얻은 순서 크기 &amp;#x3C; N 이면 사이클 존재.&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[topological-sorting|Topological Sorting]]&lt;/li&gt;
&lt;li&gt;[[disjoint-set|Union-Find]]&lt;/li&gt;
&lt;li&gt;[[tarjan-scc|Tarjan SCC]] (강한 연결 요소)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>graph</category><category>cycle</category><author>koa (김신건)</author></item><item><title>DP on Bitmask: 비트마스크 DP</title><link>https://shinkeonkim.com/wiki/algorithm/dp/dp-on-bitmask/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/dp/dp-on-bitmask/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;부분집합 상태를 비트마스크로 인코딩&lt;/strong&gt; 하여 DP 를 수행. 원소 수 N ≤ 20 정도에서 유효.&lt;/p&gt;
&lt;p&gt;자세한 내용은 [[dp-bitfield|DP Bitfield]] 참조.&lt;/p&gt;
&lt;h2 id=&quot;대표-예&quot;&gt;대표 예&lt;/h2&gt;
&lt;h3 id=&quot;tsp&quot;&gt;TSP&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;dp[mask][i]&lt;/code&gt; = 방문한 도시 mask, 현재 i.
전이: 다음 도시 j 로 갈 때 &lt;code&gt;dp[mask | (1&amp;#x3C;&amp;#x3C;j)][j] = dp[mask][i] + cost[i][j]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;O(2^N · N²).&lt;/p&gt;
&lt;h3 id=&quot;assignment-problem&quot;&gt;Assignment Problem&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;dp[i][mask]&lt;/code&gt; = 사람 i 까지 배정, 사용한 태스크 mask.&lt;/p&gt;
&lt;h3 id=&quot;hamiltonian-path&quot;&gt;Hamiltonian Path&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;dp[mask][i]&lt;/code&gt; = mask 를 정확히 방문한 상태로 i 에서 끝나는 경로 존재 여부.&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[dp-bitfield|DP Bitfield]] (자세한 예제)&lt;/li&gt;
&lt;li&gt;[[tsp|TSP]]&lt;/li&gt;
&lt;li&gt;[[hamiltonian-path|Hamiltonian Path]]&lt;/li&gt;
&lt;li&gt;[[dp-sum-over-subsets|SOS DP]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>dp</category><category>bitmask</category><author>koa (김신건)</author></item><item><title>DP Optimization: CHT, D&amp;C, Knuth, SMAWK</title><link>https://shinkeonkim.com/wiki/algorithm/dp/dp-optimization/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/dp/dp-optimization/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;일반 DP 를 O(N²) 또는 O(N³) 에서 &lt;strong&gt;O(N log N)&lt;/strong&gt; 또는 &lt;strong&gt;O(N)&lt;/strong&gt; 으로 낮추는 여러 최적화 기법의 총칭입니다. 모두 특정 &lt;strong&gt;조건 (monotone, concave, quadrangle inequality)&lt;/strong&gt; 이 성립할 때만 적용 가능.&lt;/p&gt;
&lt;h2 id=&quot;대표-4-종&quot;&gt;대표 4 종&lt;/h2&gt;
&lt;h3 id=&quot;1-convex-hull-trick-cht&quot;&gt;1. Convex Hull Trick (CHT)&lt;/h3&gt;
&lt;p&gt;선형 함수 min/max 를 유지하는 자료구조. &lt;code&gt;dp[i] = min(a[j]·x + b[j])&lt;/code&gt; 형태에 적용.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Li-Chao Tree&lt;/strong&gt;: 임의 삽입 순서&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kinetic&lt;/strong&gt;: 온라인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;모노톤 CHT&lt;/strong&gt;: 기울기 정렬된 경우 O(1) push&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;전용 [[li-chao-tree|Li-Chao Tree]] 참조.&lt;/p&gt;
&lt;h3 id=&quot;2-divide-and-conquer-optimization&quot;&gt;2. Divide-and-Conquer Optimization&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;dp[i][j] = min(dp[i-1][k] + cost(k, j))&lt;/code&gt; 에서 &lt;strong&gt;최적 k 가 j 에 대해 단조 증가&lt;/strong&gt; 하면 O(N²) → &lt;strong&gt;O(N log N)&lt;/strong&gt;.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;void&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; solve &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;](&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; lo&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; hi&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; optl&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; optr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (lo &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hi) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mid &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (lo &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hi) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; best_k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; optl;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    dp[mid] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; LLONG_MAX;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; optl; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mid, optr); k&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cand &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; prev[k] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; cost&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(k, mid);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (cand &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dp[mid]) { dp[mid] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cand; best_k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(lo, mid &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, optl, best_k);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    solve&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mid &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, hi, best_k, optr);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;3-knuth-optimization&quot;&gt;3. Knuth Optimization&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;dp[i][j] = min(dp[i][k] + dp[k][j]) + w(i, j)&lt;/code&gt; 형태. &lt;strong&gt;Quadrangle inequality + monotone&lt;/strong&gt; 이면 O(N³) → &lt;strong&gt;O(N²)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;행렬 곱셈 순서, 최적 이진 검색 트리, LP 등.&lt;/p&gt;
&lt;h3 id=&quot;4-smawk--monge&quot;&gt;4. SMAWK / Monge&lt;/h3&gt;
&lt;p&gt;Monge 행렬 (모든 2×2 부분행렬이 QI 만족) 위 행별 최솟값을 &lt;strong&gt;O(N)&lt;/strong&gt; 에 계산.&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[li-chao-tree|Li-Chao Tree]]&lt;/li&gt;
&lt;li&gt;[[dp-bitfield|DP Bitfield]]&lt;/li&gt;
&lt;li&gt;[[knapsack|Knapsack DP]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>dp</category><category>optimization</category><author>koa (김신건)</author></item><item><title>Dynamic Connectivity: 간선 추가/삭제 연결성</title><link>https://shinkeonkim.com/wiki/algorithm/data-structure/dynamic-connectivity/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/data-structure/dynamic-connectivity/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Connectivity&lt;/strong&gt; 는 간선의 &lt;strong&gt;추가와 삭제&lt;/strong&gt; 가 모두 일어나는 그래프에서 두 정점의 연결 여부를 유지하는 문제입니다.&lt;/p&gt;
&lt;h3 id=&quot;삽입만-있는-경우&quot;&gt;삽입만 있는 경우&lt;/h3&gt;
&lt;p&gt;[[disjoint-set|Union-Find]] 로 O(α(N)) amortized.&lt;/p&gt;
&lt;h3 id=&quot;삭제만-있는-경우&quot;&gt;삭제만 있는 경우&lt;/h3&gt;
&lt;p&gt;시간 역행으로 삽입 문제로 환원.&lt;/p&gt;
&lt;h3 id=&quot;삽입--삭제&quot;&gt;삽입 + 삭제&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Link-Cut Tree&lt;/strong&gt; 또는 &lt;strong&gt;Euler Tour Tree&lt;/strong&gt; 로 O(log² N).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Holm-Lichtenberg-Thorup&lt;/strong&gt;: O(log² N) amortized 온라인&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offline Divide-and-Conquer + Union-Find with rollback&lt;/strong&gt;: 배치 처리 시 실전 자주 사용&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[disjoint-set|Union-Find]]&lt;/li&gt;
&lt;li&gt;[[dynamic-tree|Link-Cut Tree]]&lt;/li&gt;
&lt;li&gt;[[euler-tour-technique|Euler Tour Tree]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>data-structure</category><category>connectivity</category><author>koa (김신건)</author></item><item><title>Dynamic Segment Tree: 지연 노드 생성</title><link>https://shinkeonkim.com/wiki/algorithm/data-structure/dynamic-segtree/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/data-structure/dynamic-segtree/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Dynamic Segment Tree&lt;/strong&gt; 는 값 범위가 매우 크지만 실제 접근 위치가 희소할 때, &lt;strong&gt;필요한 노드만 생성&lt;/strong&gt; 하는 세그먼트 트리입니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;공간&lt;/strong&gt;: O(Q log V), Q = 쿼리 수, V = 값 범위&lt;/p&gt;
&lt;h2 id=&quot;구조&quot;&gt;구조&lt;/h2&gt;
&lt;p&gt;포인터 기반, 또는 &lt;code&gt;map&amp;#x3C;int, int&gt;&lt;/code&gt; 로 자식 인덱스 관리.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Node&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; sum &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; Node &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; nullptr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; nullptr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; lo&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; hi&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; pos&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; v&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;n) n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; new&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Node&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (lo &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hi) { n-&gt;sum &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mid &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (lo &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; hi) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (pos &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mid) &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n-&gt;l, lo, mid, pos, v);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    else&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n-&gt;r, mid &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, hi, pos, v);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    n-&gt;sum &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (n-&gt;l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n-&gt;l-&gt;sum &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (n-&gt;r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;?&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n-&gt;r-&gt;sum &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;대안&quot;&gt;대안&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;좌표 압축 + 일반 [[segtree|Segment Tree]]&lt;/strong&gt;: 오프라인 처리 가능하면 대개 더 간단&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[[persistent-segtree|Persistent Segtree]]&lt;/strong&gt;: 버전 추적 필요 시&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[segtree|Segment Tree]]&lt;/li&gt;
&lt;li&gt;[[persistent-segtree|Persistent Segtree]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>data-structure</category><category>segment-tree</category><author>koa (김신건)</author></item><item><title>Euler Phi Function: φ(n)</title><link>https://shinkeonkim.com/wiki/algorithm/math/euler-phi-function/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/math/euler-phi-function/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Euler Phi Function&lt;/strong&gt; φ(n) 은 1 이상 n 이하 정수 중 n 과 서로소인 정수의 개수.&lt;/p&gt;
&lt;p&gt;기존 [[euler-phi|Euler Phi]] 위키 참조. 이 페이지는 alias 확장용 축약.&lt;/p&gt;
&lt;h2 id=&quot;공식&quot;&gt;공식&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;소수 p: φ(p) = p - 1&lt;/li&gt;
&lt;li&gt;p^k: φ(p^k) = p^k - p^(k-1)&lt;/li&gt;
&lt;li&gt;곱셈적: gcd(a, b) = 1 이면 φ(ab) = φ(a)φ(b)&lt;/li&gt;
&lt;li&gt;일반: φ(n) = n · Π (1 - 1/p) over distinct primes p | n&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[euler-phi|Euler Phi]] (본 위키)&lt;/li&gt;
&lt;li&gt;[[euler-totient|Euler Totient]]&lt;/li&gt;
&lt;li&gt;[[flt|Fermat’s Little Theorem]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>math</category><category>number-theory</category><category>totient</category><author>koa (김신건)</author></item><item><title>Euler&apos;s Criterion: 이차잉여 판정</title><link>https://shinkeonkim.com/wiki/algorithm/math/eulers-criterion/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/math/eulers-criterion/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;홀소수 p 에 대해 a 가 mod p 에서 &lt;strong&gt;이차잉여 (quadratic residue)&lt;/strong&gt; 인지 판정:&lt;/p&gt;
&lt;p&gt;$$
a^{(p-1)/2} \equiv \begin{cases} 1 &amp;#x26; \text{a is QR} \ -1 &amp;#x26; \text{a is NR} \end{cases} \pmod{p}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Legendre symbol&lt;/strong&gt; (a/p) 는 위 결과 (또는 0 if p|a).&lt;/p&gt;
&lt;h2 id=&quot;왜-성립하는가&quot;&gt;왜 성립하는가&lt;/h2&gt;
&lt;p&gt;[[flt|Fermat’s Little Theorem]]: a^(p-1) ≡ 1 (mod p). 그러면 (a^((p-1)/2))² ≡ 1, 즉 a^((p-1)/2) ≡ ±1.&lt;/p&gt;
&lt;p&gt;만약 a ≡ b² 이면 a^((p-1)/2) ≡ b^(p-1) ≡ 1.&lt;/p&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tonelli-Shanks&lt;/strong&gt;: sqrt mod p 계산 (QR 여부 판정에 사용)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Solovay-Strassen 소수 판정&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[flt|Fermat’s Little Theorem]]&lt;/li&gt;
&lt;li&gt;[[discrete-sqrt|Tonelli-Shanks]]&lt;/li&gt;
&lt;li&gt;[[quadratic-residue|Quadratic Residue]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>math</category><category>number-theory</category><category>quadratic-residue</category><author>koa (김신건)</author></item><item><title>Expected Value: 기댓값, Linearity</title><link>https://shinkeonkim.com/wiki/algorithm/foundation/expected-value/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/foundation/expected-value/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;확률변수 X 의 기댓값:&lt;/p&gt;
&lt;p&gt;$$
E[X] = \sum_x x \cdot P(X = x) \quad \text{(discrete)}
$$&lt;/p&gt;
&lt;p&gt;$$
E[X] = \int x \cdot f(x) , dx \quad \text{(continuous)}
$$&lt;/p&gt;
&lt;h2 id=&quot;linearity-of-expectation&quot;&gt;Linearity of Expectation&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;독립 여부 무관&lt;/strong&gt;: E[X + Y] = E[X] + E[Y].&lt;/p&gt;
&lt;p&gt;이것이 경쟁 프로그래밍에서 강력한 이유: 복잡한 이벤트를 지시 변수 합으로 분해.&lt;/p&gt;
&lt;h2 id=&quot;예시-n-개-편지가-다른-봉투에-무작위-배정&quot;&gt;예시: n 개 편지가 다른 봉투에 무작위 배정&lt;/h2&gt;
&lt;p&gt;각 편지 i 가 자기 봉투에 갈 확률 = 1/n.
지시변수 X_i (i-th 편지가 자기 봉투) → E[X_i] = 1/n.
E[total] = Σ 1/n = 1.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;“랜덤 순열의 fixed points 기댓값 = 1”&lt;/strong&gt; 결과 도출.&lt;/p&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;뽑기, coupon collector: E[전부 뽑기] = n · H_n ≈ n ln n&lt;/li&gt;
&lt;li&gt;무작위 알고리즘 분석 (quicksort, randomized primality)&lt;/li&gt;
&lt;li&gt;마르코프 체인 흡수 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[markov-chain|Markov Chain]]&lt;/li&gt;
&lt;li&gt;[[expected-value|Linearity of Expectation]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>foundation</category><category>probability</category><author>koa (김신건)</author></item><item><title>Fenwick Tree (Binary Indexed Tree): 구간 합 O(log N)</title><link>https://shinkeonkim.com/wiki/algorithm/data-structure/fenwick-tree/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/data-structure/fenwick-tree/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Fenwick Tree&lt;/strong&gt; (또는 &lt;strong&gt;BIT, Binary Indexed Tree&lt;/strong&gt;) 는 배열의 &lt;strong&gt;prefix sum 을 O(log N) 에 갱신·조회&lt;/strong&gt; 하는 자료구조입니다. Peter Fenwick 이 1994 년 발표.&lt;/p&gt;
&lt;p&gt;핵심 아이디어: &lt;strong&gt;각 인덱스가 자신의 lowbit 만큼의 구간을 담당&lt;/strong&gt; 하도록 정의하여, prefix 합을 몇 개의 노드 값의 합으로 표현합니다.&lt;/p&gt;
&lt;h2 id=&quot;왜-segtreesegment-tree-대신-쓰는가&quot;&gt;왜 [[Segtree|Segment Tree]] 대신 쓰는가&lt;/h2&gt;






























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;항목&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Fenwick Tree&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Segment Tree&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;코드 길이&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;매우 짧음 (10줄)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;김 (30~50줄)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;상수&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;매우 작음&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;큼&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;지원 연산&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;합, XOR 등 역연산 가능한 것&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;임의 결합 연산 (min, max, gcd)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;구간 갱신&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;별도 트릭 필요&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Lazy propagation 자연스럽게 지원&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;합 쿼리 위주라면 Fenwick 이 압도적&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;h2 id=&quot;lowbit-연산&quot;&gt;lowbit 연산&lt;/h2&gt;
&lt;p&gt;핵심은 &lt;strong&gt;&lt;code&gt;x &amp;#x26; -x&lt;/code&gt;&lt;/strong&gt; (2의 보수 특성).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;x = 6 = &lt;code&gt;0110&lt;/code&gt; → &lt;code&gt;x &amp;#x26; -x = 0010&lt;/code&gt; = 2&lt;/li&gt;
&lt;li&gt;x = 12 = &lt;code&gt;1100&lt;/code&gt; → &lt;code&gt;x &amp;#x26; -x = 0100&lt;/code&gt; = 4&lt;/li&gt;
&lt;li&gt;x = 8 = &lt;code&gt;1000&lt;/code&gt; → &lt;code&gt;x &amp;#x26; -x = 1000&lt;/code&gt; = 8&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;의미&lt;/strong&gt;: x 의 이진표현에서 &lt;strong&gt;가장 낮은 1 비트&lt;/strong&gt; 만 남긴 값. 이것이 Fenwick 배열에서 그 인덱스가 담당하는 구간의 길이입니다.&lt;/p&gt;
&lt;h2 id=&quot;구조&quot;&gt;구조&lt;/h2&gt;
&lt;p&gt;인덱스 i (1-based) 는 구간 $[i - \text{lowbit}(i) + 1, i]$ 의 합을 담당합니다.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;i:  1 2 3 4 5 6 7 8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    │ ┴ │ ┴ ┴ ┴ │ ┴─────&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    │   │       │       ┴&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    ┴───┴───────┴───────&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;1 담당: [1,1]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;2 담당: [1,2]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;3 담당: [3,3]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;4 담당: [1,4]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;5 담당: [5,5]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;6 담당: [5,6]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;7 담당: [7,7]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;8 담당: [1,8]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;코드-0-based-배열-1-based-fenwick&quot;&gt;코드 (0-based 배열, 1-based Fenwick)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Fenwick&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    Fenwick&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) : &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n), &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; v&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 1-based&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;i) t[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; query&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; i&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 1-based, prefix [1..i]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;i) s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t[i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; range&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; l&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // [l..r]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; query&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(r) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; query&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;시간 복잡도&lt;/strong&gt;: 두 연산 모두 O(log N).&lt;/p&gt;
&lt;h2 id=&quot;query-흐름-예-n8-query6&quot;&gt;Query 흐름 예 (N=8, query(6))&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;6 = 110&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;i=6 (&lt;code&gt;110&lt;/code&gt;), t[6] 더함. i -= lowbit(6)=2 → i=4&lt;/li&gt;
&lt;li&gt;i=4 (&lt;code&gt;100&lt;/code&gt;), t[4] 더함. i -= lowbit(4)=4 → i=0&lt;/li&gt;
&lt;li&gt;종료.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;prefix[6] = t[6] + t[4].&lt;/p&gt;
&lt;h2 id=&quot;update-흐름-예-n8-update3-5&quot;&gt;Update 흐름 예 (N=8, update(3, +5))&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;3 = 011&lt;/code&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;i=3 (&lt;code&gt;011&lt;/code&gt;), t[3]+=5. i += lowbit(3)=1 → i=4&lt;/li&gt;
&lt;li&gt;i=4 (&lt;code&gt;100&lt;/code&gt;), t[4]+=5. i += lowbit(4)=4 → i=8&lt;/li&gt;
&lt;li&gt;i=8 (&lt;code&gt;1000&lt;/code&gt;), t[8]+=5. i += lowbit(8)=8 → i=16 &gt; 8, 종료.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;h3 id=&quot;1-역수-세기-inversion-count&quot;&gt;1. 역수 세기 (Inversion Count)&lt;/h3&gt;
&lt;p&gt;배열 $a$ 에서 $i &amp;#x3C; j$ 지만 $a_i &gt; a_j$ 인 쌍의 개수.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// a 를 오른쪽에서 왼쪽으로 순회&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; inv &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Fenwick&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;MAX_VALUE&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;--&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    inv &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; f.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;query&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a[i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   // 나보다 작은 값이 오른쪽에 몇 개?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    f.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a[i], &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;2-k-th-원소-fenwick-위-이분탐색&quot;&gt;2. K-th 원소 (Fenwick 위 이분탐색)&lt;/h3&gt;
&lt;p&gt;값들에 카운트를 저장하고, prefix 합을 이분탐색으로 뒤져 k 번째 값 찾기. O(log² N).&lt;/p&gt;
&lt;h3 id=&quot;3-구간-갱신--점-쿼리-차분-배열-트릭&quot;&gt;3. 구간 갱신 + 점 쿼리 (차분 배열 트릭)&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;update(l, r, v):  fenwick.update(l, +v); fenwick.update(r+1, -v);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;query(i):         fenwick.query(i)  // = a[i] 값&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4-구간-갱신--구간-쿼리-fenwick-2-개&quot;&gt;4. 구간 갱신 + 구간 쿼리 (Fenwick 2 개)&lt;/h3&gt;
&lt;p&gt;BIT 두 개 $B_1, B_2$ 로 임의 구간 갱신, 구간 합을 O(log N) 유지 가능.&lt;/p&gt;
&lt;h2 id=&quot;2d-fenwick&quot;&gt;2D Fenwick&lt;/h2&gt;
&lt;p&gt;2 차원 부분합에도 확장:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; update&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; x&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; v&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;i)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; y; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; m; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;j)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            t[i][j] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; query&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; x&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; y&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;i)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; y; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;j)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            s &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t[i][j];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O(log² N), 이미지/그리드 계열 문제에 유용.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;인덱스 시작&lt;/strong&gt;: Fenwick 은 반드시 &lt;strong&gt;1-based&lt;/strong&gt;. &lt;code&gt;i &gt; 0&lt;/code&gt; 종료 조건을 잊고 0-based 로 쓰면 무한 루프.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;역연산 필요&lt;/strong&gt;: &lt;code&gt;range(l, r) = query(r) - query(l-1)&lt;/code&gt; 이 되려면 &lt;strong&gt;역연산 (뺄셈, XOR)&lt;/strong&gt; 이 있어야 함. &lt;code&gt;min/max&lt;/code&gt; 는 Fenwick 로 쿼리 불가 → [[segtree|Segment Tree]] 사용.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;크기 제한&lt;/strong&gt;: 좌표 압축 잊지 말 것. 값 범위가 크면 index 로 못 씀.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[segtree|Segment Tree]]: 임의 연산 지원&lt;/li&gt;
&lt;li&gt;관련 [[prefix-sum|Prefix Sum]]: 정적 배열에 O(1) 쿼리&lt;/li&gt;
&lt;li&gt;관련 [[merge-sort-tree|Merge Sort Tree]], [[wavelet-tree|Wavelet Tree]]: 더 복잡한 쿼리&lt;/li&gt;
&lt;li&gt;cp-algorithms: &lt;a href=&quot;https://cp-algorithms.com/data_structures/fenwick.html&quot;&gt;Fenwick Tree&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>data-structure</category><category>tree</category><category>prefix-sum</category><author>koa (김신건)</author></item><item><title>Geometry Basic: 벡터, CCW, 외적, 내적</title><link>https://shinkeonkim.com/wiki/algorithm/geometry/geometry-basic/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/geometry/geometry-basic/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;기하 알고리즘의 밑바탕. 대부분의 2D/3D 기하 문제는 &lt;strong&gt;벡터 연산&lt;/strong&gt;, &lt;strong&gt;내적/외적&lt;/strong&gt;, &lt;strong&gt;CCW 판정&lt;/strong&gt; 세 가지의 조합으로 풀립니다.&lt;/p&gt;
&lt;h2 id=&quot;벡터&quot;&gt;벡터&lt;/h2&gt;
&lt;p&gt;2D 벡터: 두 점 $A = (a_x, a_y)$ 와 $B = (b_x, b_y)$ 사이의 방향/거리 표현.&lt;/p&gt;
&lt;p&gt;$$
\vec{AB} = B - A = (b_x - a_x, b_y - a_y)
$$&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Vec&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x, y; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; sub&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {a.x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b.x, a.y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b.y}; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {a.x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b.x, a.y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b.y}; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dot&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)   { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a.x&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;b.x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a.y&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;b.y; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; cross&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a.x&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;b.y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a.y&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;b.x; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;strong&gt;정수 좌표라면 반드시 &lt;code&gt;long long&lt;/code&gt;&lt;/strong&gt; 을 씁니다. 외적은 곱셈 두 개의 뺄셈이라 오버플로 위험이 큽니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;내적-dot-product&quot;&gt;내적 (Dot Product)&lt;/h2&gt;
&lt;p&gt;$$
\vec{a} \cdot \vec{b} = a_x b_x + a_y b_y = |\vec{a}||\vec{b}| \cos\theta
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;용도&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;각도&lt;/strong&gt;: $\cos\theta = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}||\vec{b}|}$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;직교 판정&lt;/strong&gt;: $\vec{a} \cdot \vec{b} = 0$ ⟺ 수직&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;투영&lt;/strong&gt;: $\vec{a}$ 를 $\vec{b}$ 방향으로 투영한 길이 = $\frac{\vec{a} \cdot \vec{b}}{|\vec{b}|}$&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;외적-cross-product-핵심-도구&quot;&gt;외적 (Cross Product), 핵심 도구&lt;/h2&gt;
&lt;p&gt;2D 에서 외적은 스칼라 (z 성분만):&lt;/p&gt;
&lt;p&gt;$$
\vec{a} \times \vec{b} = a_x b_y - a_y b_x = |\vec{a}||\vec{b}| \sin\theta
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;부호 의미&lt;/strong&gt;:&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;값&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;$&gt; 0$&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$\vec{b}$ 가 $\vec{a}$ 의 &lt;strong&gt;반시계 (counterclockwise, CCW)&lt;/strong&gt; 방향&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;$&amp;#x3C; 0$&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;$\vec{b}$ 가 $\vec{a}$ 의 &lt;strong&gt;시계 (clockwise, CW)&lt;/strong&gt; 방향&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;$= 0$&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;두 벡터 &lt;strong&gt;평행&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;절댓값 의미&lt;/strong&gt;: $\vec{a}$, $\vec{b}$ 가 이루는 평행사변형의 넓이. 삼각형이면 이의 절반.&lt;/p&gt;
&lt;h2 id=&quot;ccw-counterclockwise-test&quot;&gt;CCW (Counterclockwise Test)&lt;/h2&gt;
&lt;p&gt;세 점 $A, B, C$ 의 방향 관계 판정. 알고리즘 기하의 만능 도구입니다.&lt;/p&gt;
&lt;p&gt;$$
\text{CCW}(A, B, C) = \text{sign}\left( (B - A) \times (C - A) \right)
$$&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; ccw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; cross&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sub&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(b, a), &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;sub&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(c, a));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (v &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (v &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 1, -1, 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;해석&lt;/strong&gt;:&lt;/p&gt;





















&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;center&quot;&gt;반환&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;배치&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;+1&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;A → B → C 가 &lt;strong&gt;반시계&lt;/strong&gt; (좌회전)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;-1&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;A → B → C 가 &lt;strong&gt;시계&lt;/strong&gt; (우회전)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;세 점이 &lt;strong&gt;일직선&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;응용은 광범위&lt;/strong&gt;: convex hull, 선분 교차, 다각형 내부 판정, 회전 캘리퍼스 등 거의 모든 기하 알고리즘의 기본 연산.&lt;/p&gt;
&lt;h3 id=&quot;ccw-시각화&quot;&gt;CCW 시각화&lt;/h3&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;mermaid&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;graph LR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph CCW[&quot;CCW = +1 (반시계)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        A1[A] --&gt; B1[B]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        B1 --&gt; C1[C]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        C1 -.-&gt; A1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph CW[&quot;CCW = -1 (시계)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        A2[A] --&gt; B2[B]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        B2 --&gt; C2[C]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        C2 -.-&gt; A2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    subgraph Colinear[&quot;CCW = 0 (일직선)&quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        A3[A] --- B3[B] --- C3[C]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    end&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;선분-교차&quot;&gt;선분 교차&lt;/h2&gt;
&lt;p&gt;두 선분 $AB$ 와 $CD$ 가 교차하는지 판정:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; segments_intersect&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; d&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; ccw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a, b, c);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; ccw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a, b, d);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d3 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; ccw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(c, d, a);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d4 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; ccw&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(c, d, b);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (d1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d3 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d4) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // 일반 교차&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // 특수: 한 선분이 다른 선분의 끝점을 지나는 경우&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (d1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; on_segment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a, b, c)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (d2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; on_segment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a, b, d)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (d3 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; on_segment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(c, d, a)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (d4 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; on_segment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(c, d, b)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; false&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; on_segment&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; c&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a.x, b.x) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c.x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c.x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a.x, b.x)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a.y, b.y) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c.y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; c.y &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; max&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(a.y, b.y);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;삼각형다각형-넓이&quot;&gt;삼각형/다각형 넓이&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;삼각형&lt;/strong&gt; $A, B, C$ 의 넓이:&lt;/p&gt;
&lt;p&gt;$$
\text{Area} = \frac{1}{2} \left| (B - A) \times (C - A) \right|
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;다각형&lt;/strong&gt; ([[polygon-area|Shoelace formula]]): 정점 $P_0, P_1, …, P_{n-1}$ 에 대해&lt;/p&gt;
&lt;p&gt;$$
\text{Area} = \frac{1}{2} \left| \sum_{i=0}^{n-1} (x_i y_{i+1} - x_{i+1} y_i) \right|
$$&lt;/p&gt;
&lt;h2 id=&quot;다각형-내부-점-판정&quot;&gt;다각형 내부 점 판정&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Ray casting&lt;/strong&gt;: 점에서 임의 방향으로 반직선을 그어 다각형 변과 몇 번 교차하는지 세기.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;홀수 → 내부&lt;/li&gt;
&lt;li&gt;짝수 → 외부&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;또는 &lt;strong&gt;winding number&lt;/strong&gt;: 모든 변에서 CCW 부호를 세어 총합을 봄. 이쪽이 볼록 다각형에서 더 간단.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;정밀도&lt;/strong&gt;: double 로 외적 계산은 위험. &lt;strong&gt;정수 좌표 → long long&lt;/strong&gt; 이 원칙.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;오버플로&lt;/strong&gt;: 좌표가 $10^9$ 이상이면 곱셈 후 $10^{18}$ 넘을 수 있음. &lt;code&gt;__int128&lt;/code&gt; 또는 좌표 축소.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;일직선 케이스&lt;/strong&gt;: CCW=0 일 때 하위 로직 (on-segment 등) 을 반드시 처리해야 함. 잊으면 교차 판정 등이 오동작.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;각도 비교&lt;/strong&gt;: &lt;code&gt;atan2&lt;/code&gt; 는 double, 정밀도 문제 있음. 정수 좌표에서 각도 정렬은 사분면 + 외적으로 처리.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[polygon-area|Shoelace, 다각형 넓이]]&lt;/li&gt;
&lt;li&gt;관련 [[convex-hull|Convex Hull]] (CCW 로 구현)&lt;/li&gt;
&lt;li&gt;관련 [[rotating-calipers|Rotating Calipers]]&lt;/li&gt;
&lt;li&gt;cp-algorithms: &lt;a href=&quot;https://cp-algorithms.com/geometry/basic-geometry.html&quot;&gt;Basic Geometry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>geometry</category><category>vector</category><category>ccw</category><category>cross-product</category><author>koa (김신건)</author></item><item><title>Golden-section Search: 단봉 함수 최적화</title><link>https://shinkeonkim.com/wiki/algorithm/math/golden-section-search/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/math/golden-section-search/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;단봉 (unimodal) 함수&lt;/strong&gt; 위에서 최소/최대를 찾는 탐색. 이분 탐색을 단봉 함수용으로 확장.&lt;/p&gt;
&lt;h2 id=&quot;삼분-탐색-ternary-search&quot;&gt;삼분 탐색 (Ternary Search)&lt;/h2&gt;
&lt;p&gt;구간 [l, r] 을 세 등분하여 두 내부점 m1 = l + (r-l)/3, m2 = r - (r-l)/3 비교. &lt;strong&gt;불량한 쪽 1/3 을 버림&lt;/strong&gt;. O(log₃ range).&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;double&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; ternary&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;double&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; l&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;double&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; r&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; iter &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; iter &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 200&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; iter&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        double&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; m1 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        double&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; m2 &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 3&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;f&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(m1) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(m2)) r &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; m2;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   // 최대화 가정&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; m1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (l &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; r) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;golden-section&quot;&gt;Golden-section&lt;/h2&gt;
&lt;p&gt;두 내부점을 &lt;strong&gt;황금비&lt;/strong&gt; (φ = (1 + √5) / 2) 로 나누면 매 반복마다 이전 계산 재사용 가능 → 함수 호출 절반.&lt;/p&gt;
&lt;h2 id=&quot;정수-삼분-탐색&quot;&gt;정수 삼분 탐색&lt;/h2&gt;
&lt;p&gt;이산 단봉 함수에서 세 등분 점을 정수화. &lt;code&gt;while (r - l &gt; 2)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[binary-search|이분 탐색]]&lt;/li&gt;
&lt;li&gt;[[convex-hull-trick|Convex Hull Trick]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>math</category><category>search</category><category>optimization</category><author>koa (김신건)</author></item><item><title>Graph DP: 트리/DAG 위 DP</title><link>https://shinkeonkim.com/wiki/algorithm/dp/graph-dp/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/dp/graph-dp/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Graph DP&lt;/strong&gt; 는 그래프 구조를 이용한 DP. 사이클 없는 그래프 (트리, DAG) 에서 특히 자연스러움.&lt;/p&gt;
&lt;h2 id=&quot;tree-dp&quot;&gt;Tree DP&lt;/h2&gt;
&lt;p&gt;루트 트리에서 자식 서브트리 결과를 조합.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; u&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    dp[u] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   // 자기 자신&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v : adj[u]) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (v &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; p) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(v, u);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        dp[u] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; dp[v];&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   // 서브트리 크기 예&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;rerooting-모든-루트-답&quot;&gt;Rerooting (모든 루트 답)&lt;/h2&gt;
&lt;p&gt;Tree DP 는 특정 루트 기준. 모든 정점을 루트로 했을 때의 답이 필요하면 rerooting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;두 번의 DFS&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;임의 루트 r 로 down DP: &lt;code&gt;dp_down[u]&lt;/code&gt; = u 서브트리 정보&lt;/li&gt;
&lt;li&gt;Down 정보 이용 up DP: &lt;code&gt;dp[u]&lt;/code&gt; = u 를 루트로 한 전체 답&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;O(N).&lt;/p&gt;
&lt;h2 id=&quot;dag-dp&quot;&gt;DAG DP&lt;/h2&gt;
&lt;p&gt;DAG 는 [[topological-sorting|위상 정렬]] 후 순서대로 계산.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;longest path&lt;/strong&gt;: &lt;code&gt;dp[v] = max(dp[u] + w) for u -&gt; v&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;path 수 세기&lt;/strong&gt;: &lt;code&gt;dp[v] = sum(dp[u]) for u -&gt; v&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[topological-sorting|Topological Sorting]]&lt;/li&gt;
&lt;li&gt;[[tree-diameter|Tree Diameter]]&lt;/li&gt;
&lt;li&gt;[[dp-bitfield|DP Bitfield]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>dp</category><category>graph</category><category>tree</category><author>koa (김신건)</author></item><item><title>Hamiltonian Path: 모든 정점 한 번씩</title><link>https://shinkeonkim.com/wiki/algorithm/graph/hamiltonian-path/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/graph/hamiltonian-path/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hamiltonian Path&lt;/strong&gt; 는 그래프의 &lt;strong&gt;모든 정점을 정확히 한 번씩&lt;/strong&gt; 방문하는 경로. 시작 = 끝이면 &lt;strong&gt;Hamiltonian Cycle&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;일반 그래프에서 &lt;strong&gt;NP-complete&lt;/strong&gt;. Euler path (모든 간선을 한 번씩) 와 대비: Euler 는 다항 시간.&lt;/p&gt;
&lt;h2 id=&quot;bitmask-dp-n--20&quot;&gt;Bitmask DP (N ≤ 20)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;상태&lt;/strong&gt;: &lt;code&gt;dp[mask][v]&lt;/code&gt; = “방문 집합 = mask, 현재 v” 도달 가능한가.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;dp[&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s][s] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;   // s 에서 시작&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; mask &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; mask &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n); mask&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; u &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; u &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; u&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;dp[mask][u] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; !&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mask &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; u))) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;continue&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v : adj[u])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(mask &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v)))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                dp[mask &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x3C;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v)][v] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; true&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;// 전체 마스크에서 도달 가능한 v 가 있으면 Hamiltonian path 존재&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;시간 O(2^N · N²), 공간 O(2^N · N).&lt;/p&gt;
&lt;h2 id=&quot;관련&quot;&gt;관련&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[tsp|TSP]] (Hamiltonian cycle + 최소 비용)&lt;/li&gt;
&lt;li&gt;[[dp-bitfield|Bitmask DP]]&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[tsp|Traveling Salesman Problem]]&lt;/li&gt;
&lt;li&gt;[[dp-bitfield|DP Bitfield]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>graph</category><category>hamiltonian</category><category>np-hard</category><author>koa (김신건)</author></item><item><title>Hash Table: 해시 기반 딕셔너리</title><link>https://shinkeonkim.com/wiki/algorithm/data-structure/hash-table/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/data-structure/hash-table/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Hash Table&lt;/strong&gt; 은 해시 함수로 키를 배열 인덱스에 매핑하여 &lt;strong&gt;평균 O(1)&lt;/strong&gt; 삽입/탐색/삭제를 제공합니다.&lt;/p&gt;
&lt;h2 id=&quot;충돌-해결&quot;&gt;충돌 해결&lt;/h2&gt;
&lt;h3 id=&quot;chaining&quot;&gt;Chaining&lt;/h3&gt;
&lt;p&gt;각 버킷에 연결 리스트/트리 저장. 최악 O(N).&lt;/p&gt;
&lt;h3 id=&quot;open-addressing&quot;&gt;Open Addressing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Linear probing&lt;/strong&gt;: &lt;code&gt;(h + i) mod m&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Quadratic probing&lt;/strong&gt;: &lt;code&gt;(h + i²) mod m&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Double hashing&lt;/strong&gt;: &lt;code&gt;(h1 + i·h2) mod m&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Load factor ~0.5-0.7 유지, 넘으면 rehash.&lt;/p&gt;
&lt;h2 id=&quot;언어별-구현&quot;&gt;언어별 구현&lt;/h2&gt;



































&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;언어&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;자료형&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;내부&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;C++&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;unordered_map&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;chaining&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Java&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;HashMap&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;chaining + tree (수 많으면)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Python&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;dict&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;open addressing (compact + insertion-ordered)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Go&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;map&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;chaining&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;Rust&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;HashMap&lt;/code&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;SipHash (기본), open addressing&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;최악 O(N)&lt;/strong&gt;: 적대적 입력 대비 랜덤화 해시 (SipHash, aHash)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;iteration 순서&lt;/strong&gt;: Python 3.7+ 는 삽입 순서 보장, 다른 언어는 임의&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[binary-search-tree|BST]] (정렬 필요 시 대체)&lt;/li&gt;
&lt;li&gt;[[bloom-filter|Bloom Filter]] (근사 존재 확인)&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>data-structure</category><category>hash</category><category>map</category><author>koa (김신건)</author></item><item><title>Huffman Coding: 최적 접두 부호</title><link>https://shinkeonkim.com/wiki/algorithm/foundation/huffman-coding/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/foundation/huffman-coding/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Huffman Coding&lt;/strong&gt; 은 문자의 빈도가 주어졌을 때 &lt;strong&gt;평균 부호 길이를 최소화&lt;/strong&gt; 하는 &lt;strong&gt;접두 부호 (prefix code)&lt;/strong&gt; 를 만드는 그리디 알고리즘. David Huffman (1952) 이 MIT 학생 시절 발표.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;접두 부호&lt;/strong&gt;: 어떤 부호도 다른 부호의 접두어가 아님. 구분자 없이 디코딩 가능.&lt;/p&gt;
&lt;h2 id=&quot;알고리즘&quot;&gt;알고리즘&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;각 문자를 리프 노드로 하고 빈도를 우선순위로 하는 &lt;strong&gt;min-heap&lt;/strong&gt; 준비.&lt;/li&gt;
&lt;li&gt;Heap 에서 최소 두 노드를 pop, 두 빈도의 합을 값으로 하는 새 내부 노드 생성 (두 노드를 자식으로).&lt;/li&gt;
&lt;li&gt;새 노드를 heap 에 push.&lt;/li&gt;
&lt;li&gt;Heap 크기가 1 이 될 때까지 반복.&lt;/li&gt;
&lt;li&gt;완성된 트리의 루트에서 각 리프까지의 경로가 부호 (왼쪽=0, 오른쪽=1).&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;#include&lt;/span&gt;&lt;span style=&quot;color:#9ECBFF&quot;&gt; &amp;#x3C;queue&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Node&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ch; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; freq; Node &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;l, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;r; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Cmp&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; operator&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; a&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; b&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a-&gt;freq &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b-&gt;freq; } };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; build&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;char&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; freq&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    priority_queue&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, Cmp&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pq;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;auto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [c, f] : freq) pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Node{c, f, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;nullptr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;nullptr&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; a &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        Node&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; Node{&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, a-&gt;freq &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; b-&gt;freq, a, b});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; pq.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O(N log N) - N 은 문자 종류 수.&lt;/p&gt;
&lt;h2 id=&quot;예시&quot;&gt;예시&lt;/h2&gt;
&lt;p&gt;빈도: &lt;code&gt;a=5, b=9, c=12, d=13, e=16, f=45&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;결과 부호 (평균 길이 ~2.24 bit):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;f: 0&lt;/li&gt;
&lt;li&gt;c: 100&lt;/li&gt;
&lt;li&gt;d: 101&lt;/li&gt;
&lt;li&gt;a: 1100&lt;/li&gt;
&lt;li&gt;b: 1101&lt;/li&gt;
&lt;li&gt;e: 111&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;최적성-증명&quot;&gt;최적성 증명&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Sibling property&lt;/strong&gt;: 같은 부모의 두 자식은 항상 heap 에서 가장 낮은 두 원소. 이 성질이 최적 부호를 그리디하게 유도.&lt;/p&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DEFLATE (gzip, PNG)&lt;/strong&gt;: LZ77 + Huffman&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;JPEG&lt;/strong&gt;: DCT 계수 부호화&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HTTP/2 [[hpack|HPACK]]&lt;/strong&gt;: 헤더 압축에 정적 Huffman table&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MP3&lt;/strong&gt;: 오디오 부호화&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;한계&quot;&gt;한계&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;문자 하나씩&lt;/strong&gt; 부호화. 확률이 극단적 (0.9 인 문자) 이면 손실 큼 → &lt;strong&gt;Arithmetic Coding&lt;/strong&gt; 이 더 최적&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정적 빈도&lt;/strong&gt;: 스트리밍은 &lt;strong&gt;Adaptive Huffman&lt;/strong&gt; 이 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[priority-queue-heap|Priority Queue]]&lt;/li&gt;
&lt;li&gt;관련 [[hpack|HPACK]] (HTTP/2 헤더 압축)&lt;/li&gt;
&lt;li&gt;관련 [[greedy|Greedy]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>foundation</category><category>greedy</category><category>compression</category><category>tree</category><author>koa (김신건)</author></item><item><title>Implicit Treap: 배열 인덱스 기반 Treap</title><link>https://shinkeonkim.com/wiki/algorithm/data-structure/implicit-treap/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/data-structure/implicit-treap/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Implicit Treap&lt;/strong&gt; 은 [[bbst|Treap]] 에서 키 대신 &lt;strong&gt;서브트리 크기 (위치)&lt;/strong&gt; 로 인덱싱하는 변형입니다. 배열의 삽입/삭제/이동/구간 반전 등을 &lt;strong&gt;O(log N)&lt;/strong&gt; 에 지원합니다.&lt;/p&gt;
&lt;h2 id=&quot;특징&quot;&gt;특징&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;split(t, k)&lt;/strong&gt;: k 번째까지 왼쪽, 나머지 오른쪽&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;merge(a, b)&lt;/strong&gt;: 두 배열 이어붙임&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reverse(l, r)&lt;/strong&gt;: 구간 반전 (lazy propagation)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;insert/erase at position&lt;/strong&gt;: O(log N)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;편집기 (rope): 임의 위치 삽입/삭제&lt;/li&gt;
&lt;li&gt;구간 회전, 뒤집기 문제&lt;/li&gt;
&lt;li&gt;LIS 유사 dynamic 문제&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[bbst|Treap]]&lt;/li&gt;
&lt;li&gt;[[binary-search-tree|BST]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>data-structure</category><category>treap</category><author>koa (김신건)</author></item><item><title>Inclusion and Exclusion: 포함배제 원리</title><link>https://shinkeonkim.com/wiki/algorithm/math/inclusion-exclusion/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/math/inclusion-exclusion/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;$$
\left| \bigcup_{i=1}^{n} A_i \right| = \sum \lvert A_i \rvert - \sum \lvert A_i \cap A_j \rvert + \sum \lvert A_i \cap A_j \cap A_k \rvert - \dots
$$&lt;/p&gt;
&lt;p&gt;부호가 교대로 바뀌며 홀수 개 교집합 - 짝수 개 교집합.&lt;/p&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;h3 id=&quot;오일러-phi&quot;&gt;오일러 phi&lt;/h3&gt;
&lt;p&gt;$\varphi(n) = n \prod_{p | n} (1 - 1/p)$ 는 포함배제의 예.&lt;/p&gt;
&lt;h3 id=&quot;mod-카운팅&quot;&gt;mod 카운팅&lt;/h3&gt;
&lt;p&gt;n 이하 중 어느 소수의 배수도 아닌 수의 개수:&lt;/p&gt;
&lt;p&gt;$$
\sum_{S \subseteq {p_1, …, p_k}} (-1)^{|S|} \lfloor n / \prod S \rfloor
$$&lt;/p&gt;
&lt;h3 id=&quot;derangement&quot;&gt;Derangement&lt;/h3&gt;
&lt;p&gt;$D_n = n! \sum_{k=0}^{n} \frac{(-1)^k}{k!}$&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[euler-phi-function|Euler Phi]]&lt;/li&gt;
&lt;li&gt;[[combinatorics|조합론]]&lt;/li&gt;
&lt;li&gt;[[mobius-inversion|Mobius Inversion]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>math</category><category>combinatorics</category><category>mobius</category><author>koa (김신건)</author></item><item><title>Johnson&apos;s Algorithm: sparse APSP</title><link>https://shinkeonkim.com/wiki/algorithm/math/johnsons-algorithm/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/math/johnsons-algorithm/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Johnson’s algorithm&lt;/strong&gt; 은 sparse graph 의 all-pairs shortest paths 를 &lt;strong&gt;O(V·E log V + V²)&lt;/strong&gt; 에 계산. Bellman-Ford + Dijkstra 조합.&lt;/p&gt;
&lt;h2 id=&quot;알고리즘&quot;&gt;알고리즘&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;임시 정점 s 추가, 모든 정점에 가중치 0 간선 연결&lt;/li&gt;
&lt;li&gt;Bellman-Ford 로 h[v] = dist(s, v) 계산&lt;/li&gt;
&lt;li&gt;각 간선 (u, v) 재가중: w’(u, v) = w(u, v) + h[u] - h[v] ≥ 0&lt;/li&gt;
&lt;li&gt;재가중 그래프에서 각 정점을 소스로 Dijkstra 실행&lt;/li&gt;
&lt;li&gt;원래 거리 복원: d(u, v) = d’(u, v) - h[u] + h[v]&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;핵심&lt;/strong&gt;: Bellman-Ford 로 potential 을 만든 뒤 non-negative 재가중, Dijkstra 사용 가능하게 함.&lt;/p&gt;
&lt;h2 id=&quot;복잡도-비교&quot;&gt;복잡도 비교&lt;/h2&gt;

























&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;방법&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;복잡도&lt;/th&gt;&lt;th align=&quot;left&quot;&gt;조건&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Floyd-Warshall&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O(V³)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Any&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Johnson&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O(VE log V)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;negative allowed&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Dijkstra × V&lt;/strong&gt;&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;O(V² log V + VE)&lt;/td&gt;&lt;td align=&quot;left&quot;&gt;non-negative&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Sparse (E = O(V)) 일 때 Johnson 이 Floyd-Warshall 보다 빠름.&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[floyd-warshall|Floyd-Warshall]]&lt;/li&gt;
&lt;li&gt;[[dijkstra|Dijkstra]]&lt;/li&gt;
&lt;li&gt;[[bellman-ford|Bellman-Ford]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>graph</category><category>shortest-path</category><category>apsp</category><author>koa (김신건)</author></item><item><title>Markov Chain: 상태 전이 확률</title><link>https://shinkeonkim.com/wiki/algorithm/foundation/markov-chain/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/foundation/markov-chain/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Markov Chain&lt;/strong&gt; 은 다음 상태가 오직 현재 상태에만 의존하는 확률 과정. &lt;strong&gt;memoryless property&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;전이확률 행렬 P: P[i][j] = P(다음 = j | 현재 = i). 각 행 합 = 1.&lt;/p&gt;
&lt;h2 id=&quot;n-step-전이&quot;&gt;N-step 전이&lt;/h2&gt;
&lt;p&gt;$P^n$ 의 (i, j) 원소 = i 에서 j 로 n 스텝에 도달할 확률.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[[matrix-exponentiation|Matrix Exponentiation]]&lt;/strong&gt; 으로 O(K³ log n) 에 계산.&lt;/p&gt;
&lt;h2 id=&quot;stationary-distribution&quot;&gt;Stationary Distribution&lt;/h2&gt;
&lt;p&gt;π P = π 인 확률벡터 π. &lt;strong&gt;irreducible + aperiodic&lt;/strong&gt; 이면 유일 존재.&lt;/p&gt;
&lt;h2 id=&quot;pagerank&quot;&gt;PageRank&lt;/h2&gt;
&lt;p&gt;웹 페이지 랭킹은 stationary distribution 문제로 환원 (Google, 1998).&lt;/p&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;랜덤 워크 분석&lt;/li&gt;
&lt;li&gt;MCMC (베이지안 추론)&lt;/li&gt;
&lt;li&gt;유전 알고리즘&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[[federated-learning|Federated Learning]]&lt;/strong&gt; 수렴 분석&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[matrix-exponentiation|Matrix Exponentiation]]&lt;/li&gt;
&lt;li&gt;[[expected-value|Expected Value]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>foundation</category><category>probability</category><category>markov</category><author>koa (김신건)</author></item><item><title>Matrix Exponentiation: 선형 점화식 fast</title><link>https://shinkeonkim.com/wiki/algorithm/dp/matrix-exponentiation/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/dp/matrix-exponentiation/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;선형 점화식을 행렬 곱으로 표현한 뒤, &lt;strong&gt;행렬 거듭제곱을 log 시간에&lt;/strong&gt; 계산하여 N 번째 항을 O(K³ log N) 에 얻는 기법. K = 상태 차원.&lt;/p&gt;
&lt;h2 id=&quot;fibonacci-예&quot;&gt;Fibonacci 예&lt;/h2&gt;
&lt;p&gt;$$
\begin{pmatrix} F_{n+1} \ F_n \end{pmatrix} = \begin{pmatrix} 1 &amp;#x26; 1 \ 1 &amp;#x26; 0 \end{pmatrix}^n \begin{pmatrix} F_1 \ F_0 \end{pmatrix}
$$&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;using&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Mat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; =&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MOD &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; +&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 7&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Mat&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; mul&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Mat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; A&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Mat&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; B&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; A.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Mat &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;C&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;(n, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; k &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; k&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (A[i][k])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; j &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; j&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                C[i][j] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (C[i][j] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; A[i][k] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; B[k][j]) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; MOD;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; C;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Mat&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; pow&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;Mat&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; A&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; p&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; A.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    Mat &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;R&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;(n, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n; i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) R[i][i] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (p) { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (p &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) R &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; mul&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(R, A); A &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; mul&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(A, A); p &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; R;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O(K³ log N).&lt;/p&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Fibonacci 를 O(log N)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;그래프 경로 수&lt;/strong&gt;: 인접행렬^k 의 (u, v) 원소 = u→v 길이 k 경로 수&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DFA 상태 전이&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;kitamasa&quot;&gt;Kitamasa&lt;/h2&gt;
&lt;p&gt;일반 K-차 선형 점화식은 [[polynomial-division-kitamasa|Polynomial Division]] 기법으로 &lt;strong&gt;O(K² log N)&lt;/strong&gt; 까지 낮출 수 있음.&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[polynomial-division-kitamasa|Kitamasa]]&lt;/li&gt;
&lt;li&gt;[[fast-power|Fast Power]]&lt;/li&gt;
&lt;li&gt;[[linear-algebra|Linear Algebra]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>dp</category><category>matrix</category><category>linear-recurrence</category><author>koa (김신건)</author></item><item><title>Maximum Flow: Ford-Fulkerson, Edmonds-Karp, Dinic</title><link>https://shinkeonkim.com/wiki/algorithm/graph/maximum-flow/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/graph/maximum-flow/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Maximum Flow (최대 유량)&lt;/strong&gt; 문제는 방향 그래프 $G = (V, E)$ 와 소스 $s$, 싱크 $t$ 가 주어졌을 때, &lt;strong&gt;각 간선의 용량 제약&lt;/strong&gt; 아래에서 $s$ 에서 $t$ 로 흘려보낼 수 있는 유량의 최댓값을 찾는 문제입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;간선 용량&lt;/strong&gt; $c(u, v) \geq 0$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;유량 보존&lt;/strong&gt;: 중간 정점 $v$ 는 $\sum_u f(u, v) = \sum_w f(v, w)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;용량 제약&lt;/strong&gt;: $0 \leq f(u, v) \leq c(u, v)$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;목표&lt;/strong&gt;: $|f| = \sum_v f(s, v)$ 최대화&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;응용-매우-광범위&quot;&gt;응용 (매우 광범위)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;매칭&lt;/strong&gt;: 이분 매칭 → 최대 유량으로 환원&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;분리&lt;/strong&gt;: 최소 컷 = 최대 유량 (max-flow min-cut)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;project selection, image segmentation, baseball elimination&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;k-connectivity, edge disjoint paths&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Max Flow 로 환원되는 문제는 놀랄 만큼 많습니다.&lt;/strong&gt; 문제에서 “동시에 다녀야 한다”, “어느 하나만 선택”, “그룹 분리” 등의 힌트가 있으면 유량 화합을 의심.&lt;/p&gt;
&lt;h2 id=&quot;핵심-개념&quot;&gt;핵심 개념&lt;/h2&gt;
&lt;h3 id=&quot;residual-graph-잔여-그래프&quot;&gt;Residual Graph (잔여 그래프)&lt;/h3&gt;
&lt;p&gt;핵심 트릭. 유량 $f$ 가 흐르고 있을 때, &lt;strong&gt;잔여 용량&lt;/strong&gt; $c_f(u, v) = c(u, v) - f(u, v)$ + &lt;strong&gt;역방향 취소 간선&lt;/strong&gt; $c_f(v, u) = f(u, v)$.&lt;/p&gt;
&lt;p&gt;역방향 간선의 의미: &lt;strong&gt;이미 흘린 유량을 취소&lt;/strong&gt; 하고 다른 경로로 재배치할 수 있게 하는 것. 이것 없으면 그리디 (첫 경로가 최선인 척) 가 최적을 놓칠 수 있습니다.&lt;/p&gt;
&lt;h3 id=&quot;augmenting-path-증가-경로&quot;&gt;Augmenting Path (증가 경로)&lt;/h3&gt;
&lt;p&gt;잔여 그래프에서 $s \to t$ 로 가는 경로. 그 경로의 최소 잔여 용량만큼 유량을 흘려보낼 수 있습니다.&lt;/p&gt;
&lt;h3 id=&quot;max-flow-min-cut-정리&quot;&gt;Max-Flow Min-Cut 정리&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;최대 유량 = 최소 컷 용량&lt;/strong&gt;. Ford &amp;#x26; Fulkerson 1956.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;s-t 컷&lt;/strong&gt; $(S, T)$: $s \in S, t \in T$ 로 정점을 두 집합으로 분할&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;컷 용량&lt;/strong&gt; = $\sum_{u \in S, v \in T} c(u, v)$&lt;/li&gt;
&lt;li&gt;최소 컷의 용량 = 최대 유량&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 대응이 유량 알고리즘의 이론적 근간이며, 최소 컷을 구할 때도 max-flow 알고리즘을 그대로 씁니다.&lt;/p&gt;
&lt;h2 id=&quot;ford-fulkerson-일반-프레임워크&quot;&gt;Ford-Fulkerson (일반 프레임워크)&lt;/h2&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;f ← 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;while (잔여 그래프에서 s→t 경로 P 존재):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    Δ ← min(c_f(u,v) for (u,v) in P)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;    P 를 따라 f 를 Δ 만큼 증가&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span&gt;return |f|&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;경로 선택 방식&lt;/strong&gt; 에 따라 알고리즘이 달라집니다.&lt;/p&gt;
&lt;h3 id=&quot;유리수-용량-무한-루프-위험&quot;&gt;유리수 용량, 무한 루프 위험&lt;/h3&gt;
&lt;p&gt;임의로 경로를 선택하면 &lt;strong&gt;비유리수 용량에서는 종료가 보장되지 않습니다&lt;/strong&gt;. 따라서 실무에서는 항상 정수 (또는 유리수) 용량이라고 가정합니다.&lt;/p&gt;
&lt;h2 id=&quot;edmonds-karp&quot;&gt;Edmonds-Karp&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;BFS 로 shortest augmenting path&lt;/strong&gt; (간선 수 기준) 를 선택.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;시간 복잡도&lt;/strong&gt;: $O(V \cdot E^2)$&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;const&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; INF &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;e&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                      // 정점 수&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; capacity;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // capacity[u][v]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; adj;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // 양방향 저장 (역방향 잔여 간선 위해)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; t&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; parent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    fill&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(parent.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), parent.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    parent[s] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    queue&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;pair&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; q;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({s, INF});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;empty&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        auto&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; [cur, flow] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;front&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; next : adj[cur]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (parent[next] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; -&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; capacity[cur][next] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                parent[next] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; new_flow &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(flow, capacity[cur][next]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (next &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; new_flow;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({next, new_flow});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; max_flow&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; t&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; flow &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; parent&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; new_flow;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ((new_flow &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s, t, parent))) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        flow &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; new_flow;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cur &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (cur &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; s) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; prev &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; parent[cur];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            capacity[prev][cur] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; new_flow;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            capacity[cur][prev] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; new_flow;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            cur &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; prev;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; flow;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;dinic&quot;&gt;Dinic&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;BFS 로 level graph 만들고, DFS 로 blocking flow&lt;/strong&gt; 를 여러 개 한꺼번에 밀어넣기. Edmonds-Karp 보다 훨씬 빠릅니다.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;시간 복잡도&lt;/strong&gt;: $O(V^2 \cdot E)$. 단, &lt;strong&gt;이분 그래프에서는 $O(E \sqrt V)$&lt;/strong&gt; (Hopcroft-Karp 계열).&lt;/p&gt;
&lt;p&gt;경쟁 프로그래밍에서는 사실상 표준 max-flow 알고리즘.&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Dinic&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    struct&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; Edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; { &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; to, rev; &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; cap; };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;Edge&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; g;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; level, iter;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; n;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;    Dinic&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) : &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n), &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;g&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n), &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;level&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n), &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;iter&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(n) {}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; add_edge&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; from&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; to&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; cap&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        g[from].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({to, (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)g[to].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), cap});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        g[to].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;({from, (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)g[from].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;});&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    bool&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; bfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;        fill&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(level.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), level.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        queue&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; q;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        level[s] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;; q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;empty&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; v &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;front&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;auto&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; e : g[v]) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (e.cap &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; level[e.to] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                level[e.to] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; level[v] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                q.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(e.to);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; level[n &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;  // t 도달 가능?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; v&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; t&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; f&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (v &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; t) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; f;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        for&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; iter[v]; i &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;)g[v].&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); i&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;++&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            Edge&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; e &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; g[v][i];&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (e.cap &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; &amp;#x26;&amp;#x26;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; level[v] &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; level[e.to]) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(e.to, t, &lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;min&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(f, e.cap));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (d &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    e.cap &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;-=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                    g[e.to][e.rev].cap &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;                    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; d;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; max_flow&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; s&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; t&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; flow &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;bfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s)) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;            fill&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(iter.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;begin&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), iter.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;end&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            long&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt; long&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; f;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;            while&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; ((f &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; dfs&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(s, t, LLONG_MAX)) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) flow &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; f;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;        return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; flow;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&quot;push-relabel-preflow-push&quot;&gt;Push-Relabel (Preflow-Push)&lt;/h2&gt;
&lt;p&gt;Goldberg &amp;#x26; Tarjan 1988. 개념이 다름: &lt;strong&gt;preflow (유량 보존 위반 허용) 를 만든 뒤 넘치는 곳을 relabel + push 로 해결&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;최악 $O(V^2 \sqrt E)$&lt;/li&gt;
&lt;li&gt;상수가 크지만 매우 큰 그래프에서 유리&lt;/li&gt;
&lt;li&gt;병렬화 가능&lt;/li&gt;
&lt;li&gt;경쟁 프로그래밍에서는 Dinic 이 대부분 충분해서 잘 안 씀&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;이분-매칭&quot;&gt;이분 매칭&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;이분 그래프 최대 매칭 = max-flow&lt;/strong&gt; 로 환원 가능:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;소스 $s$ 를 왼쪽 정점 그룹에 용량 1 로 연결&lt;/li&gt;
&lt;li&gt;오른쪽 정점 그룹을 싱크 $t$ 에 용량 1 로 연결&lt;/li&gt;
&lt;li&gt;원래 이분 그래프 간선을 용량 1 로 유지&lt;/li&gt;
&lt;li&gt;Max-flow 구하기 = 매칭 크기&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Hopcroft-Karp 는 이 특수 케이스에서 $O(E \sqrt V)$ 로 개선한 것.&lt;/p&gt;
&lt;h2 id=&quot;min-cost-max-flow-mcmf&quot;&gt;Min Cost Max Flow (MCMF)&lt;/h2&gt;
&lt;p&gt;간선에 &lt;strong&gt;cost&lt;/strong&gt; 도 있고, 최대 유량을 흘리되 &lt;strong&gt;최소 비용&lt;/strong&gt;. SPFA 기반 (Bellman-Ford 변형) 또는 potential + Dijkstra 로 구현.&lt;/p&gt;
&lt;p&gt;응용: assignment problem, transportation problem, 여러 자원 할당.&lt;/p&gt;
&lt;h2 id=&quot;함정&quot;&gt;함정&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;역방향 간선 잊음&lt;/strong&gt;: 잔여 그래프의 핵심. 없으면 그리디처럼 잘못된 답.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;간선 리스트 저장 (양방향)&lt;/strong&gt;: &lt;code&gt;add_edge&lt;/code&gt; 는 정방향 + 역방향 (용량 0) 두 개를 추가. 페어 관리를 위해 rev index 저장.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;정수 오버플로&lt;/strong&gt;: 큰 용량 문제는 &lt;code&gt;long long&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;음수 용량&lt;/strong&gt;: 정의상 없어야 함. 있으면 그래프 모델링 오류.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;자기 루프&lt;/strong&gt;: 유량 0 으로 안전. 하지만 코드 상 처리 필요.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;관련 [[bipartite-matching|이분 매칭]]&lt;/li&gt;
&lt;li&gt;관련 [[mcmf|Min Cost Max Flow]]&lt;/li&gt;
&lt;li&gt;관련 [[shortest-path|Shortest Path]] (Bellman-Ford / SPFA 는 MCMF 에 사용)&lt;/li&gt;
&lt;li&gt;cp-algorithms: &lt;a href=&quot;https://cp-algorithms.com/graph/dinic.html&quot;&gt;Dinic&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;CLRS Ch 26&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>graph</category><category>network-flow</category><category>max-flow</category><author>koa (김신건)</author></item><item><title>Median of Stream: 두 힙으로 중앙값 유지</title><link>https://shinkeonkim.com/wiki/algorithm/data-structure/median-of-stream/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/data-structure/median-of-stream/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;스트림으로 들어오는 정수의 &lt;strong&gt;중앙값을 O(log N)&lt;/strong&gt; 에 유지하는 문제.&lt;/p&gt;
&lt;h2 id=&quot;두-힙-트릭&quot;&gt;두 힙 트릭&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Max-heap &lt;code&gt;L&lt;/code&gt;&lt;/strong&gt;: 아래 절반&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Min-heap &lt;code&gt;R&lt;/code&gt;&lt;/strong&gt;: 위 절반&lt;/li&gt;
&lt;li&gt;크기 차 &amp;#x3C;= 1 유지, &lt;code&gt;top(L) &amp;#x3C;= top(R)&lt;/code&gt; 유지&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;cpp&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;priority_queue&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; L;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;                              // max-heap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;priority_queue&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, vector&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;int&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;, greater&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; R;&lt;/span&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;      // min-heap&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;void&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; add&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color:#FFAB70&quot;&gt; x&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;empty&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; x &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&amp;#x3C;=&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(x);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    else&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; R.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(x);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#6A737D&quot;&gt;    // 균형&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; R.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 1&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;) { R.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()); L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (R.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;())     { L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(R.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()); R.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;pop&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;(); }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;double&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt; median&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    if&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;&gt;&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; R.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#F97583&quot;&gt;    return&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; (L.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt; R.&lt;/span&gt;&lt;span style=&quot;color:#B392F0&quot;&gt;top&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;()) &lt;/span&gt;&lt;span style=&quot;color:#F97583&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color:#79B8FF&quot;&gt; 2.0&lt;/span&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;line&quot;&gt;&lt;span style=&quot;color:#E1E4E8&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;O(log N) per add, O(1) query.&lt;/p&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[priority-queue-heap|Priority Queue / Heap]]&lt;/li&gt;
&lt;li&gt;[[top-k-selection|Top K]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>data-structure</category><category>heap</category><category>streaming</category><author>koa (김신건)</author></item><item><title>Minimum Vertex Cover: 최소 정점 덮개</title><link>https://shinkeonkim.com/wiki/algorithm/graph/minimum-vertex-cover/</link><guid isPermaLink="true">https://shinkeonkim.com/wiki/algorithm/graph/minimum-vertex-cover/</guid><pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;정의&quot;&gt;정의&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Vertex Cover&lt;/strong&gt; 는 그래프의 모든 간선이 최소 한 정점을 포함하도록 하는 정점 집합. 최소 크기의 vertex cover 를 찾는 문제.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;일반 그래프&lt;/strong&gt;: NP-hard&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;이분 그래프&lt;/strong&gt;: &lt;strong&gt;König’s Theorem&lt;/strong&gt; 으로 최대 매칭 = 최소 정점 덮개, [[bipartite-matching|이분 매칭]] 으로 다항 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;königs-theorem-이분-그래프&quot;&gt;König’s Theorem (이분 그래프)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;|최소 vertex cover| = |최대 매칭|&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;증명: 최대 매칭 M 을 구한 뒤, 다음처럼 vertex cover 구성.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;왼쪽에서 M 에 안 걸린 정점 U 부터 alternating BFS&lt;/li&gt;
&lt;li&gt;방문된 왼쪽 정점 L’ 과 방문된 오른쪽 정점 R’ 관찰&lt;/li&gt;
&lt;li&gt;Vertex cover = (왼쪽 \ L’) ∪ R’&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;응용&quot;&gt;응용&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;최대 독립 집합&lt;/strong&gt; = V \ 최소 vertex cover&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;최소 경로 덮개&lt;/strong&gt; (DAG)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[[bipartite-matching|이분 매칭]]&lt;/li&gt;
&lt;li&gt;[[maximum-flow|Maximum Flow]]&lt;/li&gt;
&lt;/ul&gt;</content:encoded><category>algorithm</category><category>graph</category><category>cover</category><category>np-hard</category><author>koa (김신건)</author></item></channel></rss>