<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://nox-katena.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://nox-katena.github.io/" rel="alternate" type="text/html" /><updated>2025-03-16T22:04:49+09:00</updated><id>https://nox-katena.github.io/feed.xml</id><title type="html">seonah@nox.katena</title><subtitle>&lt;a href=&quot;https://github.com/nox-katena&quot;&gt;
  &lt;i class=&quot;fa-brands fa-github&quot;&gt;&lt;/i&gt;
&lt;/a&gt;
&lt;a href=&quot;https://codeforces.com/profile/Starchasm_Nyx&quot;&gt;
  &lt;i class=&quot;fa-solid fa-chart-bar&quot;&gt;&lt;/i&gt;
&lt;/a&gt;
&lt;br /&gt;
PS 블로그, 가끔 일상
&lt;br/&gt;
</subtitle><entry><title type="html">Solutions to Problems I Authored</title><link href="https://nox-katena.github.io/2024/10/04/my-problems/" rel="alternate" type="text/html" title="Solutions to Problems I Authored" /><published>2024-10-04T00:00:00+09:00</published><updated>2024-10-04T00:00:00+09:00</updated><id>https://nox-katena.github.io/2024/10/04/my-problems</id><content type="html" xml:base="https://nox-katena.github.io/2024/10/04/my-problems/"><![CDATA[<p>Solution sketches to problems I authored. Will keep updating with more problems. All solutions are in English. Problem statements may not be in English. (Last Updated : 2024-10-04)</p>

<h2 id="30872-hanyang-cherry-picking-contest">/&lt;30872&gt; Hanyang Cherry Picking Contest</h2>

<ul>
  <li>Link : https://www.acmicpc.net/problem/30872</li>
  <li>Intended Difficulty : <span style="color:#27E2A4">Platinum III</span></li>
  <li>Source : 10th HCPC (Beginner Division Problem E)</li>
</ul>

<p>Co-authored with hibye1217.</p>

<h4 id="solution-tree-dp--game-theory">Solution (Tree DP + Game Theory)</h4>

<p>Let’s denote Sehun’s score as $S$ and Cheolmin’s score as $C$. Then we can define the total score of the game as $S - C$. Sehun’s goal is to maximize this score while Cheolmin’s goal is to minimize this score. For now let’s call this score $T$.</p>

<p>Now let’s make some observations about the game.</p>

<ol>
  <li>Once you enter a node $v$, you cannot leave the subtree rooted at $v$ until all nodes in the subtree are taken.</li>
  <li>Since you take one node a turn, who the next player after the players exit the subtree rooted at $v$ depends on whether the number of nodes in the subtree is even or odd.</li>
</ol>

<p>Based on the observations, we can think about saving the following information about each subtree.</p>

<ul>
  <li>$T_v$ : The score of the game considering only the subtree rooted at $v$.</li>
  <li>$C_v$ : The number of nodes in the subtree rooted at $v$.</li>
</ul>

<p>Both of these values can be calculated using dynamic programming.</p>

<p>Now let’s think of the optimal strategy. First, the game always begins with Sehun taking the root. Now, Cheolmin wants to take the nodes with maximum score while maintaining his turn. That is, all children whose $T_w \ge 0$ and $C_w \equiv 0 \mod 2$.</p>

<p>After this, Cheolmin and Sehun will take turns taking the children with maximum $S_w$ whose $C_w$ value is odd.</p>

<p>The player who receives the turn at the end of the above process will take all children whose $T_w &lt; 0$ and $C_w \equiv 0 \mod 2$.</p>

<p>The winner is then decided on whether $T_1$ is positive or negative.</p>

<h2 id="30879-i-wonder-whats-for-dinner">/&lt;30879&gt; I Wonder What’s for Dinner…</h2>

<ul>
  <li>Link : https://www.acmicpc.net/problem/30879</li>
  <li>Intended Difficulty : <span style="color:#27E2A4">Platinum III</span></li>
  <li>Source : 10th HCPC (Advanced Division Problem B)</li>
</ul>

<h4 id="solution-2-sat--binary-search">Solution (2-SAT + Binary Search)</h4>

<p>Fancy way of calling this problem would be “Offline Incremental 2-Satisfiability” maybe.</p>

<p>If a query of type 2 was only given at the end, then it’s easy to see that the problem is solvable with 2-SAT.</p>

<p>Let’s define $chk(x)$ to be a boolean function which returns whether or not the answer to a query of type 2 would be “YES” or “NO” after processing the first $x$ queries.</p>

<p>We can notice that there exists some $v$ such that $chk(v)$ is $\texttt{true}$ but $chk(v + 1)$ is $\texttt{false}$ and for all $u$ such that $u \ge v + 1$, $chk(u)$ is $\texttt{false}$.</p>

<p>This is because we are dealing with only clause additions. Thus, there exists some point in time where we added a clause and it caused the boolean expression to be unsatisfiable.</p>

<p>Again, since we are only dealing with addition, the answer to type 2 queries will not change after that.</p>

<p>If we store all queries first and process them offline, we can think about finding $v$ using binary search. Since 2-SAT is solvable in linear time and binary search is $logN$, the total time complexity is something around $NlogN$.</p>

<p>Also, if anyone knows an <strong>online solution</strong> or an <strong>offline fully dynamic version</strong> of this problem please do reach out. I initially wanted to set it as the “Hard version” of this problem but failed to solve it efficiently.</p>

<h2 id="30885-φ">/&lt;30885&gt; Φ²</h2>

<ul>
  <li>Link : https://www.acmicpc.net/problem/30885</li>
  <li>Intended Difficulty : <span style="color:#D28500">Gold V</span></li>
  <li>Source : 10th HCPC (Advanced Division Problem J)</li>
</ul>

<h4 id="solution-data-structures-simulation">Solution (Data Structures, Simulation)</h4>

<p>Simply simulate the given problem using an efficient enough data structure. Here, I will introduce a linked list solution and why it looks like it would be quadratic or $NlogN$ but is actually $N$.</p>

<p>Store the sizes of the microorganisms in a linked list. Until the size of the linked list is $1$, iterate through the linked list and if the current element is larger than its neighbors, remove them from the list. Removal from a linked list if you know the position is $\mathcal{O}(1)$.</p>

<p>The key observation here is that for a pair of adjacent microorganisms, one must end up absorbing the other. What this guarantees is that the size of the list reduces by half each run.</p>

<p>If you’ve come this far you should be able to solve the problem with the conclusion that the time complexity is somewhere around $NlogN$. However, the true time complexity is lower than this.</p>

<p>Again, notice that the size of the list reduces by half each run. Since the time complexity of the run is proportional to the size of the list as we iterate through each remaining element, the time complexity would be $N + \frac{N}{2} + \frac{N}{4} + \dots$</p>

<p>Using the formula for infinite geometric series,</p>

\[N + \frac{N}{2} + \frac{N}{4} + \dots = N\frac{1}{1-\frac{1}{2}} = 2N\]

<p>Thus, the time complexity is bound by $2N$ and thus $\mathcal{O}(N)$.</p>]]></content><author><name></name></author><category term="Baekjoon Online Judge" /><category term="Project PS" /><summary type="html"><![CDATA[Solution sketches to problems I authored. Will keep updating with more problems. All solutions are in English. Problem statements may not be in English. (Last Updated : 2024-10-04)]]></summary></entry><entry><title type="html">/&amp;lt;31430&amp;gt; A+B - 투 스텝</title><link href="https://nox-katena.github.io/2024/08/30/boj-31430/" rel="alternate" type="text/html" title="/&amp;lt;31430&amp;gt; A+B - 투 스텝" /><published>2024-08-30T00:00:00+09:00</published><updated>2024-08-30T00:00:00+09:00</updated><id>https://nox-katena.github.io/2024/08/30/boj-31430</id><content type="html" xml:base="https://nox-katena.github.io/2024/08/30/boj-31430/"><![CDATA[<h2 id="문제"><a href="https://www.acmicpc.net/problem/31430">문제</a></h2>

<p>A와 B가 주어지면 A+B를 구해야 한다. 다만 이 문제는 투 스텝 문제이다. 즉 프로그램이 두번 실행되는데 첫 번째 실행에는 길이가 13인 문자열을 출력해야 하고 이 문자열이 두 번째 실행의 입력으로 주어질 때 두 번째 실행에 A+B의 값을 구해야 한다.</p>

<h2 id="풀이">풀이</h2>

<p>풀이 자체는 알고 보면 단순하지만 떠올리기 직관적이지 않을 수는 있다. 길이가 13이라는 점, 그리고 소문자 알파멧으로만 구성된 문자열을 만들 수 있음에 주목해보자. 뭔가 굉장히 인위적인 설정 같지 않은가?</p>

<p>문자열에서 수를 찾는다니 뭔가 16진수가 생각이 난다 (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F). 이걸 처음부터 알파벳만 써서 A, B, … , O, P로 표현하면 안될까? 아쉽게도 $16^{13} - 1$ 은 $4.5 \times 10^{15}$ 언저리라 부족하다.</p>

<p>음? 하지만 이렇게 할거라면 26가지 문자를 전부 써서 26진법을 만든다면 어떨까? 마침 $26^{13} - 1$ 은 $2 \times 10^{18}$보다 커서 A+B의 답으로 가능한 수 범위를 전부 표현 가능하다.</p>

<p>그렇다면 첫 번째 실행에는 A+B를 계산한 결과를 26진수로 변환, 두 번째 실행에는 입력받은 26진수를 10진수로 변환하면 끝날것임을 알 수 있다! 바로 짜보도록 하자.</p>

<h2 id="코드-c">코드 (C++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">using</span> <span class="n">ll</span> <span class="o">=</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">;</span>
<span class="kt">void</span> <span class="nf">s1</span><span class="p">(){</span>
    <span class="n">ll</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">A</span> <span class="o">&gt;&gt;</span> <span class="n">B</span><span class="p">;</span>
    <span class="n">A</span> <span class="o">+=</span> <span class="n">B</span><span class="p">;</span>
    <span class="n">string</span> <span class="n">ret</span><span class="o">=</span><span class="s">""</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">13</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">ret</span> <span class="o">+=</span> <span class="sc">'a'</span> <span class="o">+</span> <span class="n">A</span> <span class="o">%</span> <span class="mi">26</span><span class="p">;</span>
        <span class="n">A</span> <span class="o">/=</span> <span class="mi">26</span><span class="p">;</span>
    <span class="p">}</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ret</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">s2</span><span class="p">(){</span>
    <span class="n">string</span> <span class="n">ret</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">ret</span><span class="p">;</span>
    <span class="n">ll</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">ll</span> <span class="n">p26</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">13</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">res</span> <span class="o">+=</span> <span class="p">(</span><span class="n">ret</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="sc">'a'</span><span class="p">)</span><span class="o">*</span><span class="n">p26</span><span class="p">;</span>
        <span class="n">p26</span> <span class="o">*=</span> <span class="mi">26</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">res</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="kt">int</span> <span class="n">T</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">T</span><span class="p">;</span>
    <span class="k">if</span><span class="p">(</span><span class="n">T</span><span class="o">==</span><span class="mi">1</span><span class="p">)</span> <span class="n">s1</span><span class="p">();</span>
    <span class="k">else</span> <span class="n">s2</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>폰 코딩으로 풀어서 평소에 쓰는 템플릿 없이 굉장히 깔끔하다.</p>]]></content><author><name></name></author><category term="Math" /><category term="String" /><category term="Baekjoon Online Judge" /><summary type="html"><![CDATA[문제]]></summary></entry><entry><title type="html">Atcoder Beginner Contest 366 Review</title><link href="https://nox-katena.github.io/2024/08/11/abc-366/" rel="alternate" type="text/html" title="Atcoder Beginner Contest 366 Review" /><published>2024-08-11T00:00:00+09:00</published><updated>2024-08-11T00:00:00+09:00</updated><id>https://nox-katena.github.io/2024/08/11/abc-366</id><content type="html" xml:base="https://nox-katena.github.io/2024/08/11/abc-366/"><![CDATA[<p><img src="https://raw.githubusercontent.com/nox-katena/nox-katena.github.io/gh-pages/_images/abc366/result.png" alt="Atcoder" /></p>

<p>Finally reached mint on Atcoder. :blobthumbsup:</p>

<p>Solved A to E, won’t go over F and G because I haven’t upsolved them yet. The problems up to E felt easy but slightly tricky to implement overall. I solved E fairly quickly but getting 3x penalty on B was a bit painful and made me drop a lot in ranking later.</p>

<h2 id="soutions">Soutions</h2>

<h3 id="a---election-2">A - Election 2</h3>

<p>Just check if either of $T$ or $A$ is greater than or equal to $\lfloor \frac{N+1}{2} \rfloor$</p>

<h3 id="b---vertical-writing">B - Vertical Writing</h3>

<p>Just do what the question asks you… except what the questions asks you to do is a bit tricky to understand and implement at first.</p>

<p>I converted the strings to a 2D array of characters and flipped the row and column while padding the result such that if the length of the longest string converted so far was $mx$, the current string is padded with ‘*’ up to length $mx$. Refer to the code below.</p>

<h3 id="c---balls-and-bag-query">C - Balls and Bag Query</h3>

<p>Maintain a count of each unique element, as well as the number of unique elements initialized to $0$. When an element is added, if the count was $0$, add $1$ to the number of unique elements. When an element is removed, and it causes the count to hit $0$, remove $1$ from the number of unique elments.</p>

<p>I used a map but you can use the fact that the range of $x$ values is small $(\le 10^6)$ and use an array instead.</p>

<h3 id="d---cuboid-sum-query">D - Cuboid Sum Query</h3>

<p>Prefix sums expanded to 3D. Except I was too lazy to actually implement it so I just used the multi-dimensional segtree template from our teamnote…</p>

<h3 id="e---manhattan-multifocal-ellipse">E - Manhattan Multifocal Ellipse</h3>

<p>Notice that the Manhattan distance is the sum of difference of $x$ and $y$ coordinates. This allows us to think of them separately.</p>

<p>For all $x_i$ smaller than or equal to a certain $x$, the difference is $x - x_i$ and for all $x_i$ larger than a certain $x$, the difference is $x_i - x$. Thus if we sort the given $x$ coordinates and calculate the prefix sum of their values, we can query for the sum of differences of $x_i$ for any given $x$ in $\mathcal{O}(log N)$ time. The same applies for the $y$ coordinates.</p>

<p>Combining this with the fact that the constraints for $D$ is small, we can iterate over a large enough range of $x$ values and $y$ values to find all “possible candidates” of $x$ and $y$ separately. (That is, $x$ and $y$ values whose sum of differences of $x$, $y$ coordinates is $\le D$) Notice that we have already calculated the sum of differences.</p>

<p>Then, for each $x$ candidate, we can find the number of possible $y$ candidates by simply binary searching on the sum of differences. Summing up the result for each $x$ will give us the answer. (Find the number of $y$ coordinates whose sum of differences is $\le \sum^{N}_{i=1}(x-x_i)$)</p>

<p>Initially, I mistakenly tried binary searching for the range of possible $y$ values for each $x$. I am not sure if this is entirely wrong, but I binary searched the interval separately for positive $y$ and negative $y$ incorrectly assuming the result would be monotone.</p>

<h2 id="code-c">Code (C++)</h2>

<h3 id="a-">A :</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">N</span><span class="p">,</span> <span class="n">T</span><span class="p">,</span> <span class="n">A</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span> <span class="o">&gt;&gt;</span> <span class="n">T</span> <span class="o">&gt;&gt;</span> <span class="n">A</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="n">T</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="n">N</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">||</span> <span class="n">A</span> <span class="o">&gt;=</span> <span class="p">(</span><span class="n">N</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Yes"</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"No"</span><span class="p">;</span>
</code></pre></div></div>

<h3 id="b-">B :</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">char</span> <span class="n">a</span><span class="p">[</span><span class="mi">105</span><span class="p">][</span><span class="mi">105</span><span class="p">];</span>
<span class="kt">char</span> <span class="n">b</span><span class="p">[</span><span class="mi">105</span><span class="p">][</span><span class="mi">105</span><span class="p">];</span>
<span class="n">string</span> <span class="n">s</span><span class="p">[</span><span class="mi">105</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">def</span><span class="p">[</span><span class="mi">105</span><span class="p">];</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cout</span><span class="p">.</span><span class="n">setf</span><span class="p">(</span><span class="n">ios</span><span class="o">::</span><span class="n">fixed</span><span class="p">);</span> <span class="n">cout</span><span class="p">.</span><span class="n">precision</span><span class="p">(</span><span class="n">PRECISION</span><span class="p">);</span>

    <span class="kt">int</span> <span class="n">N</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">();</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">];</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="n">mx</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">();</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">b</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">N</span><span class="o">-</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">];</span>
        <span class="p">}</span>
        <span class="n">mx</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">mx</span><span class="p">,</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">());</span>
        <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;</span> <span class="n">mx</span><span class="p">)</span> <span class="p">{</span>
                <span class="kt">int</span> <span class="n">target</span> <span class="o">=</span> <span class="n">mx</span><span class="p">;</span>
                <span class="c1">// cout &lt;&lt; i &lt;&lt; ' ' &lt;&lt; target &lt;&lt; endl;</span>
                <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="n">target</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">k</span><span class="o">&gt;=</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">();</span> <span class="n">k</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
                    <span class="n">b</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">N</span><span class="o">-</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="sc">'*'</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span> 
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">mx</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="mi">105</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">if</span><span class="p">(</span><span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">])</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span>
        <span class="p">}</span> 
        <span class="k">if</span><span class="p">(</span><span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span> <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="c-">C :</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cout</span><span class="p">.</span><span class="n">setf</span><span class="p">(</span><span class="n">ios</span><span class="o">::</span><span class="n">fixed</span><span class="p">);</span> <span class="n">cout</span><span class="p">.</span><span class="n">precision</span><span class="p">(</span><span class="n">PRECISION</span><span class="p">);</span>

    <span class="n">map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span><span class="n">mp</span><span class="p">;</span> <span class="kt">int</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">Q</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">Q</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">Q</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">q</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">q</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">q</span>  <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
            <span class="kt">int</span> <span class="n">x</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">x</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">mp</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="p">{</span>
                <span class="n">cnt</span><span class="o">++</span><span class="p">;</span>
                <span class="n">mp</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span> <span class="k">else</span> <span class="n">mp</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">if</span><span class="p">(</span><span class="n">q</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
            <span class="kt">int</span> <span class="n">x</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">x</span><span class="p">;</span>
            <span class="n">mp</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">--</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">mp</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">cnt</span><span class="o">--</span><span class="p">;</span>
        <span class="p">}</span> <span class="k">if</span><span class="p">(</span><span class="n">q</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">cout</span> <span class="o">&lt;&lt;</span>  <span class="n">cnt</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span> 
<span class="p">}</span>
</code></pre></div></div>

<h3 id="d-">D :</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="p">,</span> <span class="kt">int</span><span class="p">...</span> <span class="n">Ns</span><span class="p">&gt;</span> <span class="k">struct</span> <span class="nc">BIT</span> <span class="p">{</span>
	<span class="n">T</span> <span class="n">val</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="kt">void</span> <span class="n">upd</span><span class="p">(</span><span class="n">T</span> <span class="n">v</span><span class="p">)</span> <span class="p">{</span> <span class="n">val</span> <span class="o">+=</span> <span class="n">v</span><span class="p">;</span> <span class="p">}</span>
	<span class="n">T</span> <span class="n">query</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">val</span><span class="p">;</span> <span class="p">}</span>
<span class="p">};</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="k">class</span> <span class="nc">T</span><span class="p">,</span> <span class="kt">int</span> <span class="n">N</span><span class="p">,</span> <span class="kt">int</span><span class="p">...</span> <span class="n">Ns</span><span class="p">&gt;</span> <span class="k">struct</span> <span class="nc">BIT</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">N</span><span class="p">,</span> <span class="n">Ns</span><span class="p">...</span><span class="o">&gt;</span> <span class="p">{</span>
	<span class="n">BIT</span><span class="o">&lt;</span><span class="n">T</span><span class="p">,</span> <span class="n">Ns</span><span class="p">...</span><span class="o">&gt;</span> <span class="n">bit</span><span class="p">[</span><span class="n">N</span> <span class="o">+</span> <span class="mi">1</span><span class="p">];</span>
	<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span> <span class="kt">void</span> <span class="n">upd</span><span class="p">(</span><span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="n">Args</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">for</span> <span class="p">(;</span> <span class="n">pos</span> <span class="o">&lt;=</span> <span class="n">N</span><span class="p">;</span> <span class="n">pos</span> <span class="o">+=</span> <span class="p">(</span><span class="n">pos</span> <span class="o">&amp;</span> <span class="o">-</span><span class="n">pos</span><span class="p">))</span> <span class="n">bit</span><span class="p">[</span><span class="n">pos</span><span class="p">].</span><span class="n">upd</span><span class="p">(</span><span class="n">args</span><span class="p">...);</span>
	<span class="p">}</span>
	<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span> <span class="n">T</span> <span class="n">sum</span><span class="p">(</span><span class="kt">int</span> <span class="n">r</span><span class="p">,</span> <span class="n">Args</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">T</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
		<span class="k">for</span> <span class="p">(;</span> <span class="n">r</span><span class="p">;</span> <span class="n">r</span> <span class="o">-=</span> <span class="p">(</span><span class="n">r</span> <span class="o">&amp;</span> <span class="o">-</span><span class="n">r</span><span class="p">))</span> <span class="n">res</span> <span class="o">+=</span> <span class="n">bit</span><span class="p">[</span><span class="n">r</span><span class="p">].</span><span class="n">query</span><span class="p">(</span><span class="n">args</span><span class="p">...);</span>
		<span class="k">return</span> <span class="n">res</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span><span class="o">...</span> <span class="nc">Args</span><span class="p">&gt;</span> <span class="n">T</span> <span class="n">query</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">,</span> <span class="n">Args</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">return</span> <span class="n">sum</span><span class="p">(</span><span class="n">r</span><span class="p">,</span> <span class="n">args</span><span class="p">...)</span> <span class="o">-</span> <span class="n">sum</span><span class="p">(</span><span class="n">l</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">args</span><span class="p">...);</span>
	<span class="p">}</span>
<span class="p">};</span>  <span class="c1">// BIT&lt;int,10,10&gt; gives a 2D BIT</span>

<span class="n">BIT</span><span class="o">&lt;</span><span class="n">ll</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="o">&gt;</span><span class="n">seg</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cout</span><span class="p">.</span><span class="n">setf</span><span class="p">(</span><span class="n">ios</span><span class="o">::</span><span class="n">fixed</span><span class="p">);</span> <span class="n">cout</span><span class="p">.</span><span class="n">precision</span><span class="p">(</span><span class="n">PRECISION</span><span class="p">);</span>

    <span class="kt">int</span> <span class="n">N</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;=</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;=</span><span class="n">N</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;=</span><span class="n">N</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                <span class="kt">int</span> <span class="n">x</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">x</span><span class="p">;</span>
                <span class="n">seg</span><span class="p">.</span><span class="n">upd</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="n">Q</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">Q</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">Q</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">xl</span><span class="p">,</span> <span class="n">xr</span><span class="p">,</span> <span class="n">yl</span><span class="p">,</span> <span class="n">yr</span><span class="p">,</span> <span class="n">zl</span><span class="p">,</span> <span class="n">zr</span><span class="p">;</span>
        <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">xl</span> <span class="o">&gt;&gt;</span> <span class="n">xr</span> <span class="o">&gt;&gt;</span> <span class="n">yl</span> <span class="o">&gt;&gt;</span> <span class="n">yr</span> <span class="o">&gt;&gt;</span> <span class="n">zl</span> <span class="o">&gt;&gt;</span> <span class="n">zr</span><span class="p">;</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">seg</span><span class="p">.</span><span class="n">query</span><span class="p">(</span><span class="n">xl</span><span class="p">,</span> <span class="n">xr</span><span class="p">,</span> <span class="n">yl</span><span class="p">,</span> <span class="n">yr</span><span class="p">,</span> <span class="n">zl</span><span class="p">,</span> <span class="n">zr</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="e-">E :</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ll</span> <span class="n">X</span><span class="p">[</span><span class="mi">200005</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">Y</span><span class="p">[</span><span class="mi">200005</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">preX</span><span class="p">[</span><span class="mi">200005</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">preY</span><span class="p">[</span><span class="mi">200005</span><span class="p">];</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cout</span><span class="p">.</span><span class="n">setf</span><span class="p">(</span><span class="n">ios</span><span class="o">::</span><span class="n">fixed</span><span class="p">);</span> <span class="n">cout</span><span class="p">.</span><span class="n">precision</span><span class="p">(</span><span class="n">PRECISION</span><span class="p">);</span>

    <span class="kt">int</span> <span class="n">N</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span><span class="p">;</span>
    <span class="n">ll</span> <span class="n">D</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">D</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;=</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">X</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;&gt;</span> <span class="n">Y</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <span class="p">}</span> <span class="n">sort</span><span class="p">(</span><span class="n">X</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">X</span><span class="o">+</span><span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span> <span class="n">sort</span><span class="p">(</span><span class="n">Y</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">Y</span><span class="o">+</span><span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;=</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">preX</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">preX</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">X</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
        <span class="n">preY</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">preY</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">Y</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <span class="p">}</span>
    <span class="n">ll</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="n">ll</span><span class="o">&gt;</span><span class="n">sxes</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">ll</span><span class="o">&gt;</span><span class="n">syes</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="o">=-</span><span class="mi">2020202</span><span class="p">;</span> <span class="n">x</span><span class="o">&lt;=</span><span class="mi">2020202</span><span class="p">;</span> <span class="n">x</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">ll</span> <span class="n">lx</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">rx</span> <span class="o">=</span> <span class="n">N</span><span class="p">,</span> <span class="n">res</span> <span class="o">=</span> <span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
        <span class="k">while</span><span class="p">(</span><span class="n">lx</span> <span class="o">&lt;=</span> <span class="n">rx</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">ll</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lx</span> <span class="o">+</span> <span class="n">rx</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="n">X</span><span class="p">[</span><span class="n">mid</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">res</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
                <span class="n">rx</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span> <span class="k">else</span> <span class="n">lx</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">ll</span> <span class="n">sx</span> <span class="o">=</span> <span class="n">x</span> <span class="o">*</span> <span class="p">(</span><span class="n">res</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="n">preX</span><span class="p">[</span><span class="n">res</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="n">preX</span><span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="o">-</span> <span class="n">preX</span><span class="p">[</span><span class="n">res</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="p">(</span><span class="n">N</span> <span class="o">-</span> <span class="n">res</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">x</span><span class="p">);</span>
        
        <span class="k">if</span><span class="p">(</span><span class="n">sx</span> <span class="o">&gt;</span> <span class="n">D</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
        <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">sx</span> <span class="o">&lt;=</span> <span class="n">D</span><span class="p">)</span> <span class="n">sxes</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">sx</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="n">ll</span> <span class="n">y</span><span class="o">=-</span><span class="mi">2020202</span><span class="p">;</span> <span class="n">y</span><span class="o">&lt;=</span><span class="mi">2020202</span><span class="p">;</span> <span class="n">y</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">ll</span> <span class="n">lx</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">rx</span> <span class="o">=</span> <span class="n">N</span><span class="p">,</span> <span class="n">res</span> <span class="o">=</span> <span class="n">N</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
        <span class="k">while</span><span class="p">(</span><span class="n">lx</span> <span class="o">&lt;=</span> <span class="n">rx</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">ll</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lx</span> <span class="o">+</span> <span class="n">rx</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="n">Y</span><span class="p">[</span><span class="n">mid</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">res</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
                <span class="n">rx</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span> <span class="k">else</span> <span class="n">lx</span> <span class="o">=</span> <span class="n">mid</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">ll</span> <span class="n">sx</span> <span class="o">=</span> <span class="n">y</span> <span class="o">*</span> <span class="p">(</span><span class="n">res</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">-</span> <span class="n">preY</span><span class="p">[</span><span class="n">res</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="p">(</span><span class="n">preY</span><span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="o">-</span> <span class="n">preY</span><span class="p">[</span><span class="n">res</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="p">(</span><span class="n">N</span> <span class="o">-</span> <span class="n">res</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">y</span><span class="p">);</span>

        <span class="k">if</span><span class="p">(</span><span class="n">sx</span> <span class="o">&gt;</span> <span class="n">D</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
        <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">sx</span> <span class="o">&lt;=</span> <span class="n">D</span><span class="p">)</span> <span class="n">syes</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">sx</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">sort</span><span class="p">(</span><span class="n">all</span><span class="p">(</span><span class="n">sxes</span><span class="p">));</span> <span class="n">sort</span><span class="p">(</span><span class="n">all</span><span class="p">(</span><span class="n">syes</span><span class="p">));</span>
    <span class="k">for</span><span class="p">(</span><span class="n">ll</span> <span class="o">&amp;</span><span class="n">val</span><span class="o">:</span><span class="n">sxes</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">ll</span> <span class="n">res</span> <span class="o">=</span> <span class="n">upper_bound</span><span class="p">(</span><span class="n">all</span><span class="p">(</span><span class="n">syes</span><span class="p">),</span> <span class="n">D</span><span class="o">-</span><span class="n">val</span><span class="p">)</span> <span class="o">-</span> <span class="n">syes</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span>
        <span class="n">cnt</span> <span class="o">+=</span> <span class="n">res</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">cnt</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="Atcoder" /><category term="Competitive Programming" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">/&amp;lt;18288 + 18289&amp;gt; 팀 연습 더</title><link href="https://nox-katena.github.io/2024/08/10/boj-18288-18289/" rel="alternate" type="text/html" title="/&amp;lt;18288 + 18289&amp;gt; 팀 연습 더" /><published>2024-08-10T00:00:00+09:00</published><updated>2024-08-10T00:00:00+09:00</updated><id>https://nox-katena.github.io/2024/08/10/boj-18288-18289</id><content type="html" xml:base="https://nox-katena.github.io/2024/08/10/boj-18288-18289/"><![CDATA[<p>뭔가 DP문제들만 올리는 기분이네…</p>

<h2 id="문제">문제</h2>

<p>3인팀에서 $N$개의 문제를 특정 조건들에 맞게 배분하는 경우의 수 ($\mod 10^9+7$)</p>

<h2 id="풀이">풀이</h2>

<p>조건들을 살펴보자.</p>

<ol>
  <li>A가 해결한 문제의 수는 $K$의 배수가 되어야 한다.</li>
  <li>B는 문제를 연속해서 풀 수 없다.</li>
  <li>C는 한 문제 이상 해결해야 한다.</li>
</ol>

<p>조건들을 이대로 하나의 변수로 관리하기는 너무 어려워 보인다. A, B, C에 대한 조건을 나눠서 생각해보자.</p>

<p>A - 해결한 문제의 수는 $K$의 배수가 되어야 한다는 결국 $\mod K$ 가 0이여야 한다는 뜻이니 A가 푼 문제 수 $\mod K$를 하나의 변수로 관리하자.</p>

<p>B - B는 연속으로 문제를 해결할 수 없다. 이는 단순히 B가 i번 문제를 해결하는 경우를 고려 할 때 $i-1$번 문제를 A나 C가 해결한 경우만 고려해주면 된다.</p>

<p>C - C는 한 문제 이상 해결해야 한다. 따라서 C는 문제를 풀은적이 있냐 없냐만 중요하니 이를 변수로 관리한다.</p>

<p>하지만 아직도 문제를 이대로 풀기에는 어렵다. B같은 조건을 고려하면 이전 문제를 누가 풀었는지가 중요하기 때문이다.</p>

<p>따라서 $i$ 번째 문제를 A가 푼 경우, B가 푼 경우 C가 푼 경우를 각각 별개의 점화식으로 관리해준다.</p>

<p>이제 C가 문제를 풀었는지 안 풀었는지에 대한 정보를 변수 $j$로 나타내고 ($0$ 또는 $1$) A가 푼 문제 수 $\mod K$를 $k$라는 변수로 나타내면 A가 i번째 문제를 푸는 경우를 $A_{i, j, k}$라고 써볼 수 있다. 비슷하게 B와 C에 대해서도 적용해주면 답은 $A_{N, 1, 0} + B_{N, 1, 0} + C_{N, 1, 0}$이 된다.</p>

<p>상태를 정의 했으니 전이를 생각해보자. 다소 복잡한 면이 있긴 하지만 어렵진 않다.</p>

\[A_{i, 0, k} = A_{i-1, 0, ((k - 1) + K) \mod K} + B_{i-1, 0, ((k - 1) + K) \mod K}\]

\[A_{i, 1, k} = A_{i-1, 1, ((k - 1) + K) \mod K} + B_{i-1, 1, ((k - 1) + K) \mod K} + C_{i-1, 1, ((k - 1) + K) \mod K}\]

<p>A가 문제를 푼다면 $k$에 변화가 생긴다. $i-1, j, k-1$에 해당하는 경우들을 더해준다. 나머지이기 때문에 음수일 때 처리에 주의하고 $j$ 값에 따라 $C$를 포함할지 말지 여부를 결정한다.</p>

\[B_{i, 0, k} = A_{i-1, 0, k}\]

\[B_{i, 1, k} = A_{i-1, 1, k} + C_{i-1, 1, k}\]

<p>B는 연속으로 문제를 풀 수 없으니 B는 포함되지 않는다. 추가로 $j$가 $0$일 때는 C도 포함되지 않는다.</p>

\[C_{i, 1, k} = A_{i-1, 0, k} + A_{i-1, 1, k} + B_{i-1, 0, k} + B_{i-1, 1, k} + C_{i-1, 1, k}\]

<p>C가 문제를 풀 때는 $j$가 무조건 $1$이다.</p>

<p>이제 이걸 전부 코드로 옮기면 된다… 만 $K$가 $0$일 수도 있다. 이 경우 A는 문제를 풀면 안되니 별개로 처리해줘야 한다. 여기까지 조심했다면 문제를 해결 가능하다. 어떻게 처리해야 하는지는 left as an exercise to the reader이다. 아래 코드에 나와 있으니 참고해도 좋다.</p>

<h2 id="코드-c">코드 (C++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ll</span> <span class="n">N</span><span class="p">,</span> <span class="n">K</span><span class="p">;</span>

<span class="c1">// up-to ith, used C?, A mod K</span>
<span class="n">ll</span> <span class="n">A</span><span class="p">[</span><span class="mi">100005</span><span class="p">][</span><span class="mi">2</span><span class="p">][</span><span class="mi">10</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">B</span><span class="p">[</span><span class="mi">100005</span><span class="p">][</span><span class="mi">2</span><span class="p">][</span><span class="mi">10</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">C</span><span class="p">[</span><span class="mi">100005</span><span class="p">][</span><span class="mi">2</span><span class="p">][</span><span class="mi">10</span><span class="p">];</span>
<span class="c1">// if K==0, up-to ith, used C?</span>
<span class="n">ll</span> <span class="n">B2</span><span class="p">[</span><span class="mi">100005</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">C2</span><span class="p">[</span><span class="mi">100005</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cout</span><span class="p">.</span><span class="n">setf</span><span class="p">(</span><span class="n">ios</span><span class="o">::</span><span class="n">fixed</span><span class="p">);</span> <span class="n">cout</span><span class="p">.</span><span class="n">precision</span><span class="p">(</span><span class="n">PRECISION</span><span class="p">);</span>

    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span> <span class="o">&gt;&gt;</span> <span class="n">K</span><span class="p">;</span>
    <span class="k">if</span><span class="p">(</span><span class="n">N</span><span class="o">==</span><span class="mi">1</span><span class="p">){</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">K</span><span class="o">==</span><span class="mi">0</span><span class="p">){</span>
        <span class="n">B2</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">C2</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;=</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">B2</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">C2</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">];</span>
            <span class="n">C2</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">B2</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">B2</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">C2</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">];</span>
            <span class="n">B2</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
            <span class="n">C2</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">((</span><span class="n">B2</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span><span class="o">%</span><span class="n">MOD</span> <span class="o">+</span> <span class="p">(</span><span class="n">C2</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span><span class="o">%</span><span class="n">MOD</span><span class="p">)</span><span class="o">%</span><span class="n">MOD</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span><span class="p">{</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">K</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">A</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">((</span><span class="n">i</span><span class="o">==</span><span class="mi">1</span> <span class="o">||</span> <span class="n">K</span><span class="o">==</span><span class="mi">1</span><span class="p">)</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</span><span class="p">);</span>
            <span class="n">B</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span><span class="o">==</span><span class="mi">0</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</span><span class="p">);</span>
            <span class="n">C</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span><span class="o">==</span><span class="mi">0</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;=</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="n">K</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">){</span>
                <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> 
                <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][((</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">]</span> <span class="o">+</span> 
                <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][((</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">];</span>

                <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> 
                <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][((</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">]</span> <span class="o">+</span>
                <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][((</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">]</span> <span class="o">+</span>
                <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][((</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">];</span>

                <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> 
                <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">k</span><span class="p">];</span>

                <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span>
                <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">];</span>

                <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> 
                <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span> <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span>
                <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span> <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span>
                <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">];</span>

                <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
                <span class="n">A</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
                <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
                <span class="n">B</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
                <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
                <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">((</span><span class="n">A</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">%</span><span class="n">MOD</span><span class="p">)</span> <span class="o">+</span> 
        <span class="p">(</span><span class="n">B</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">)</span> <span class="o">+</span>
        <span class="p">(</span><span class="n">C</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">))</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="large-version-팀-연습-더-18289">Large version (팀 연습 더 /&lt;18289&gt;)</h2>

<p>눈치챈 사람도 있겠지만 점화식이 전부 선형 점화식이다. 따라서 행렬의 빠른 거듭 제곱으로 $N$번째 값을 빠르게 계산할 수 있으며 이것만 적용하면 문제가 풀린다.</p>

<h2 id="코드-large-version-c">코드 Large version (C++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">Matrix</span><span class="p">{</span>
    <span class="kt">int</span> <span class="n">N</span><span class="p">,</span> <span class="n">M</span><span class="p">;</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">ll</span><span class="o">&gt;&gt;</span><span class="n">Mat</span><span class="p">;</span>

    <span class="n">Matrix</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="kt">int</span> <span class="n">m</span><span class="p">){</span>
        <span class="n">N</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span> <span class="n">M</span> <span class="o">=</span> <span class="n">m</span><span class="p">;</span>
        <span class="n">Mat</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">ll</span><span class="o">&gt;</span><span class="p">(</span><span class="n">M</span><span class="p">,</span> <span class="mi">0</span><span class="p">));</span>
    <span class="p">}</span>

    <span class="n">Matrix</span> <span class="k">operator</span><span class="o">*</span><span class="p">(</span><span class="k">const</span> <span class="n">Matrix</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">)</span> <span class="k">const</span><span class="p">{</span>
        <span class="n">assert</span><span class="p">(</span> <span class="n">M</span> <span class="o">==</span> <span class="n">rhs</span><span class="p">.</span><span class="n">N</span> <span class="p">);</span> <span class="n">Matrix</span> <span class="n">ret</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">rhs</span><span class="p">.</span><span class="n">M</span><span class="p">);</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="n">rhs</span><span class="p">.</span><span class="n">M</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">){</span>
                <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">k</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">k</span><span class="o">&lt;</span><span class="n">M</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">){</span>
                    <span class="n">ret</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="p">(</span><span class="n">Mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">rhs</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">])</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">;</span>
                    <span class="n">ret</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">Matrix</span> <span class="n">ID</span><span class="p">(){</span>
        <span class="n">assert</span><span class="p">(</span><span class="n">N</span> <span class="o">==</span> <span class="n">M</span><span class="p">);</span> <span class="n">Matrix</span> <span class="n">I</span><span class="p">(</span><span class="n">N</span><span class="p">,</span> <span class="n">N</span><span class="p">);</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="n">N</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">){</span>
                <span class="n">I</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="k">return</span> <span class="n">I</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">Matrix</span> <span class="n">exp</span><span class="p">(</span><span class="n">ll</span> <span class="n">k</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">0</span><span class="p">){</span>
            <span class="k">return</span> <span class="n">ID</span><span class="p">();</span>
        <span class="p">}</span>
        <span class="k">if</span><span class="p">(</span><span class="n">k</span><span class="o">==</span><span class="mi">1</span><span class="p">){</span>
            <span class="k">return</span> <span class="o">*</span><span class="k">this</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">Matrix</span> <span class="n">ret</span> <span class="o">=</span> <span class="n">exp</span><span class="p">(</span><span class="n">k</span><span class="o">/</span><span class="mi">2</span><span class="p">);</span>
        <span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span> <span class="o">*</span> <span class="n">ret</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">k</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
        <span class="k">else</span> <span class="k">return</span> <span class="n">ret</span> <span class="o">*</span> <span class="p">(</span><span class="o">*</span><span class="k">this</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="n">ll</span> <span class="n">N</span><span class="p">,</span> <span class="n">K</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cout</span><span class="p">.</span><span class="n">setf</span><span class="p">(</span><span class="n">ios</span><span class="o">::</span><span class="n">fixed</span><span class="p">);</span> <span class="n">cout</span><span class="p">.</span><span class="n">precision</span><span class="p">(</span><span class="n">PRECISION</span><span class="p">);</span>

    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span> <span class="o">&gt;&gt;</span> <span class="n">K</span><span class="p">;</span>
    <span class="k">if</span><span class="p">(</span><span class="n">N</span><span class="o">==</span><span class="mi">1</span><span class="p">){</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">K</span><span class="o">==</span><span class="mi">0</span><span class="p">){</span>
        <span class="c1">//B2 B2' C2</span>
        <span class="n">Matrix</span> <span class="n">res</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
        <span class="n">res</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">res</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="n">Matrix</span> <span class="n">m</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
        <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="n">N</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="n">Matrix</span> <span class="n">ret</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">exp</span><span class="p">(</span><span class="n">N</span><span class="p">)</span> <span class="o">*</span> <span class="n">res</span><span class="p">;</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">ret</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">ret</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span><span class="o">%</span><span class="n">MOD</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span><span class="p">{</span>
        <span class="c1">// A0 ... Ak-1 A'0 ... A'k-1 B0 .. Bk-1 B'0 ... B'k-1 C0 ... Ck-1</span>
        <span class="n">Matrix</span> <span class="n">res</span><span class="p">(</span><span class="mi">5</span><span class="o">*</span><span class="n">K</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span> <span class="n">Matrix</span> <span class="n">m</span><span class="p">(</span><span class="mi">5</span><span class="o">*</span><span class="n">K</span><span class="p">,</span> <span class="mi">5</span><span class="o">*</span><span class="n">K</span><span class="p">);</span>

        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">K</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">res</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">K</span> <span class="o">+</span> <span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">((</span><span class="n">i</span><span class="o">==</span><span class="mi">1</span> <span class="o">||</span> <span class="n">K</span><span class="o">==</span><span class="mi">1</span><span class="p">)</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</span><span class="p">);</span>
            <span class="n">res</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">K</span><span class="o">*</span><span class="mi">3</span> <span class="o">+</span> <span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span><span class="o">==</span><span class="mi">0</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</span><span class="p">);</span>
            <span class="n">res</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">K</span><span class="o">*</span><span class="mi">4</span> <span class="o">+</span> <span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span><span class="o">==</span><span class="mi">0</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="mi">0</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="c1">//A</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">K</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">i</span><span class="p">][((</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">2</span><span class="o">*</span><span class="n">K</span> <span class="o">+</span><span class="p">((</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">K</span> <span class="o">+</span><span class="p">((</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">//A'</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">K</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="n">K</span><span class="o">+</span><span class="p">((</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="mi">3</span><span class="o">*</span><span class="n">K</span> <span class="o">+</span><span class="p">((</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="n">K</span><span class="p">)</span><span class="o">%</span><span class="n">K</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">//B</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">K</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
            <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">K</span> <span class="o">+</span> <span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">//B'</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">K</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">3</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="c1">//C</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">K</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
            <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="mi">2</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="mi">3</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">][</span><span class="mi">4</span><span class="o">*</span><span class="n">K</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">N</span> <span class="o">-=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="n">Matrix</span> <span class="n">ret</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">exp</span><span class="p">(</span><span class="n">N</span><span class="p">)</span> <span class="o">*</span> <span class="n">res</span><span class="p">;</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">ret</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">ret</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">2</span><span class="o">*</span><span class="n">K</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="n">ret</span><span class="p">.</span><span class="n">Mat</span><span class="p">[</span><span class="mi">4</span><span class="o">*</span><span class="n">K</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span><span class="o">%</span><span class="n">MOD</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="Baekjoon Online Judge" /><category term="Dynamic Programming" /><summary type="html"><![CDATA[뭔가 DP문제들만 올리는 기분이네…]]></summary></entry><entry><title type="html">How I approach Dynamic Programming</title><link href="https://nox-katena.github.io/2024/08/04/dp/" rel="alternate" type="text/html" title="How I approach Dynamic Programming" /><published>2024-08-04T00:00:00+09:00</published><updated>2024-08-04T00:00:00+09:00</updated><id>https://nox-katena.github.io/2024/08/04/dp</id><content type="html" xml:base="https://nox-katena.github.io/2024/08/04/dp/"><![CDATA[<p>진짜 제대로 된 강의글을 적기엔 부족한 실력이고 솔직히 지금 그래서 DP를 잘하냐 하면 그거도 아니지만 DP를 처음 배울 당시 굉장히 고생했던 사람으로서 저랑 비슷한 고생을 하고 있는 분들에게 조금이라도 도움이 되셨으면 하는 마음으로 글을 써봅니다.</p>

<h2 id="선행-지식">선행 지식</h2>

<ul>
  <li>다양한 유형의 기초적인 DP (다이나믹 프로그래밍) 문제들을 풀어본 경험</li>
  <li>그래프 이론 (방향 비순환 그래프, 위상 정렬, 깊이 우선 탐색)</li>
</ul>

<h2 id="글을-쓰게-된-계기">글을 쓰게 된 계기</h2>

<p>DP를 처음 배울때 접하게 되는 대부분의 자료나 블로그들이 초항, 부분 문제, 탑 다운, 바텀 업, 메모이제이션, 점화식 등의 요소에 집중해서 설명하는 것 같습니다. 실제로 저도 DP를 처음 배울 때는 “그래서 이거 점화식 어케 세우나요?” 등의 질문을 많이 했고 이런 질문을 저한테 하시는 분들도 간혹 봐왔습니다. 별로 많은 분들의 공감을 사지 못하는 얘기 일수도 있지만 저는 이런 요소들이 DP의 핵심적인 요소들이면서도 동시에 다양한 유형의 DP로 확장 하는데 어려움을 유발하며 DP에 대한 이해를 방해하는 요소라고 생각합니다.</p>

<p>왜 그렇게 생각하는지 조금 더 부연 설명을 해보겠습니다. 실제로 피보나치 정도의 DP는 점화식 등으로 표현하기 쉽습니다. 정의를 알면 상당히 직관적으로 이해도 가능하고 배열과 반복문을 통해 간단하게 구현 가능하겠구나 라는 점을 알 수 있습니다.</p>

\[f(i) = f(i - 1) + f(i - 2)\]

<p>하지만 트리에서의 DP, 구간을 이용한 DP 등의 유형을 처음 배우는 입장에서 부모 정점과 자식 정점 사이 관계, 배열 내의 특정 구간의 합 등을 정확하게 수학적으로 표현하고 점화식으로 풀어내는 일은 절대 쉽지 않고 오히려 문제를 풀고 이해하는데 그다지 중요한 내용이 아니라고 생각합니다. (표현이 불가능하지는 않습니다. 하지만 DP에 대한 이해가 떨어지는 상태의 초심자한테 기대할 레벨은 아니라는 얘기 입니다.)</p>

<h2 id="방향-비순환-그래프directed-acyclic-graph-dag">방향 비순환 그래프/Directed Acyclic Graph (DAG)</h2>

<p>저는 오히려 방향 비순환 그래프가 DP를 이해하는데 있어 핵심적인 내용이라 생각하는데 이유는 앞서 언급한 모든 요소들은 전부 방향 비순환 그래프를 통해 설명 할 수 있습니다. 이름이 길어서 여기서 부터는 DAG로 줄이겠습니다.</p>

<p>먼저 이름에서 유추 할 수 있듯이 DAG는</p>
<ol>
  <li>간선들이 방향을 가지며</li>
  <li>사이클이 존재하지 않는</li>
  <li>그래프 입니다.</li>
</ol>

<p>아래는 DAG의 예시입니다. (<a href="https://csacademy.com/app/graph_editor">이거로</a> 로 만들었습니다.)</p>

<p><img src="https://raw.githubusercontent.com/nox-katena/nox-katena.github.io/gh-pages/_images/dp0804/graph.png" alt="sample DAG" /></p>

<h2 id="위상-정렬-topological-sorting">위상 정렬 (Topological Sorting)</h2>

<p>DP와 DAG의 연관성을 알기 위해서는 위상 정렬을 이해해야 합니다. 우선 위상 정렬이란 DAG에서 모든 방향 간선 $u \rightarrow v$에 대해 $u$가 $v$보다 먼저 오게끔 선형으로 나열/정렬 하는 알고리즘입니다. (출처 : <a href="https://en.wikipedia.org/wiki/Topological_sorting">Topological sorting (Wikipedia)</a>)
위 그래프를 위상 정렬하면 $0\ 3\ 1\ 2\ 4\ 5$ 또는 $0\ 1\ 3\ 2\ 4\ 5$ 등이 결과로 나올 수 있게 됩니다. (간선으로 연결된 정점들 사이 순서만 중요해서 결과가 여러개 나올 수 있습니다.)</p>

<p>위상 정렬의 대표적인 활용은 의존성 해결에 있습니다. 그래프의 각 정점이 어떤 작업을 의미하고 간선 $u \rightarrow v$는 $v$를 시작하기 전에 $u$가 완료되야 함을 의미한다고 생각해보면 작업 $v$는 작업 $u$에 의존한다고 표현 할 수 있습니다. 그리고 이 그래프를 위상 정렬해서 나오는 결과는 작업들을 진행하는 순서가 됩니다.</p>

<p>그런데 여기서 의존성이 사이클이 이룬다고 생각해보면 어떨까요? 그러면 아쉽게도 위상 정렬을 할 수 없습니다 (조건이 위배되지 않게 작업들에 순서를 부여 할 수 없기 때문). 따라서 위상 정렬을 하기 위해서는 그래프가 방향 <strong>비순환</strong> 그래프 여야만 합니다. 위상 정렬을 하는 방법은 이 글의 포커스가 아니니 넘어가도록 하겠습니다.</p>

<h2 id="dp와-dag">DP와 DAG</h2>

<p>여기까지 왔다면 DP와 DAG사이 관계를 설명 가능한데 이는 바로 <strong>모든 DP 문제는 DAG로 표현 가능하다</strong> 입니다. 왜 그럴까요?</p>

<p>아래 그래프를 봅시다.</p>

<p><img src="https://raw.githubusercontent.com/nox-katena/nox-katena.github.io/gh-pages/_images/dp0804/fibo_graph.png" alt="fibonacci?" /></p>

<p>그저 평범한 그래프 처럼 보이지만 사실 이는 $5$번째 항 까지 피보나치 수를 계산하는 점화식을 그래프로 나타낸 것 입니다.</p>

<p>피보나치 수의 $i$ 번째 항은 $i-1$ 번째 항과 $i-2$ 번째 항의 합으로 계산됩니다. 이를 다르게 말하면 피보나치 수의 $i$ 번째 항을 계산하기 위해서는 $i-1$ 번째 항과 $i-2$ 번째 항이 <strong>필요</strong>하며 두 값을 모르는 상태로 $i$ 번째 항은 계산할 수 없습니다. 이는 결국 $i$ 번째 항은 $i-1$ 번째 항과 $i-2$ 번째 항에 <strong>의존</strong> 한다는 의미인 것을 알 수 있습니다.</p>

<p>의존성이 존재함으로 각 항을 정점에 저장된 값으로 나타내고 의존성을 간선으로 나타내면 방향 그래프를 만들 수 있습니다. 사이클이 존재하지 않기 때문에 (당연히) 이는 동시에 DAG입니다.</p>

<p>정점들에 값을 적어보면 좀 더 확실하게 보일 것 입니다.</p>

<p><img src="https://raw.githubusercontent.com/nox-katena/nox-katena.github.io/gh-pages/_images/dp0804/fibo_graph_numbered.png" alt="fibonacci" /></p>

<p>이를 좀 더 일반화 해서 생각해보면 결국 DP에서 해결하고자 하는 “문제”는 어떤 주어진 정점에 저장된 값을 구하는 것이고 “부분 문제”는 그 정점이 의존하고 있는 정점들의 값을 구하는 것이며 점화식으로 표현되는 “문제”들 사이 관계가 결국 의존성을 정의하는 방향 간선들 임을 알 수 있습니다.</p>

<p>제가 DP를 DAG로 이해하는 것을 좋아하는 이유가 몇가지 있는데</p>

<ol>
  <li>점화식이 나타내는 상태가 복잡해져도 쉽게 적용/확장 가능하다는 점</li>
  <li>실제 구현 때 값들을 계산해야 하는 순서가 명확해진다는 점</li>
  <li>바텀 업과 탑 다운을 동시에 이해할 수 있다는 점 입니다.</li>
</ol>

<p>이를 설명하기 위해 <a href="https://www.acmicpc.net/problem/11066">/&lt;11066&gt;파일 합치기</a>를 사용하도록 하겠습니다. (아직 안 풀어봤다면 지금 풀어보시기 바랍니다.)</p>

<h2 id="상태와-전이">상태와 전이</h2>

<p>정점이라는 것이 꼭 정수 하나로 표현될 필요는 없습니다. 그래프 문제를 많이 풀어보신 분들이라면 아시겠지만 정점은 결국 어떠한 상태를 표현하는 수단이며 간선은 이 상태들 사이 관계, 즉 상태 전이를 나타내는 방법입니다 (지금은 의존성이겠죠).</p>

<p>그러면 파일 합치기에서 정점이 나타내는 상태는 무엇일까요? 바로 구간의 시작과 끝입니다. 배열의 $i$번째 위치에서 시작해서 $j$ 번째 위치에서 끝나는 구간을 $[i, j]$형태의 상태로 표현하면 답은 $[1, K]$에 해당하는 정점의 값일 것입니다.</p>

<p>정점을 정의했으니 의존성(간선)을 정의해보도록 합시다 (약간의 관찰이 필요하지만 문제를 한번은 풀어봤다고 가정하고). 어떤 구간 $[i, j]$의 답은 그 구간 사이에 $i \le m &lt; j$를 만족하는 어떤 위치 $m$에 대해 $[i, m]$의 답 $+$ $[m+1, j]$ $+$ $[i, j]$에 해당하는 모든 원소들의 합 으로 정의됨을 알 수 있습니다. 따라서 $[i, j]$는 그 사이에 속한 $i$에서 시작하거나 $j$에서 끝나는 모든 구간들에 의존하고 있음을 알 수 있습니다. 예시로 $[2, 4]$의 의존성을 그래프로 나타내 보면 아래와 같습니다.</p>

<p><img src="https://raw.githubusercontent.com/nox-katena/nox-katena.github.io/gh-pages/_images/dp0804/filemerge.png" alt="dependency graph of 11066" /></p>

<p>어떤 상태에서의 답을 계산하기 위해서는 그 상태가 의존하는 모든 상태에서의 답이 미리 계산되어 있음이 보장되야 합니다. 이를 어떻게 보장 할 수 있을까요? 어떤 구간이 의존하고 있는 모든 구간은 그 구간보다 길이가 짧거나 같습니다. 따라서 길이가 짧은 구간부터 답을 계산해 나가면 자연스럽게 이 구조를 보장할 수 있으며 저는 보통 이를 DP의 단조성이라고 부릅니다. 제가 만든 용어는 아니고 저한테 이걸 설명해준 <a href="https://www.acmicpc.net/user/hibye1217">어떤 12월 17일에 태어나신 선물로 수열 받는걸로 유명하신 분</a>이 이렇게 표현하신게 입에 붙어서 쓰고 있는겁니다.</p>

<p>상태와 상태 전이가 모두 정의되었으니 이제 문제를 해결할 수 있습니다. 주석을 참고하며 코드를 이해해보시기 바랍니다.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">using</span> <span class="n">ll</span> <span class="o">=</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">;</span>
<span class="k">const</span> <span class="n">ll</span> <span class="n">INF</span> <span class="o">=</span> <span class="mf">1e15</span><span class="p">;</span>

<span class="n">ll</span> <span class="n">dp</span><span class="p">[</span><span class="mi">505</span><span class="p">][</span><span class="mi">505</span><span class="p">];</span>
<span class="c1">// dp[i][j] = [i, j]에서의 답</span>
<span class="n">ll</span> <span class="n">psum</span><span class="p">[</span><span class="mi">505</span><span class="p">];</span> <span class="c1">// 누적합 배열</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span> <span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>

    <span class="kt">int</span> <span class="n">T</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">T</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">T</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">K</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">K</span><span class="p">;</span>
        <span class="n">vector</span><span class="o">&lt;</span><span class="n">ll</span><span class="o">&gt;</span><span class="n">v</span><span class="p">(</span><span class="n">K</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;=</span><span class="n">K</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">];</span> <span class="n">psum</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">psum</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
        <span class="p">}</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">len</span><span class="o">=</span><span class="mi">2</span><span class="p">;</span> <span class="n">len</span><span class="o">&lt;=</span><span class="n">K</span><span class="p">;</span> <span class="n">len</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// len은 구간의 길이</span>
            <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">+</span><span class="n">len</span><span class="o">-</span><span class="mi">1</span><span class="o">&lt;=</span><span class="n">K</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="c1">//구간의 시작 i</span>
                <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">len</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// 구간의 끝 j</span>
                <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">INF</span><span class="p">;</span> <span class="c1">//초기값</span>
                <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">m</span><span class="o">=</span><span class="n">i</span><span class="p">;</span> <span class="n">m</span><span class="o">&lt;</span><span class="n">j</span><span class="p">;</span> <span class="n">m</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// 중간 위치 m</span>
                    <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">],</span> 
                    <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">m</span><span class="p">]</span> <span class="o">+</span> <span class="n">dp</span><span class="p">[</span><span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+</span> <span class="n">psum</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">psum</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]);</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">dp</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">K</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="탑-다운-바텀-업">탑 다운? 바텀 업?</h2>

<p>DP의 DAG접근을 좋아하는 마지막 이유로 탑 다운과 바텀 업을 동시에 이해 가능하다는 점을 언급했습니다. 앞서 DAG에서 의존성을 해결하기 위해 위상정렬을 사용한다 했습니다. 바텀 업이 더 작은 부분문제를 계산한 후 더 큰 문제로 가서 해결하는 과정임을 생각해보면 이는 결국 <strong>DAG가 위상정렬된 순서대로 문제를 해결</strong>하는 과정임을 알 수 있습니다.</p>

<p>그러면 탑 다운은 뭘까요? 탑 다운은 큰 문제를 해결하기 위해 필요한 부분 문제들을 재귀적으로 호출 한 후 전부 호출이 완료되면 그때 큰 문제를 계산하는 방식으로 소개됩니다. 이는 결국 DAG에서 생각해보면 간선들의 방향을 뒤집은 상태에서 <strong>목표 정점에서 시작하는 DFS</strong>와 동일함을 알 수 있습니다. 어떤 정점에서 재귀적으로 부분 문제들을 호출하면 의존하고 있는 부분 문제가 없는 문제가 나오는게 재귀 호출의 base case가 될텐데 DFS의 탐색 구조를 생각해보면 이것이 DFS와 동일함을 알 수 있습니다.</p>

<p>이제 DP의 모든 기초 요소를 DAG에 대입해서 생각해 볼 수 있습니다.</p>

<ul>
  <li>초항 : 진입 차수가 0인 (다른 정점에 의존하지 않는) 정점</li>
  <li>문제 : 정점</li>
  <li>부분 문제 : 어떤 정점으로 들어오는 (그 정점이 의존하고 있는) 정점들</li>
  <li>점화식 : 정점들 사이 연결 관계 (의존성)</li>
  <li>탑 다운 : DFS</li>
  <li>바텀 업 : 위상 정렬</li>
  <li>메모이제이션 : 정점(상태)에 해당하는 값을 기록해두는 행위</li>
</ul>

<h2 id="한계점">한계점</h2>

<p>물론 DAG표현에도 DP를 이해하는데 한계가 없는 것은 아닙니다.</p>

<ul>
  <li>일반적으로 문제를 해결 할때 명시적으로 그래프를 만드는 것은 아니기 때문에 실제 구현과의 괴리가 있다</li>
  <li>점화식이 단순한 경우 배보다 배꼽이 더 크다고 느낄 수 있다</li>
  <li>점화식을 아예 사용 안하는 것도… 솔직히 비효율적이다… (이 쪽이 설명하기 더 쉬운 경우도 충분히 많다)</li>
  <li>결국 문제를 많이 풀어봐야 한다 (이거에 해당 안되는게 있겠냐만)</li>
</ul>

<p>그럼에도 불구하고 이 글을 쓴 이유는 제가 “DP는 DAG이다”임을 듣기 전까지 DP자체에 대한 이해를 하는데 큰 어려움을 겪었고 저처럼 DP를 점화식 자체로 받아들이기 어려운 분들한테 이러한 해석도 가능하다! 를 알려주기 위해서입니다.</p>

<p>도움이 되셨다면 좋겠습니다. 내용에 대한 질문이나 하고 싶으신 말씀은 댓글이나 디스코드 <code class="language-plaintext highlighter-rouge">nox.katena</code>로 부탁드립니다. 감사합니다.</p>]]></content><author><name></name></author><category term="Dynamic Programming" /><summary type="html"><![CDATA[진짜 제대로 된 강의글을 적기엔 부족한 실력이고 솔직히 지금 그래서 DP를 잘하냐 하면 그거도 아니지만 DP를 처음 배울 당시 굉장히 고생했던 사람으로서 저랑 비슷한 고생을 하고 있는 분들에게 조금이라도 도움이 되셨으면 하는 마음으로 글을 써봅니다.]]></summary></entry><entry><title type="html">/&amp;lt;30909&amp;gt; Lateral Damage</title><link href="https://nox-katena.github.io/2024/07/20/boj-30909/" rel="alternate" type="text/html" title="/&amp;lt;30909&amp;gt; Lateral Damage" /><published>2024-07-20T00:00:00+09:00</published><updated>2024-07-20T00:00:00+09:00</updated><id>https://nox-katena.github.io/2024/07/20/boj-30909</id><content type="html" xml:base="https://nox-katena.github.io/2024/07/20/boj-30909/"><![CDATA[<p>A problem I solved during team practice. A really nice interactive problem I think. “How can you force the judge program to give you the output you want?” At the same time, the solution felt relatively simple once I went down that line of reasoning.</p>

<h2 id="problem"><a href="https://www.acmicpc.net/problem/30909">Problem</a></h2>

<p>The problem is about the classic game of Battleships with the only difference that all ships are of size $5 \times 1$. The judge will “lie” about the result of your shots (under the constraints that it doesn’t cause a contradiction) and your goal is to sink all $k$ ships of the judge on a $n \times n$ grid within 2500 shots. $(5 \le n \le 100; 1 \le k \le 10)$</p>

<h2 id="solution">Solution</h2>

<p>First of all, we want to somehow force the judge to a point where it can no longer “lie”. Obviously, the simplest way of doing this would be to shoot every cell in the grid. But this would be way over our 2500 shots limit in the worst case. We need to somehow reduce the number of shots while still covering all cells which may be part of a ship.</p>

<p>Let’s focus on the fact that the ships are all of a fixed size of $5 \times 1$. Thus, if we can place our shots such that any 5 horizontally or vertically consecutive cells contains at least 1 shot cell, all ships are bound to have been shot at least once. We can think of the following placement.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>xooooxoooox
oxooooxoooo
ooxooooxooo
oooxooooxoo
ooooxooooxo
xooooxoooox
oxooooxoooo
ooxooooxooo
oooxooooxoo
ooooxooooxo
xooooxoooox
</code></pre></div></div>

<p>x represents a shot. o represents an empty cell.</p>

<p>Then, for all such cells which the judge responded with “hit”. Shoot 4 more cells to the top, bottom, left, and right of the grid. This way, we are bound to have sunk all ships.</p>

<p>Do be careful to return immediately once you’ve received $k$ “sink” responses.</p>

<h1 id="code-c">Code (C++)</h1>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="c1">// #define endl '\n'</span>

<span class="cp">#define PRECISION 0
</span>
<span class="cp">#define fr first
#define sc second
</span>
<span class="cp">#define all(v) v.begin(), v.end()
#define compress(v) sort(all(v)), v.erase(unique(all(v)), v.end())
</span>
<span class="k">using</span> <span class="n">ll</span> <span class="o">=</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">;</span>
<span class="k">using</span> <span class="n">ld</span> <span class="o">=</span> <span class="kt">long</span> <span class="kt">double</span><span class="p">;</span>

<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">ll</span><span class="p">,</span><span class="n">ll</span><span class="o">&gt;</span> <span class="n">pll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>

<span class="k">template</span> <span class="o">&lt;</span><span class="k">typename</span> <span class="nc">Q</span><span class="p">&gt;</span> <span class="k">using</span> <span class="n">rpq</span> <span class="o">=</span> <span class="n">priority_queue</span><span class="o">&lt;</span><span class="n">Q</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">Q</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">greater</span><span class="o">&lt;</span><span class="n">Q</span><span class="o">&gt;</span> <span class="o">&gt;</span><span class="p">;</span> 

<span class="k">const</span> <span class="kt">int</span> <span class="n">INF</span> <span class="o">=</span> <span class="mh">0x3f3f3f3f</span><span class="p">;</span>
<span class="k">const</span> <span class="n">ll</span> <span class="n">LLINF</span> <span class="o">=</span> <span class="mi">4'500'000'000'000'000'000</span><span class="p">;</span>
<span class="k">const</span> <span class="n">ll</span> <span class="n">MOD</span> <span class="o">=</span> <span class="mi">1'000'000'007</span><span class="p">;</span>

<span class="kt">bool</span> <span class="n">shot</span><span class="p">[</span><span class="mi">105</span><span class="p">][</span><span class="mi">105</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">pii</span><span class="o">&gt;</span><span class="n">shots</span><span class="p">;</span> <span class="kt">int</span> <span class="n">sunk</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">pii</span><span class="o">&gt;</span><span class="n">valid</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="c1">// ios::sync_with_stdio(0);</span>
    <span class="c1">// cin.tie(0);</span>
    <span class="c1">// cout.setf(ios::fixed); cout.precision(PRECISION);</span>

    <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span> <span class="o">&gt;&gt;</span> <span class="n">k</span><span class="p">;</span>
    
    <span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span> <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="n">x</span><span class="o">&lt;=</span><span class="n">n</span><span class="p">;</span> <span class="n">x</span><span class="o">++</span><span class="p">){</span>
        <span class="k">if</span><span class="p">(</span><span class="n">y</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">ny</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span> <span class="n">ny</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">ny</span> <span class="o">+=</span> <span class="mi">5</span><span class="p">){</span>
            <span class="n">shots</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">x</span><span class="p">,</span> <span class="n">ny</span><span class="p">});</span>
        <span class="p">}</span> <span class="n">y</span><span class="o">--</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">for</span><span class="p">(</span><span class="k">auto</span> <span class="n">i</span><span class="o">:</span><span class="n">shots</span><span class="p">){</span>
        <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">i</span><span class="p">.</span><span class="n">fr</span> <span class="o">&lt;&lt;</span> <span class="sc">' '</span> <span class="o">&lt;&lt;</span> <span class="n">i</span><span class="p">.</span><span class="n">sc</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
        <span class="n">shot</span><span class="p">[</span><span class="n">i</span><span class="p">.</span><span class="n">fr</span><span class="p">][</span><span class="n">i</span><span class="p">.</span><span class="n">sc</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="n">string</span> <span class="n">res</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">res</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">res</span> <span class="o">==</span> <span class="s">"miss"</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">continue</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">if</span><span class="p">(</span><span class="n">res</span> <span class="o">==</span> <span class="s">"hit"</span> <span class="o">||</span> <span class="n">res</span> <span class="o">==</span> <span class="s">"sunk"</span><span class="p">){</span>
            <span class="k">if</span><span class="p">(</span><span class="n">res</span> <span class="o">==</span> <span class="s">"sunk"</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">sunk</span><span class="o">++</span><span class="p">;</span>
                <span class="k">if</span><span class="p">(</span><span class="n">sunk</span> <span class="o">==</span> <span class="n">k</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="n">valid</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="k">for</span><span class="p">(</span><span class="k">auto</span> <span class="n">i</span><span class="o">:</span><span class="n">valid</span><span class="p">){</span>
        <span class="c1">// 왼</span>
        <span class="n">string</span> <span class="n">res</span><span class="p">;</span>
            <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="n">i</span><span class="p">.</span><span class="n">fr</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">i</span><span class="p">.</span><span class="n">sc</span><span class="p">;</span>
            <span class="k">while</span><span class="p">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">x</span> <span class="o">&gt;=</span> <span class="n">i</span><span class="p">.</span><span class="n">fr</span> <span class="o">-</span> <span class="mi">4</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">shot</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]){</span>
                    <span class="n">shot</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
                    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="sc">' '</span> <span class="o">&lt;&lt;</span> <span class="n">y</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
                    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">res</span><span class="p">;</span>
                    <span class="k">if</span><span class="p">(</span><span class="n">res</span> <span class="o">==</span> <span class="s">"sunk"</span><span class="p">)</span> <span class="n">sunk</span><span class="o">++</span><span class="p">;</span>
                    <span class="k">if</span><span class="p">(</span><span class="n">sunk</span> <span class="o">==</span> <span class="n">k</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> 
                <span class="p">}</span>
                <span class="n">x</span><span class="o">--</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="c1">// 오른  </span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">i</span><span class="p">.</span><span class="n">fr</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">i</span><span class="p">.</span><span class="n">sc</span><span class="p">;</span>
            <span class="k">while</span><span class="p">(</span><span class="n">x</span> <span class="o">&lt;=</span> <span class="n">n</span> <span class="o">&amp;&amp;</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="n">i</span><span class="p">.</span><span class="n">fr</span> <span class="o">+</span> <span class="mi">4</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">shot</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]){</span>
                    <span class="n">shot</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
                    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="sc">' '</span> <span class="o">&lt;&lt;</span> <span class="n">y</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
                    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">res</span><span class="p">;</span>
                    <span class="k">if</span><span class="p">(</span><span class="n">res</span> <span class="o">==</span> <span class="s">"sunk"</span><span class="p">)</span> <span class="n">sunk</span><span class="o">++</span><span class="p">;</span>
                    <span class="k">if</span><span class="p">(</span><span class="n">sunk</span> <span class="o">==</span> <span class="n">k</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> 
                <span class="p">}</span>
                <span class="n">x</span><span class="o">++</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="c1">// 위</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">i</span><span class="p">.</span><span class="n">fr</span> <span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">i</span><span class="p">.</span><span class="n">sc</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
            <span class="k">while</span><span class="p">(</span><span class="n">y</span> <span class="o">&lt;=</span> <span class="n">n</span> <span class="o">&amp;&amp;</span> <span class="n">y</span> <span class="o">&lt;=</span> <span class="n">i</span><span class="p">.</span><span class="n">sc</span> <span class="o">+</span> <span class="mi">4</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">shot</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]){</span>
                    <span class="n">shot</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
                    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="sc">' '</span> <span class="o">&lt;&lt;</span> <span class="n">y</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
                    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">res</span><span class="p">;</span>
                    <span class="k">if</span><span class="p">(</span><span class="n">res</span> <span class="o">==</span> <span class="s">"sunk"</span><span class="p">)</span> <span class="n">sunk</span><span class="o">++</span><span class="p">;</span>
                    <span class="k">if</span><span class="p">(</span><span class="n">sunk</span> <span class="o">==</span> <span class="n">k</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> 
                <span class="p">}</span>
                <span class="n">y</span><span class="o">++</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="c1">// 아래</span>
            <span class="n">x</span> <span class="o">=</span> <span class="n">i</span><span class="p">.</span><span class="n">fr</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="n">i</span><span class="p">.</span><span class="n">sc</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
            <span class="k">while</span><span class="p">(</span><span class="n">y</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">y</span> <span class="o">&gt;=</span> <span class="n">i</span><span class="p">.</span><span class="n">sc</span> <span class="o">-</span> <span class="mi">4</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">shot</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]){</span>
                    <span class="n">shot</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
                    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="sc">' '</span> <span class="o">&lt;&lt;</span> <span class="n">y</span> <span class="o">&lt;&lt;</span> <span class="n">endl</span><span class="p">;</span>
                    <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">res</span><span class="p">;</span>
                    <span class="k">if</span><span class="p">(</span><span class="n">res</span> <span class="o">==</span> <span class="s">"sunk"</span><span class="p">)</span> <span class="n">sunk</span><span class="o">++</span><span class="p">;</span>
                    <span class="k">if</span><span class="p">(</span><span class="n">sunk</span> <span class="o">==</span> <span class="n">k</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span> 
                <span class="p">}</span>
                <span class="n">y</span><span class="o">--</span><span class="p">;</span>
            <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="Baekjoon Online Judge" /><category term="Ad Hoc" /><category term="NWERC" /><summary type="html"><![CDATA[A problem I solved during team practice. A really nice interactive problem I think. “How can you force the judge program to give you the output you want?” At the same time, the solution felt relatively simple once I went down that line of reasoning.]]></summary></entry><entry><title type="html">About Me</title><link href="https://nox-katena.github.io/about/" rel="alternate" type="text/html" title="About Me" /><published>2024-07-06T00:00:00+09:00</published><updated>2024-07-06T00:00:00+09:00</updated><id>https://nox-katena.github.io/about-me</id><content type="html" xml:base="https://nox-katena.github.io/about/"><![CDATA[<h2 id="profile">Profile</h2>

<ul>
  <li>Born 2003/06/06</li>
  <li>Lives in South Korea
&lt;!– - Can speak EN, KR</li>
  <li>I hate problem solving –&gt;</li>
</ul>

<!-- ## Main Interests

- Problem Solving/Competitive Programming
- Rhythm Games (Arcaea, Maimai, Project Sekai)
- Honkai Impact 3rd (I like seele)
- Honkai Starrail (I like seele)
- Yugioh (Orcust main although I quit w) -->

<h2 id="pscp-profiles">PS/CP Profiles</h2>

<ul>
  <li><a href="https://solved.ac/profile/seonah">solved.ac</a></li>
  <li><a href="https://codeforces.com/profile/Starchasm_Nyx">codeforces</a></li>
  <li><a href="https://atcoder.jp/users/starchasm_nyx">atcoder</a></li>
</ul>

<h2 id="projects">Projects</h2>

<ul>
  <li><a href="https://nox-katena.github.io/Minimum-Enclosing-Circle/">Visualization of the heuristic solution to the minimum enclosing circle problem</a></li>
  <li><a href="https://nox-katena.github.io/game-of-life-visualization/">Conway’s game of life visualization (too slow in large windows)</a></li>
</ul>

<h2 id="education">Education</h2>

<ul>
  <li>Hanyang University Department of Computer Science (Bachelor / 2022 ~ ongoing)</li>
</ul>

<h2 id="competition-history-honestly-nothing-impressive-here">Competition History (Honestly nothing impressive here)</h2>

<ul>
  <li>Participated in 2022 ICPC Seoul Regional Online Preliminary as team PuBG (73rd, 5 solved)</li>
  <li>Participated in 2022 ICPC Seoul Regional as team PuBG (56th, 3 solved)</li>
  <li>Participated in 2023 ICPC Seoul Regional Online Preliminary as team D-0.014 (92nd, 3 solved)</li>
  <li>Problem setter for 제1회 청소년 IT경시대회 hosted by KITPA</li>
  <li>Problem setter, KR-EN translator for The 10th Hanyang Collegiate Programming Contest</li>
  <li>Problem setter for spring and fall internal contests for ALOHA (Algorithm Club of Hanyang University) in 2023</li>
  <li>Participated in UCPC 2024</li>
</ul>

<!-- ## Game Profiles

- Arcaea (12.21, ID: 339078887)
- maimai (15502, code: 8017480066072)
- Project Sekai (JP, ID: 6650786935922692)
- Honkai Star Rail (Asia, UID: 809792131)
- Honkai Impact 3rd (Asia, UID: ) -->

<!-- ## Socials

- Discord : nox.katena
- Steam : mzen0314
- Email : seocho0606@gmail.com -->]]></content><author><name></name></author><category term="Life Update" /><summary type="html"><![CDATA[Profile]]></summary></entry><entry><title type="html">archive</title><link href="https://nox-katena.github.io/archive/" rel="alternate" type="text/html" title="archive" /><published>2024-07-06T00:00:00+09:00</published><updated>2024-07-06T00:00:00+09:00</updated><id>https://nox-katena.github.io/archive</id><content type="html" xml:base="https://nox-katena.github.io/archive/"><![CDATA[<p>11 개의 글을 지금까지 썼네요</p>

<pre><code class="language-vega-lite">{
  "data": { "url": "/assets/simple-jekyll-search/search.json" },
  "encoding": {
    "y": {"field": "date", "timeUnit": "month", "type": "ordinal"},
    "x": {"field": "date", "timeUnit": "year"},
    "color": {"field": "date", "aggregate": "count"}
  },
  "mark": "rect"
}
</code></pre>

<h2 id="oct-2024">Oct 2024</h2>

<ul>
  <li><a href="/2024/10/04/my-problems/">Solutions to Problems I Authored</a></li>
</ul>

<h2 id="aug-2024">Aug 2024</h2>

<ul>
  <li><a href="/2024/08/30/boj-31430/">/&lt;31430&gt; A+B - 투 스텝</a></li>
  <li><a href="/2024/08/11/abc-366/">Atcoder Beginner Contest 366 Review</a></li>
  <li><a href="/2024/08/10/boj-18288-18289/">/&lt;18288 + 18289&gt; 팀 연습 더</a></li>
  <li><a href="/2024/08/04/dp/">How I approach Dynamic Programming</a></li>
</ul>

<h2 id="jul-2024">Jul 2024</h2>

<ul>
  <li><a href="/2024/07/20/boj-30909/">/&lt;30909&gt; Lateral Damage</a></li>
  <li><a href="/tags/">tags</a></li>
  <li><a href="/comments/">comments</a></li>
  <li><a href="/2024/07/06/boj-1126/">/&lt;1126&gt; 같은 탑</a></li>
  <li><a href="/archive/">archive</a></li>
  <li><a href="/about/">About Me</a></li>
</ul>]]></content><author><name></name></author><summary type="html"><![CDATA[11 개의 글을 지금까지 썼네요]]></summary></entry><entry><title type="html">/&amp;lt;1126&amp;gt; 같은 탑</title><link href="https://nox-katena.github.io/2024/07/06/boj-1126/" rel="alternate" type="text/html" title="/&amp;lt;1126&amp;gt; 같은 탑" /><published>2024-07-06T00:00:00+09:00</published><updated>2024-07-06T00:00:00+09:00</updated><id>https://nox-katena.github.io/2024/07/06/boj-1126</id><content type="html" xml:base="https://nox-katena.github.io/2024/07/06/boj-1126/"><![CDATA[<p>새 블로그의 첫 풀이글이네요. 개인적으로 재밌었던 문제입니다. 풀이를 거히 다 떠올려놓고 엉뚱한 방향으로 새다가 지인이 “아니 그거 맞아” 라고 해줘서 풀긴 했지만… ㅋㅋㅋ… 유사 자력솔?</p>

<h2 id="문제"><a href="https://www.acmicpc.net/problem/1126">문제</a></h2>

<p>주어진 높이의 블록들 $N$개 중 원하는 블록들을 골라서 사용해 높이가 같은 두개의 탑을 얼마나 높게 만들 수 있는지 물어보는 문제다. ($1 \le N \le 50$, $1 \le h_i \le 500\;000$, 모든 블록의 높이의 합은 $500\;000$을 넘지 않는다.)</p>

<h2 id="풀이">풀이</h2>

<p>가장 직관적인 풀이로 냅색을 생각해 볼 수 있다. $dp(i, H_1, H_2)$를 $i$ 번째 블록까지 블록들을 사용해서 1번 탑의 높이가 $H_1$이고 2번 탑의 높이가 $H_2$인 상태로 만들 수 있는지로 정의하면 된다 (가능하면 $1$ 반환 아니면 $0$ 반환). 답은 $1 \le H_1 \le 500,000$ 을 만족하는 $H_1$ 중 $dp(N, H_1, H_1) = 1$인 가장 큰 $H_1$이 된다.</p>

<p>하지만 이를 그대로 구현할 경우 최악 $50 \times 500,000 \times 500,000$ 만큼의 연산과 공간이 필요하다. 무언가 다른 발상이 필요함을 알 수 있다.</p>

<p>사실 우리가 문제의 상태공간을 정의 함에 있어서 $H_1$과 $H_2$가 뭔지는 별로 중요하지 않다.</p>

<p>문제를 다르게 생각해보면 우리가 찾고자 하는건 $\lvert H_1 - H_2 \rvert = 0$ 일때 가능한 가장 높은 높이이다. 이제 $dp$ 를 다르게 정의해 볼 수 있다.</p>

<blockquote>
  <p>$dp(i, \lvert H_1 - H_2 \rvert) = i$ 번째 블록까지 블록들을 사용해서 두 탑의 높이 차이가 $\lvert H_1 - H_2 \rvert$ 인 두 탑을 만들때 더 높은 탑의 높이중 최댓값.</p>
</blockquote>

<p>따라서 이제 답은 $dp(N, 0)$이 된다.</p>

<p>$dp(i, w)$에서 가능한 상태 전이들을 생각해보자.</p>

<ol>
  <li>$dp(i, w)$이 불가능한 상태일 경우 전이는 불가능하다.</li>
  <li>$h_i &lt; w$ 라면 $dp(i+1, w-h_i) = \max(dp(i+1, w-h_i), dp(i, w))$ 이다. 더 낮은 탑에 $i$ 번째 블록을 올려 높이 차이를 줄였지만 대소 관계의 역전은 일어나지 않은 경우이다.</li>
  <li>$h_i \ge w$ 라면 $dp(i+1, h_i-w) = \max(dp(i+1, h_i-w), dp(i, w) + h_i - w)$ 이다. 더 낮은 탑에 $i$ 번째 블록을 올려 대소 관계의 역전이 일어난 경우이다.</li>
  <li>$dp(i+1, w) = \max(dp(i+1, w), dp(i, w))$ 이다. $i$ 번째 블록을 사용하지 않은 경우이다.</li>
  <li>$dp(i + 1, w + h_i) = \max(dp(i + 1, w + h_i), dp(i, w) + h_i)$ 이다. 더 큰 탑에 $i$ 번째 블록을 올리는 경우이다. $w + h_i \le 500,000$ 등으로 답이 될 수 없는 차이로의 전이를 방지해야 한다.</li>
</ol>

<p>이제 1~5의 과정을 코드로 구현하면 된다.</p>

<h2 id="코드-c">코드 (c++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="cp">#define endl '\n'
</span>
<span class="cp">#define PRECISION 69
</span>
<span class="cp">#define fr first
#define sc second
</span>
<span class="cp">#define all(v) v.begin(), v.end()
#define compress(v) sort(all(v)), v.erase(unique(all(v)), v.end())
</span>
<span class="k">using</span> <span class="n">ll</span> <span class="o">=</span> <span class="kt">long</span> <span class="kt">long</span><span class="p">;</span>
<span class="k">using</span> <span class="n">ld</span> <span class="o">=</span> <span class="kt">long</span> <span class="kt">double</span><span class="p">;</span>

<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">ll</span><span class="p">,</span><span class="n">ll</span><span class="o">&gt;</span> <span class="n">pll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">INF</span> <span class="o">=</span> <span class="mh">0x3f3f3f3f</span><span class="p">;</span>
<span class="k">const</span> <span class="n">ll</span> <span class="n">LLINF</span> <span class="o">=</span> <span class="mi">4'500'000'000'000'000'000</span><span class="p">;</span>
<span class="k">const</span> <span class="n">ll</span> <span class="n">MOD</span> <span class="o">=</span> <span class="mi">1'000'000'007</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">dp</span><span class="p">[</span><span class="mi">55</span><span class="p">][</span><span class="mi">505050</span><span class="p">];</span> <span class="c1">// |a - b|</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
    <span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">cout</span><span class="p">.</span><span class="n">setf</span><span class="p">(</span><span class="n">ios</span><span class="o">::</span><span class="n">fixed</span><span class="p">);</span> <span class="n">cout</span><span class="p">.</span><span class="n">precision</span><span class="p">(</span><span class="n">PRECISION</span><span class="p">);</span>

    <span class="kt">int</span> <span class="n">N</span><span class="p">;</span> <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">N</span><span class="p">;</span>
    <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="n">H</span><span class="p">(</span><span class="n">N</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span> <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <span class="p">}</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;=</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">w</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">w</span><span class="o">&lt;=</span><span class="mi">500000</span><span class="p">;</span> <span class="n">w</span><span class="o">++</span><span class="p">){</span>
            <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">w</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">dp</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
        <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">w</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">w</span><span class="o">&lt;=</span><span class="mi">500000</span><span class="p">;</span> <span class="n">w</span><span class="o">++</span><span class="p">){</span>
            <span class="k">if</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">w</span><span class="p">]</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">w</span><span class="p">){</span>
                <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">w</span> <span class="o">-</span> <span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">w</span> <span class="o">-</span> <span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]],</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">w</span><span class="p">]);</span>
            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
                <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="n">w</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="n">w</span><span class="p">],</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">w</span><span class="p">]</span> <span class="o">+</span> <span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="n">w</span><span class="p">);</span>
            <span class="p">}</span>
            <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">w</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">w</span><span class="p">],</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">w</span><span class="p">]);</span>
            <span class="k">if</span><span class="p">(</span><span class="n">w</span> <span class="o">+</span> <span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="mi">500000</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">w</span> <span class="o">+</span> <span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">w</span> <span class="o">+</span> <span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]],</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">w</span><span class="p">]</span> <span class="o">+</span> <span class="n">H</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="o">?</span> <span class="o">-</span><span class="mi">1</span> <span class="o">:</span> <span class="n">dp</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">0</span><span class="p">]);</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name></name></author><category term="Baekjoon Online Judge" /><category term="Dynamic Programming" /><summary type="html"><![CDATA[새 블로그의 첫 풀이글이네요. 개인적으로 재밌었던 문제입니다. 풀이를 거히 다 떠올려놓고 엉뚱한 방향으로 새다가 지인이 “아니 그거 맞아” 라고 해줘서 풀긴 했지만… ㅋㅋㅋ… 유사 자력솔?]]></summary></entry><entry><title type="html">comments</title><link href="https://nox-katena.github.io/comments/" rel="alternate" type="text/html" title="comments" /><published>2024-07-06T00:00:00+09:00</published><updated>2024-07-06T00:00:00+09:00</updated><id>https://nox-katena.github.io/comments</id><content type="html" xml:base="https://nox-katena.github.io/comments/"><![CDATA[<p>방명록은 여기에 달아주세요!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[방명록은 여기에 달아주세요!]]></summary></entry></feed>