<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Songer</title>
  <icon>https://www.gravatar.com/avatar/9a05f954b2fc05ba0832bb80ced32187</icon>
  <subtitle>念念不忘，必有回响</subtitle>
  <link href="https://blog.songer.xyz/atom.xml" rel="self"/>
  
  <link href="https://blog.songer.xyz/"/>
  <updated>2021-12-14T16:39:44.681Z</updated>
  <id>https://blog.songer.xyz/</id>
  
  <author>
    <name>Songer</name>
    <email>weixiao.song@outlook.com</email>
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Second Large Rectangle [DP]</title>
    <link href="https://blog.songer.xyz/Code/Second%20Large%20Rectangle%20[DP]/"/>
    <id>https://blog.songer.xyz/Code/Second%20Large%20Rectangle%20[DP]/</id>
    <published>2019-08-26T13:31:05.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="second-large-rectangle-dp">Second Large Rectangle [DP]</h1><h2 id="牛客-第二场-h">2019牛客 第二场 H</h2><span id="more"></span><p>题目来源：<a href="https://ac.nowcoder.com/acm/contest/882/H"><em>Nowcoder</em></a></p><h2 id="分析">分析</h2><p>题目要求“次大全1子矩阵”。其实我们将最大全1子矩阵的代码略加改动便可得到答案。</p><p>由于我们之前算的是最大子矩阵，所以在代码里，我们每次根据<span class="math inline">\(i, j\)</span>和<span class="math inline">\(h_{i,j}\)</span>算出<span class="math inline">\(l_{i,j}\)</span>,<span class="math inline">\(r_{i,j}\)</span>时，都只用到了<span class="math inline">\(h_{i,j} \times (r_{i,j} - l_{i,j} + 1)\)</span>这么一种情况去更新答案。也就是说，我们只考虑了最大的情况。那么，这次，我们只需要将<span class="math inline">\((h_{i,j} - 1) \times (r_{i,j} - l_{i,j} + 1)\)</span>和<span class="math inline">\(h_{i,j} \times (r_{i,j} - l_{i,j})\)</span>考虑进去就行了。此时我们只需维护最大值和次大值两个值即可。</p><p>但是，还有一种特殊情况。当同一行几个相邻点<span class="math inline">\(h_{i,j}\)</span>相同时，同一答案可能被计算多次。在计算最大子矩阵时不需要在乎此问题，但在这里就需要考虑了。我们可以发现，当几个点在同一行时，它们的<span class="math inline">\(l_{i,j}\)</span>和<span class="math inline">\(r_{i,j}\)</span>在一起能共同决定整个矩形。也就是说，我们只要将<span class="math inline">\((l_{i,j},r_{i,j})\)</span>扔到<code>set</code>里即可。当然，<code>set</code>只需判断在同一行的情况。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;set&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 1010</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> a[MAXN][MAXN];</span><br><span class="line"><span class="keyword">int</span> h[MAXN][MAXN];</span><br><span class="line"><span class="keyword">int</span> l[MAXN], r[MAXN];</span><br><span class="line"></span><br><span class="line">set&lt;pair&lt;<span class="keyword">int</span>, <span class="keyword">int</span>&gt;&gt; s;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n, m;</span><br><span class="line">    <span class="keyword">while</span> (~<span class="built_in">scanf</span>(<span class="string">&quot;%d%d&quot;</span>, &amp;n, &amp;m))</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="built_in">getchar</span>();</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">                a[i][j] = <span class="built_in">getchar</span>() - <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">                <span class="keyword">if</span> (a[i][j]==<span class="number">1</span>)</span><br><span class="line">                    h[i][j] = h[i<span class="number">-1</span>][j] + <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">else</span></span><br><span class="line">                    h[i][j] = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">int</span> ans = <span class="number">0</span>, maxn = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            s.<span class="built_in">clear</span>();</span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">            &#123;</span><br><span class="line">                l[j] = j;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">while</span> ( l[j]&gt;<span class="number">1</span> &amp;&amp; h[i][ l[j] - <span class="number">1</span> ] &gt;= h[i][j])</span><br><span class="line">                    l[j] = l[ l[j] - <span class="number">1</span>];</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = m; j&gt;=<span class="number">1</span>; j--)</span><br><span class="line">            &#123;</span><br><span class="line">                r[j] = j;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">while</span> ( r[j]&lt;m &amp;&amp; h[i][ r[j] + <span class="number">1</span> ] &gt;= h[i][j])</span><br><span class="line">                    r[j] = r[ r[j] + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">                <span class="comment">// cout &lt;&lt; l[j] &lt;&lt; &quot; &quot; &lt;&lt; r[j] &lt;&lt; &quot; &quot; &lt;&lt; h[i][j] &lt;&lt; endl;</span></span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (s.<span class="built_in">find</span>(pair&lt;<span class="keyword">int</span>, <span class="keyword">int</span>&gt;(l[j], r[j])) == s.<span class="built_in">end</span>())</span><br><span class="line">                &#123;</span><br><span class="line">                    s.<span class="built_in">insert</span>(pair&lt;<span class="keyword">int</span>, <span class="keyword">int</span>&gt;(l[j], r[j]));</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">int</span> m = (r[j] - l[j] + <span class="number">1</span>) * h[i][j];</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">if</span> (m &gt; maxn)</span><br><span class="line">                    &#123;</span><br><span class="line">                        ans = maxn;</span><br><span class="line">                        maxn = m;</span><br><span class="line"></span><br><span class="line">                        <span class="keyword">if</span> (m - h[i][j] &gt; ans)</span><br><span class="line">                            ans = m - h[i][j];</span><br><span class="line">                        <span class="keyword">if</span> (m - (r[j] - l[j] + <span class="number">1</span>) &gt; ans)</span><br><span class="line">                            ans = m - (r[j] - l[j] + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line">                    &#125;<span class="keyword">else</span> <span class="keyword">if</span> (m &gt; ans)</span><br><span class="line">                        ans = m;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;%d\n&quot;</span>, ans);</span><br><span class="line">        <span class="comment">// cout &lt;&lt; ans &lt;&lt; endl;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;second-large-rectangle-dp&quot;&gt;Second Large Rectangle [DP]&lt;/h1&gt;
&lt;h2 id=&quot;牛客-第二场-h&quot;&gt;2019牛客 第二场 H&lt;/h2&gt;</summary>
    
    
    
    <category term="code" scheme="https://blog.songer.xyz/categories/code/"/>
    
    
    <category term="test" scheme="https://blog.songer.xyz/tags/test/"/>
    
  </entry>
  
  <entry>
    <title>最大全1子矩阵 [DP]</title>
    <link href="https://blog.songer.xyz/Code/%E6%9C%80%E5%A4%A7%E5%85%A81%E5%AD%90%E7%9F%A9%E9%98%B5%20[DP]/"/>
    <id>https://blog.songer.xyz/Code/%E6%9C%80%E5%A4%A7%E5%85%A81%E5%AD%90%E7%9F%A9%E9%98%B5%20[DP]/</id>
    <published>2019-08-26T07:26:26.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="最大全1子矩阵-dp">最大全1子矩阵 [DP]</h1><h2 id="poj-3494">POJ 3494</h2><span id="more"></span><p>题目来源：<a href="http://poj.org/problem?id=3494"><em>POJ</em></a></p><h2 id="分析">分析</h2><p>这也算是一个十分经典的DP题了。给定一个01矩阵，要求求出最大的全1子矩阵。</p><p>首先，我们可以通过<span class="math inline">\(O(n^2)\)</span>的预处理算出<span class="math inline">\(h[i][j]\)</span>，代表的是<span class="math inline">\(i,j\)</span>坐标的点 向上的连续<code>1</code>的数目。</p><p>然后，我们采用“悬线法”来计算答案。假如<span class="math inline">\(l_i\)</span>是最靠左的令<span class="math inline">\(h[x] \geq h[i], (l_i \leq x \leq i)\)</span>,<span class="math inline">\(r_i\)</span>同理。那么<span class="math inline">\((r_i - l_i + 1) \times 1\)</span>就是高度为<span class="math inline">\(h_i\)</span>且<span class="math inline">\(i,j\)</span>在底边上的最大矩形。</p><p>那么，问题就在于如何求<span class="math inline">\(l_i\)</span>和<span class="math inline">\(r_i\)</span>了。如果我们暴力地去求，那么整个算法地时间复杂度就是<span class="math inline">\(O(n^3)\)</span>，明显太慢。在这里，我们就要用DP的方法来实现了。</p><p>我们令所有的<span class="math inline">\(j&lt;i\)</span>,<span class="math inline">\(l_j\)</span>都已经算出，那么，当<span class="math inline">\(h_j &lt; h_i\)</span>时，那么，我们可以保证<span class="math inline">\(h_{l_j} &lt; h_i\)</span>。然后，我们可以继续比较<span class="math inline">\(h_{h_j - 1}\)</span>和<span class="math inline">\(h_i\)</span>。这样，我们可以快速地算出<span class="math inline">\(l_i\)</span>，<span class="math inline">\(r_i\)</span>。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 2010</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> a[MAXN][MAXN];</span><br><span class="line"><span class="keyword">int</span> h[MAXN][MAXN];</span><br><span class="line"><span class="keyword">int</span> l[MAXN], r[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">getint</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">char</span> c = <span class="built_in">getchar</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (c&lt;<span class="string">&#x27;0&#x27;</span> || c&gt;<span class="string">&#x27;9&#x27;</span>)</span><br><span class="line">        c = <span class="built_in">getchar</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> ret = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (c&gt;=<span class="string">&#x27;0&#x27;</span> &amp;&amp; c&lt;=<span class="string">&#x27;9&#x27;</span>)</span><br><span class="line">        ret = ret * <span class="number">10</span> + c - <span class="string">&#x27;0&#x27;</span>, c = <span class="built_in">getchar</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> ret;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="comment">// ios::sync_with_stdio(false);</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> n, m;</span><br><span class="line">    <span class="keyword">while</span> (~<span class="built_in">scanf</span>(<span class="string">&quot;%d%d&quot;</span>, &amp;n, &amp;m))</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">                a[i][j] = <span class="built_in">getint</span>();</span><br><span class="line">                <span class="comment">// scanf(&quot;%d&quot;,&amp;a[i][j]);</span></span><br><span class="line">                <span class="comment">// cin &gt;&gt; a[i][j];</span></span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">                <span class="keyword">if</span> (a[i][j]==<span class="number">1</span>)</span><br><span class="line">                    h[i][j] = h[i<span class="number">-1</span>][j] + <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">else</span></span><br><span class="line">                    h[i][j] = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">            &#123;</span><br><span class="line">                l[j] = j;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">while</span> ( l[j]&gt;<span class="number">1</span> &amp;&amp; h[i][ l[j] - <span class="number">1</span> ] &gt;= h[i][j])</span><br><span class="line">                    l[j] = l[ l[j] - <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = m; j&gt;=<span class="number">1</span>; j--)</span><br><span class="line">            &#123;</span><br><span class="line">                r[j] = j;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">while</span> ( r[j]&lt;m &amp;&amp; h[i][ r[j] + <span class="number">1</span> ] &gt;= h[i][j])</span><br><span class="line">                    r[j] = r[ r[j] + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">                ans = <span class="built_in">max</span>(ans, (r[j] - l[j] + <span class="number">1</span>) * h[i][j] );</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;%d\n&quot;</span>, ans);</span><br><span class="line">        <span class="comment">// cout &lt;&lt; ans &lt;&lt; endl;</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;最大全1子矩阵-dp&quot;&gt;最大全1子矩阵 [DP]&lt;/h1&gt;
&lt;h2 id=&quot;poj-3494&quot;&gt;POJ 3494&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Remainder Problem [思维题]</title>
    <link href="https://blog.songer.xyz/Code/Remainder%20Problem%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/"/>
    <id>https://blog.songer.xyz/Code/Remainder%20Problem%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/</id>
    <published>2019-08-25T05:45:38.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="remainder-problem-思维题">Remainder Problem [思维题]</h1><h2 id="cf-edu-71-f">CF Edu 71 F</h2><span id="more"></span><p>题目来源：<a href="https://codeforces.com/contest/1207/problem/F"><em>Codeforces</em></a></p><h2 id="分析">分析</h2><p>题目给了长度为<span class="math inline">\(5 \times 10^5\)</span>的全<span class="math inline">\(0\)</span>数组，然后给出了两种操作：</p><ol type="1"><li><code>1 x y</code>: 令<span class="math inline">\(a_x\)</span>加<span class="math inline">\(y\)</span>；</li><li><code>2 x y</code>: 求下标<span class="math inline">\(i\)</span>满足<span class="math inline">\(i \equiv y (\mod x)\)</span>的<span class="math inline">\(a_i\)</span>的和。</li></ol><p>假如我们直接维护一个<span class="math inline">\(a_i\)</span>数组，那么如果我们暴力进行操作<span class="math inline">\(2\)</span>的话，时间复杂度显然是<span class="math inline">\(O\left(\frac{x}{x} \right)\)</span>的。当<span class="math inline">\(x^2&gt;N\)</span>时，该操作是<span class="math inline">\(O(n^{\frac{1}{2}})\)</span>的。但是，当<span class="math inline">\(x\)</span>较小时呢？我们可以直接维护一个<span class="math inline">\(ans[x][y]\)</span>数组，在每次进行操作<span class="math inline">\(1\)</span>时，对所有影响的数组进行更新即可。因为<span class="math inline">\(x^2 \leq N\)</span>，所以插入操作也是<span class="math inline">\(O(n^{\frac{1}{2}})\)</span>的。所以，我们最后得到了一个<span class="math inline">\(O(q \sqrt{n})\)</span>的算法。</p><p>而实际上，由于大部分<span class="math inline">\(x\)</span>都是不等于<span class="math inline">\(\sqrt(n)\)</span>的，所以实际的时间要比<span class="math inline">\(O(q \sqrt{n})\)</span>要小，所以可以通过该题。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 500000</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> K 750</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> a[MAXN + <span class="number">1</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans[K+<span class="number">1</span>][K];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> q;</span><br><span class="line">    cin &gt;&gt; q;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=q; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> op, x, y;</span><br><span class="line">        cin &gt;&gt; op;</span><br><span class="line">        cin &gt;&gt; x &gt;&gt; y;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (op==<span class="number">1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            a[x] += y;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=K; j++)</span><br><span class="line">                ans[j][x % j] += y;</span><br><span class="line">        &#125;<span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (x&gt;K)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">long</span> <span class="keyword">long</span> tmp = <span class="number">0</span>;</span><br><span class="line">                <span class="keyword">for</span> (<span class="keyword">int</span> j = y; j&lt;=MAXN; j+=x)</span><br><span class="line">                    tmp += a[j];</span><br><span class="line">                cout &lt;&lt; tmp &lt;&lt; endl;</span><br><span class="line">            &#125;<span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                cout &lt;&lt; ans[x][y] &lt;&lt; endl;</span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;remainder-problem-思维题&quot;&gt;Remainder Problem [思维题]&lt;/h1&gt;
&lt;h2 id=&quot;cf-edu-71-f&quot;&gt;CF Edu 71 F&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Integration [数学]</title>
    <link href="https://blog.songer.xyz/Code/Integration%20[%E6%95%B0%E5%AD%A6]/"/>
    <id>https://blog.songer.xyz/Code/Integration%20[%E6%95%B0%E5%AD%A6]/</id>
    <published>2019-08-25T02:12:45.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="integration-数学">Integration [数学]</h1><h2 id="牛客-第一场-b">2019牛客 第一场 B</h2><span id="more"></span><p>题目来源：<a href="https://ac.nowcoder.com/acm/contest/881/B"><em>Nowcoder</em></a></p><h2 id="分析">分析</h2><p>这道题就是一道纯粹的数学题。。题目要求计算如下公式：</p><p><span class="math display">\[ \frac{1}{\pi} \int_0^{\infty} \frac{1}{\prod_{i=1}^n (a_i^2 + x^2)} dx \]</span></p><p>首先，我们先假设一个变量：</p><p><span class="math display">\[ c_i = \frac{1}{\prod_{j \neq i}(a_j^2 - a_i^2)}\]</span></p><p>那么，其实第一个公式便可以进行如下的化简：</p><p><span class="math display">\[\begin{aligned}&amp;\ \frac{1}{\pi} \int_0^{+\infty} \frac{1}{\prod_{i=1}^n (a_i^2 + x^2)} dx \\= &amp;\ \frac{1}{\pi} \int_0^{+\infty} \sum \frac{c_i}{a_i^2 + x^2} dx (\text{此处由题解给出，我实在不会证}) \\= &amp;\ \frac{1}{\pi} \sum \int_0^{+\infty} \frac{c_i}{a_i^2 + x^2} dx \\= &amp;\ \frac{1}{\pi} \sum \left( \frac{c_i}{a_i} \times \left. \arctan(x/a_i) \right|_0^{+\infty} \right) \\= &amp;\ \frac{1}{\pi} \sum \frac{c_i}{2a_i} \pi  \end{aligned}\]</span></p><h3 id="实现细节">实现细节</h3><p>这道题主要由两个细节问题：</p><ol type="1"><li>不能频繁的进行取乘法逆元操作，否则会超时。应先乘在一起，然后再求逆元。</li><li>注意<span class="math inline">\(a_j^2 - a_i^2\)</span>可能为负数。</li></ol><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 1010</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MOD 1000000007</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">pow</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x, <span class="keyword">long</span> <span class="keyword">long</span> n, <span class="keyword">long</span> <span class="keyword">long</span> mod)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> ret = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> t = x % mod;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (n)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (n &amp; <span class="number">1</span>)</span><br><span class="line">            ret = ret * t % mod;</span><br><span class="line"></span><br><span class="line">        n /= <span class="number">2</span>;</span><br><span class="line">        t = t * t % mod;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> ret;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">reverse</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x, <span class="keyword">long</span> <span class="keyword">long</span> mod)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">pow</span>(x, mod - <span class="number">2</span>, mod);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> a[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    <span class="keyword">while</span> (cin &gt;&gt; n)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">            cin &gt;&gt; a[i];</span><br><span class="line"></span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">long</span> <span class="keyword">long</span> tmp = <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=n; j++)</span><br><span class="line">                <span class="keyword">if</span> (i!=j)</span><br><span class="line">                &#123;</span><br><span class="line">                    <span class="keyword">long</span> <span class="keyword">long</span> m = a[j] * a[j] - a[i] * a[i];</span><br><span class="line">                    m %= MOD;</span><br><span class="line">                    <span class="keyword">if</span> (m&lt;<span class="number">0</span>)</span><br><span class="line">                        m += MOD;</span><br><span class="line">                    tmp = tmp * m % MOD;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">            tmp = tmp * <span class="number">2</span> * a[i] % MOD;</span><br><span class="line"></span><br><span class="line">            ans = (ans + <span class="built_in">reverse</span>(tmp, MOD)) % MOD;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; ans &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;integration-数学&quot;&gt;Integration [数学]&lt;/h1&gt;
&lt;h2 id=&quot;牛客-第一场-b&quot;&gt;2019牛客 第一场 B&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>ABBA [DP]</title>
    <link href="https://blog.songer.xyz/Code/ABBA%20[DP]/"/>
    <id>https://blog.songer.xyz/Code/ABBA%20[DP]/</id>
    <published>2019-08-24T04:40:45.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="abba-dp">ABBA [DP]</h1><h2 id="牛客多校-第一场-e">2019牛客多校 第一场 E</h2><span id="more"></span><p>题目来源：<a href="https://ac.nowcoder.com/acm/contest/881/E"><em>Nowcoder</em></a></p><h2 id="分析">分析</h2><p>我们可以把这个题目看作一个已经拥有<span class="math inline">\(n\)</span>个<code>AB</code>和<span class="math inline">\(m\)</span>个<code>BA</code>，把它放入一个数组的过程。那么，题目即为要求有多少种放法。</p><p>这个题目的主要限制在于<code>AB</code>中的<code>A</code>一定先于<code>B</code>放入，<code>BA</code>同理。那么，我们可以发现，已放置的<code>A</code>和<code>B</code>的放置顺序对答案没有影响。即，只有“是否已放置”有影响，“放置在哪里”没有影响。那么，很明显，这道题便是一个DP了。我们使用<code>dp[i][j]</code>记录答案，其中<code>i</code>是放置了多少个<code>A</code>，<code>j</code>是放置对了多少个<code>B</code>。那么，很明显，我们需要满足以下两个条件：</p><ol type="1"><li><span class="math inline">\(i \leq n + j\)</span>;</li><li><span class="math inline">\(j \leq m + i\)</span>.</li></ol><p>在以上两个条件下进行状态转移即可。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 1010</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MOD 1000000007</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dp[<span class="number">2</span> * MAXN][<span class="number">2</span> * MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n, m;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">while</span> (cin &gt;&gt; n &gt;&gt; m)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;=n+m; i++)</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j&lt;=n+m; j++)</span><br><span class="line">                dp[i][j] = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        dp[<span class="number">0</span>][<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;=n + m; i++)</span><br><span class="line">            <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">0</span>; j&lt;=m + n; j++)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (i &lt; n + j)</span><br><span class="line">                    dp[i+<span class="number">1</span>][j] = (dp[i+<span class="number">1</span>][j] + dp[i][j]) % MOD;</span><br><span class="line">                <span class="keyword">if</span> (j &lt; m + i)</span><br><span class="line">                    dp[i][j+<span class="number">1</span>] = (dp[i][j+<span class="number">1</span>] + dp[i][j]) % MOD;</span><br><span class="line"></span><br><span class="line">                <span class="comment">// cout &lt;&lt; i &lt;&lt; &quot; &quot; &lt;&lt; j &lt;&lt; &quot; &quot; &lt;&lt; dp[i][j] &lt;&lt; endl;</span></span><br><span class="line">            &#125;   </span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; dp[n+m][n+m] &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;abba-dp&quot;&gt;ABBA [DP]&lt;/h1&gt;
&lt;h2 id=&quot;牛客多校-第一场-e&quot;&gt;2019牛客多校 第一场 E&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Equivalent Prefixes [笛卡尔树]</title>
    <link href="https://blog.songer.xyz/Code/Equivalent%20Prefixes%20[%E7%AC%9B%E5%8D%A1%E5%B0%94%E6%A0%91]/"/>
    <id>https://blog.songer.xyz/Code/Equivalent%20Prefixes%20[%E7%AC%9B%E5%8D%A1%E5%B0%94%E6%A0%91]/</id>
    <published>2019-08-23T14:01:11.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="equivalent-prefixes-笛卡尔树">Equivalent Prefixes [笛卡尔树]</h1><h2 id="牛客多校-第一场-a">2019牛客多校 第一场 A</h2><span id="more"></span><p>题目来源：<a href="https://ac.nowcoder.com/acm/contest/881/A"><em>Nowcoder</em></a></p><h2 id="分析">分析</h2><p>题目给定了<code>a[]</code>,<code>b[]</code>，要求找出最大的<span class="math inline">\(p \leq n\)</span>满足<span class="math inline">\([a_1, a_2, ... , a_p]\)</span>和<span class="math inline">\([b_1, b_2, ... ,b_p]\)</span>是“相等”的。相等在这个题目中的定义为：对于长度都为<code>n</code>的序列<code>u[]</code>和<code>v[]</code>，任意的<span class="math inline">\(1 \leq 1 \leq l \leq r \leq n\)</span>都能使<span class="math inline">\(RMQ(u, l, r) = RMQ(v, l, r)\)</span>。<span class="math inline">\(RMQ()\)</span>即为区间最小值的下标。</p><p>我们先来研究如何判断两个序列是“相等”的。很明显，由于对于任意的<span class="math inline">\(l\)</span>和<span class="math inline">\(r\)</span>，<span class="math inline">\(RMQ(l,r)\)</span>都相同，那么这两个序列中每个数的相对顺序都是一样的。其实，这也就代表着，这两个序列构造出的<a href="http://songer.xyz/index.php/archives/382/"><em>笛卡尔树</em></a>的结构是相同的。</p><p>但是，答案要求的是“最小的满足条件的<span class="math inline">\(p\)</span>”。如果我们每次都对笛卡尔树的结构做一次比较的话，由于每次要比较所有的点，所以时间为<span class="math inline">\(O(n^2)\)</span>，肯定超时了。那么，还有什么能够让我们确定这两个笛卡尔树相同呢？笛卡尔树构造中的单调栈。单调栈能够唯一地反映当前插入的点的位置，只要每次的单调栈相同，那么生成的笛卡尔树一定相同。而且实际上，由于单调栈的长度变化能唯一的反映出插入点位置的变化，所以只需要每次比较单调栈的长度即可。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stack&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> L 0</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> R 1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 100100</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">int</span> val;</span><br><span class="line">    Node *fa;</span><br><span class="line">    Node *son[<span class="number">2</span>];</span><br><span class="line"></span><br><span class="line">    <span class="built_in">Node</span>(<span class="keyword">int</span> val = <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">this</span>-&gt;val = val;</span><br><span class="line">        fa = <span class="literal">NULL</span>;</span><br><span class="line">        son[L] = <span class="literal">NULL</span>;</span><br><span class="line">        son[R] = <span class="literal">NULL</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">CartesianTree</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    stack&lt;Node *&gt; s;</span><br><span class="line">    Node *root;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">CartesianTree</span>()</span><br><span class="line">    &#123;</span><br><span class="line">        root = <span class="literal">NULL</span>;</span><br><span class="line">        s = stack&lt;Node *&gt;();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">insert</span><span class="params">(<span class="keyword">int</span> a)</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        Node *next = <span class="keyword">new</span> <span class="built_in">Node</span>(a);</span><br><span class="line">        Node *last = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> (!s.<span class="built_in">empty</span>())</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (s.<span class="built_in">top</span>()-&gt;val &lt; next-&gt;val)</span><br><span class="line">            &#123;</span><br><span class="line">                Node *tmp = s.<span class="built_in">top</span>();</span><br><span class="line">                <span class="keyword">if</span> (tmp-&gt;son[R])</span><br><span class="line">                    tmp-&gt;son[R]-&gt;fa = next;</span><br><span class="line">                next-&gt;son[L] = tmp-&gt;son[R];</span><br><span class="line">                tmp-&gt;son[R] = next;</span><br><span class="line">                next-&gt;fa = tmp;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            last = s.<span class="built_in">top</span>();</span><br><span class="line">            s.<span class="built_in">pop</span>();</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (s.<span class="built_in">empty</span>() &amp;&amp; last)</span><br><span class="line">        &#123;</span><br><span class="line">            next-&gt;son[L] = last;</span><br><span class="line">            last-&gt;fa = next;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (last==root)</span><br><span class="line">                root = next;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (root==<span class="literal">NULL</span>)</span><br><span class="line">            root = next;</span><br><span class="line"></span><br><span class="line">        s.<span class="built_in">push</span>(next);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> a[MAXN], b[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (cin&gt;&gt;n)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;n; i++)</span><br><span class="line">            cin &gt;&gt; a[i];</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;n; i++)</span><br><span class="line">            cin &gt;&gt; b[i];</span><br><span class="line"></span><br><span class="line">        CartesianTree x, y;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">int</span> i;</span><br><span class="line">        <span class="keyword">for</span> (i = <span class="number">0</span>; i&lt;n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            x.<span class="built_in">insert</span>(a[i]);</span><br><span class="line">            y.<span class="built_in">insert</span>(b[i]);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (x.s.<span class="built_in">size</span>() != y.s.<span class="built_in">size</span>())</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; i &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;equivalent-prefixes-笛卡尔树&quot;&gt;Equivalent Prefixes [笛卡尔树]&lt;/h1&gt;
&lt;h2 id=&quot;牛客多校-第一场-a&quot;&gt;2019牛客多校 第一场 A&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>[学习笔记]笛卡尔树</title>
    <link href="https://blog.songer.xyz/Code/[%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0]%E7%AC%9B%E5%8D%A1%E5%B0%94%E6%A0%91/"/>
    <id>https://blog.songer.xyz/Code/[%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0]%E7%AC%9B%E5%8D%A1%E5%B0%94%E6%A0%91/</id>
    <published>2019-08-22T08:00:35.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="学习笔记笛卡尔树">[学习笔记]笛卡尔树</h1><blockquote><p>不知不觉，这估计是自从我用这个博客以来“停更”最长的了。各种奇奇怪怪的原因综合在一起导致连续三个月没有写任何博客。其实过去半年感觉投入到ACM的时间就有点少。最近几天也是。话说笛卡尔树我从前一直没听说过（汗），最近比赛完后看题解才知道这玩意儿。。。</p></blockquote><span id="more"></span><h2 id="介绍">介绍</h2><p><strong>笛卡尔树</strong>是一种特定<strong>二叉树</strong>数据结构，可由数列构造，在<strong>范围最值查</strong>、<strong>范围top k查询（range top k queries）</strong>等问题上有广泛应用。它具有堆的有序性，中序遍历可以输出原数列。笛卡尔树结构由Vuillmin(1980)在解决范围搜索的几何数据结构问题时提出。从数列中构造一棵笛卡尔树可以线性时间完成，需要采用基于栈的算法来找到在该数列中的所有最近小数。</p><p>于<a href="https://zh.wikipedia.org/wiki/%E7%AC%9B%E5%8D%A1%E5%B0%94%E6%A0%91"><em>维基百科</em></a>上的图例能很好地展现它的性质：</p><figure><img src="/images//In%20Blog/cartesian-tree-1.png" alt="笛卡尔树" /><figcaption aria-hidden="true">笛卡尔树</figcaption></figure><h2 id="实现细节">实现细节</h2><h3 id="构造">构造</h3><p>我们固然可以通过一个个插入来构造笛卡尔树，虽然平均时间复杂度为<span class="math inline">\(O(n \log n)\)</span>，但是在成链的条件下会退化为<span class="math inline">\(O(n^2)\)</span>。而若我们使用单调栈，则可以直接实现<span class="math inline">\(O(n)\)</span>的时间复杂度。</p><p>使用单调栈构造的主要思路是：维护一个存储了<strong>从根节点一直走右儿子到当前插入节点的所有节点</strong>的栈。比如当我们插入完了上图中的<span class="math inline">\(10\)</span>时，单调栈存储的便为<span class="math inline">\([1, 8, 10]\)</span>（此时<span class="math inline">\(8\)</span>还是<span class="math inline">\(1\)</span>的右儿子）。我们令栈顶的值为<code>now</code>，然后我们尝试取插入下一个数<code>next</code>。此时有如下三种情况：</p><ol type="1"><li><span class="math inline">\(next &gt; now\)</span>: 此时我们直接令<code>next</code>为<code>now</code>的右儿子，并且令<code>now</code>原来的右儿子为<code>next</code>的左儿子；</li><li><span class="math inline">\(next &lt; now\)</span>: 将栈顶取出，然后再令当前栈的栈顶为<code>now</code>；</li><li>栈为空：令当前根节点的父亲指向<code>next</code>，并将<code>next</code>设为根节点。</li></ol><p>代码实现如下： <figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line">stack&lt;Node*&gt; s;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">CartesianTree</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    Node *root;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">CartesianTree</span>(<span class="keyword">int</span> *a, <span class="keyword">int</span> n)</span><br><span class="line">    &#123;</span><br><span class="line">        s = stack&lt;Node *&gt;();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            Node *next = <span class="keyword">new</span> <span class="built_in">Node</span>(a[i]);</span><br><span class="line">            Node *last = <span class="literal">NULL</span>;</span><br><span class="line">            <span class="keyword">while</span> (!s.<span class="built_in">empty</span>())</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (s.<span class="built_in">top</span>()-&gt;val &lt; next-&gt;val)</span><br><span class="line">                &#123;</span><br><span class="line">                    Node *tmp = s.<span class="built_in">top</span>();</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">if</span> (tmp-&gt;son[R])</span><br><span class="line">                        tmp-&gt;son[R]-&gt;fa = next;</span><br><span class="line">                    next-&gt;son[L] = tmp-&gt;son[R];</span><br><span class="line"></span><br><span class="line">                    tmp-&gt;son[R] = next;</span><br><span class="line">                    next-&gt;fa = tmp;</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                last = s.<span class="built_in">top</span>();</span><br><span class="line">                s.<span class="built_in">pop</span>();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (s.<span class="built_in">empty</span>() &amp;&amp; last)</span><br><span class="line">            &#123;</span><br><span class="line">                next-&gt;son[L] = last;</span><br><span class="line">                last-&gt;fa = next;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            s.<span class="built_in">push</span>(next);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> (!s.<span class="built_in">empty</span>())</span><br><span class="line">        &#123;</span><br><span class="line">            root = s.<span class="built_in">top</span>();</span><br><span class="line">            s.<span class="built_in">pop</span>();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></p><h2 id="例题">例题</h2><h3 id="hdu-1506">hdu 1506</h3><p>题目来源：<a href="http://acm.hdu.edu.cn/showproblem.php?pid=1506"><em>hdu</em></a></p><h4 id="分析">分析</h4><p>题目给定了长度为<span class="math inline">\(10^5\)</span>的<code>h[]</code>。要求求出最大的矩形。</p><p>我们可以构造一个笛卡尔树。由于笛卡尔树的性质可得，一个节点的子节点一定都大于该节点并且与它相邻。所以对于每个节点，高度为该子节点高度的最大矩形的面积便为<span class="math inline">\(size \times height\)</span>。取所有节点的<span class="math inline">\(max\)</span>即可。</p><h4 id="代码">代码</h4><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stack&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> L 0</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> R 1</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 100100</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">int</span> height;</span><br><span class="line">    <span class="keyword">int</span> size;</span><br><span class="line">    Node *fa;</span><br><span class="line">    Node *son[<span class="number">2</span>];</span><br><span class="line"></span><br><span class="line">    <span class="built_in">Node</span>(<span class="keyword">int</span> height = <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">this</span>-&gt;height = height;</span><br><span class="line">        size = <span class="number">1</span>;</span><br><span class="line">        fa = <span class="literal">NULL</span>;</span><br><span class="line">        son[<span class="number">0</span>] = son[<span class="number">1</span>] = <span class="literal">NULL</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">int</span> cnt;</span><br><span class="line"></span><br><span class="line">stack&lt;Node*&gt; s;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">CartesianTree</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    Node *root;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">CartesianTree</span>(<span class="keyword">int</span> *a, <span class="keyword">int</span> n)</span><br><span class="line">    &#123;</span><br><span class="line">        s = stack&lt;Node *&gt;();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            Node *next = <span class="keyword">new</span> <span class="built_in">Node</span>(a[i]);</span><br><span class="line">            Node *last = <span class="literal">NULL</span>;</span><br><span class="line">            <span class="keyword">while</span> (!s.<span class="built_in">empty</span>())</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span> (s.<span class="built_in">top</span>()-&gt;height &lt; next-&gt;height)</span><br><span class="line">                &#123;</span><br><span class="line">                    Node *tmp = s.<span class="built_in">top</span>();</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">if</span> (tmp-&gt;son[R])</span><br><span class="line">                        tmp-&gt;son[R]-&gt;fa = next;</span><br><span class="line">                    next-&gt;son[L] = tmp-&gt;son[R];</span><br><span class="line"></span><br><span class="line">                    tmp-&gt;son[R] = next;</span><br><span class="line">                    next-&gt;fa = tmp;</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                &#125;</span><br><span class="line"></span><br><span class="line">                last = s.<span class="built_in">top</span>();</span><br><span class="line">                s.<span class="built_in">pop</span>();</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (s.<span class="built_in">empty</span>() &amp;&amp; last)</span><br><span class="line">            &#123;</span><br><span class="line">                next-&gt;son[L] = last;</span><br><span class="line">                last-&gt;fa = next;</span><br><span class="line">            &#125;</span><br><span class="line"></span><br><span class="line">            s.<span class="built_in">push</span>(next);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> (!s.<span class="built_in">empty</span>())</span><br><span class="line">        &#123;</span><br><span class="line">            root = s.<span class="built_in">top</span>();</span><br><span class="line">            s.<span class="built_in">pop</span>();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">run</span><span class="params">(Node *node = <span class="literal">NULL</span>)</span></span></span><br><span class="line"><span class="function">    </span>&#123;  </span><br><span class="line">        <span class="keyword">if</span> (node==<span class="literal">NULL</span>)</span><br><span class="line">            node = root;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (node-&gt;son[L])</span><br><span class="line">        &#123;</span><br><span class="line">            ans = <span class="built_in">max</span>(ans, <span class="built_in">run</span>(node-&gt;son[L]));</span><br><span class="line">            node-&gt;size += node-&gt;son[L]-&gt;size;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (node-&gt;son[R])</span><br><span class="line">        &#123;</span><br><span class="line">            ans = <span class="built_in">max</span>(ans, <span class="built_in">run</span>(node-&gt;son[R]));</span><br><span class="line">            node-&gt;size += node-&gt;son[R]-&gt;size;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        ans = <span class="built_in">max</span>(ans, (<span class="keyword">long</span> <span class="keyword">long</span>)node-&gt;height * (<span class="keyword">long</span> <span class="keyword">long</span>)node-&gt;size);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> ans;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> h[MAXN];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (n)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++)</span><br><span class="line">            cin &gt;&gt; h[i];</span><br><span class="line"></span><br><span class="line">        CartesianTree *ct = <span class="keyword">new</span> <span class="built_in">CartesianTree</span>(h, n);</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; ct-&gt;<span class="built_in">run</span>() &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line">        cin &gt;&gt; n;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;学习笔记笛卡尔树&quot;&gt;[学习笔记]笛卡尔树&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;不知不觉，这估计是自从我用这个博客以来“停更”最长的了。各种奇奇怪怪的原因综合在一起导致连续三个月没有写任何博客。其实过去半年感觉投入到ACM的时间就有点少。最近几天也是。话说笛卡尔树我从前一直没听说过（汗），最近比赛完后看题解才知道这玩意儿。。。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>大二下第十五周</title>
    <link href="https://blog.songer.xyz/Diary/%E5%A4%A7%E4%BA%8C%E4%B8%8B%E7%AC%AC%E5%8D%81%E4%BA%94%E5%91%A8/"/>
    <id>https://blog.songer.xyz/Diary/%E5%A4%A7%E4%BA%8C%E4%B8%8B%E7%AC%AC%E5%8D%81%E4%BA%94%E5%91%A8/</id>
    <published>2019-06-09T15:03:11.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="大二下第十五周">大二下第十五周</h1><h2 id="周日">2019 6 9 周日</h2><span id="more"></span><p>距离上一次的“日记”已经过去了半年，最近几天又突然有了写一篇的念头。毕竟半年过去了，多少有些能记一下的东西。</p><p>这半年过得其实有些庸碌，刷题量明显变少，实验室也终于不去了（虽然我去也没有事情），博客的更新频率也大不如前。所以说，这半年算是“庸碌”的半年。不过，妄想用一个词就概括进两百天明显也是有失偏颇的。</p><p>说到博客，最近GFW明显变高，导致我的博客和ss都被墙掉了，所以想要更新就显得更加麻烦。我尝试新开了几个不同地区的VPS，结果都是过了几天就被封掉了。今天我又开了一个阿姆斯特丹的VPS搭了一个openVPN，不知道究竟能不能用到明天（苦笑。</p><p>虽说在ACM上算是几乎“毫无进展”，不过最近找到了一本好书。加缪的《堕落(The fall)》，虽然汉译本的翻译略显晦涩，但是加缪所描述的律师突然让我有些共鸣。或许有时间我会专门记一下吧。</p><p>另外，最近我刚刚换了一个手机，魅族16th，感觉还行，不过使用白条买的，到现在还没有还清。</p><p>不过，我感觉我这半年间，却又越来越有了一种“自以为高雅”的感觉。我自以为高尚，看到低俗的信息就看到厌恶、与不屑。B站我也不太想看了，只是偶尔看看新闻。我尽可能的想要“理性客观”，想要把自己从主观与情绪中剖离出去。不过，这是好是坏呢？</p><p>虽说日记本就应该是记一些琐碎事。但是我在之前的几篇日记中频频给自己打鸡血，感觉有些偏离本意。虽说如此，我最近确实算是有些颓废。没有目标，整天有些得过且过。期末考试不会是目标，应付作业也不会是目标。我应该再去找一些“提升自我”的事情做，而不是空闲下来就去打打游戏、玩玩手机。</p><p>说起来，还有一件我非常想记下的事情。大概是几天前，其实不只是几天前，这已经是第二次了。我梦见我站在宿舍的阳台上，阳台外是碧蓝到发绿的大海。海上有山，有船，甚至有一个海上乐园。然后就发生了水灾。我看见人被冲来冲去，在水中挣扎，然后便轮到了我。</p><p>这突然让我想起了几天前，我看了一遍敦刻尔克。看着里面的士兵在被淹没的船舱里挣扎。我突然感到了科技战争的“冷酷”。即便是死亡，也不再是刀起刀落，而是淹没的船舱，是焚烧的坦克，是孤立无援的绝望。</p><p>说来说去，结果有说了一堆毫无头绪的东西。就到这为止吧。</p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;大二下第十五周&quot;&gt;大二下第十五周&lt;/h1&gt;
&lt;h2 id=&quot;周日&quot;&gt;2019 6 9 周日&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Camp Schedule</title>
    <link href="https://blog.songer.xyz/Code/Camp%20Schedule/"/>
    <id>https://blog.songer.xyz/Code/Camp%20Schedule/</id>
    <published>2019-03-20T13:48:53.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="camp-schedule">Camp Schedule</h1><h1 id="cf-1137-b">CF 1137 B</h1><span id="more"></span><p>题目来源：<a href="https://codeforces.com/contest/1137/problem/B"><em>Codeforces</em></a></p><h2 id="分析">分析</h2><p>题目给出两个<code>01</code>串<code>s</code>和<code>t</code>，要求对<code>s</code>进行重新排列，令其含有尽可能多的<code>t</code>的子串。最简单的看，我们只需要令<code>s</code>被尽可能多的<code>t</code>的子串构成即可。</p><p>但实际上，如果<code>t</code>中存在部分前缀和部分后缀相同的情况的话就会非常麻烦。此外，还有可能<code>t</code>本身就是由数个重复串组成的。这时，我们可以用KMP中的<code>fail[]</code>数组来解决这个问题。</p><p>首先，我们需要先找出<code>t</code>中的循环节。注意，这时我们考虑的循环节，包括了<code>t</code>中的最后的后缀是循环节的一部分但并不是一个完整的循环节的情况（譬如，<code>ababa</code>的循环节即为<code>ab</code>，因为<code>a</code>也是<code>ab</code>的前缀，只是不是一个完整的循环节）。找出该循环节，我们其实可以用以下代码实现(参考于<a href="http://songer.xyz/index.php/archives/235/"><em>Cyclic Nacklace [KMP变型]</em></a>)：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (<span class="keyword">int</span> i = t.<span class="built_in">length</span>(); i&gt;<span class="number">0</span>; i = fail[i])</span><br><span class="line">        x = <span class="built_in">max</span>(x, i - fail[i]);</span><br></pre></td></tr></table></figure><p>这样，我们其实只需要看<code>s</code>中有多少个<code>t</code>的循环节就好了。然后我们减去<code>t</code>本身有多少个循环节再加一即为答案。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 500100</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line">string s, t;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> fail[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">getFail</span><span class="params">(string s)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    fail[<span class="number">0</span>] = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;s.<span class="built_in">length</span>(); i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> j = fail[i];</span><br><span class="line">        <span class="keyword">while</span> (j &amp;&amp; s[i]!=s[j])</span><br><span class="line">            j = fail[j];</span><br><span class="line">        fail[i+<span class="number">1</span>] = s[i]==s[j]? j+<span class="number">1</span> : <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> cnt[<span class="number">2</span>];</span><br><span class="line"><span class="keyword">int</span> sum[<span class="number">2</span>];</span><br><span class="line">string str;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cin &gt;&gt; s;</span><br><span class="line">    cin &gt;&gt; t;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">getFail</span>(t);</span><br><span class="line"></span><br><span class="line">    str = <span class="string">&quot;&quot;</span>;</span><br><span class="line">    <span class="keyword">int</span> lent = t.<span class="built_in">length</span>();</span><br><span class="line">    <span class="keyword">int</span> lens = s.<span class="built_in">length</span>();</span><br><span class="line">    <span class="keyword">int</span> x = t.<span class="built_in">length</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = t.<span class="built_in">length</span>(); i&gt;<span class="number">0</span>; i = fail[i])</span><br><span class="line">        x = <span class="built_in">max</span>(x, i - fail[i]);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;lent; i++)</span><br><span class="line">        cnt[ t[i] - <span class="string">&#x27;0&#x27;</span> ] ++;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i&lt;lens; i++)</span><br><span class="line">        sum[ s[i] - <span class="string">&#x27;0&#x27;</span> ] ++;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (sum[<span class="number">0</span>] &gt;= cnt[<span class="number">0</span>] &amp;&amp; sum[<span class="number">1</span>] &gt;= cnt[<span class="number">1</span>])</span><br><span class="line">    &#123;</span><br><span class="line">        cout &lt;&lt; t;</span><br><span class="line">        sum[<span class="number">0</span>] -= cnt[<span class="number">0</span>];</span><br><span class="line">        sum[<span class="number">1</span>] -= cnt[<span class="number">1</span>];</span><br><span class="line"></span><br><span class="line">        cnt[<span class="number">0</span>] = <span class="number">0</span>;</span><br><span class="line">        cnt[<span class="number">1</span>] = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = fail[lent]; i&lt;lent; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            cnt[ t[i] - <span class="string">&#x27;0&#x27;</span> ] ++;</span><br><span class="line">            str += t[i];</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> (sum[<span class="number">0</span>] &gt;= cnt[<span class="number">0</span>] &amp;&amp; sum[<span class="number">1</span>] &gt;= cnt[<span class="number">1</span>])</span><br><span class="line">        &#123;</span><br><span class="line">            cout &lt;&lt; str;</span><br><span class="line">            sum[<span class="number">0</span>] -= cnt[<span class="number">0</span>];</span><br><span class="line">            sum[<span class="number">1</span>] -= cnt[<span class="number">1</span>];</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">while</span> (sum[<span class="number">0</span>]--)</span><br><span class="line">            cout &lt;&lt; <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span> (sum[<span class="number">1</span>]--)</span><br><span class="line">            cout &lt;&lt; <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; endl;</span><br><span class="line">    &#125;<span class="keyword">else</span> </span><br><span class="line">        cout &lt;&lt; s &lt;&lt; endl;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;camp-schedule&quot;&gt;Camp Schedule&lt;/h1&gt;
&lt;h1 id=&quot;cf-1137-b&quot;&gt;CF 1137 B&lt;/h1&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Skycsrapers</title>
    <link href="https://blog.songer.xyz/Code/Skycsrapers/"/>
    <id>https://blog.songer.xyz/Code/Skycsrapers/</id>
    <published>2019-03-20T13:09:21.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="skycsrapers">Skycsrapers</h1><h1 id="cf-1137-a">CF 1137 A</h1><blockquote><p>这是我的第一场Div.1，结果打完之后又掉回Div.2了，结束了我短暂的Div.1生涯。。。</p></blockquote><span id="more"></span><p>题目来源：<a href="https://codeforces.com/contest/1137/problem/A"><em>Codeforces</em></a></p><h2 id="分析">分析</h2><p>题目给出了一个<span class="math inline">\(n \times m\)</span>的地图<code>mp[][]</code>，假设其由<code>n</code>条横向道路和<code>m</code>条纵向道路组成，并且在每一个路口都有一个摩天大楼，高度为<code>mp[i][j]</code>。然后，我们希望在不更改同一行或同一列的大楼之间的高度关系的情况下，令高度最高的大楼的高度尽可能的小。</p><p>这其实就是一个Hash，我们对于每一行或者每一列都Hash映射到尽可能小的数即可。不过我们还要考虑一个点同时对行和列的影响。譬如一个点在行中算出其为<code>10</code>，但是在列中是最小的。所以我们需要令列中的所有数都按照正常Hash的情况再加<code>9</code>。所以实际上，我们可以记录，每个点在行中或者列中，小于等于它的数的Hash值的数目和大于等于的数目，即<code>smaller[i][j][]</code>和<code>bigger[i][j][]</code>。第三维通过<code>0,1</code>来记录行列，然后答案在<code>smaller[i][j][]</code>和<code>bigger[i][j][]</code>中取组合的最大值即可。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 1010</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">A</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">int</span> i, j;</span><br><span class="line">    <span class="keyword">int</span> x;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">A</span>()&#123;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">A</span>(<span class="keyword">int</span> x, <span class="keyword">int</span> i, <span class="keyword">int</span> j):<span class="built_in">x</span>(x), <span class="built_in">i</span>(i), <span class="built_in">j</span>(j) &#123;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">bool</span> <span class="keyword">operator</span> &lt; (<span class="keyword">const</span> A &amp;tmp) <span class="keyword">const</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">this</span>-&gt;x &lt; tmp.x;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">bool</span> <span class="keyword">operator</span> != (<span class="keyword">const</span> A &amp;tmp) <span class="keyword">const</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">this</span>-&gt;x != tmp.x;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;a[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> mp[MAXN][MAXN];</span><br><span class="line"><span class="keyword">int</span> smaller[MAXN][MAXN][<span class="number">2</span>], bigger[MAXN][MAXN][<span class="number">2</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> n, m;</span><br><span class="line">    cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">            cin &gt;&gt; mp[i][j];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">            a[j] = <span class="built_in">A</span>(mp[i][j], i, j);</span><br><span class="line"></span><br><span class="line">        <span class="built_in">sort</span>(a+<span class="number">1</span>, a+<span class="number">1</span>+m);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">int</span> t = <span class="number">1</span>;</span><br><span class="line">        smaller[ a[<span class="number">1</span>].i ][ a[<span class="number">1</span>].j ][<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">2</span>; j&lt;=m; j++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (a[j]!=a[j<span class="number">-1</span>])</span><br><span class="line">                t++;</span><br><span class="line"></span><br><span class="line">            smaller[ a[j].i ][ a[j].j ][<span class="number">0</span>] = t;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">            bigger[ a[j].i ][ a[j].j ][<span class="number">0</span>] = t - smaller[ a[j].i ][ a[j].j ][<span class="number">0</span>];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">            a[i] = <span class="built_in">A</span>(mp[i][j], i, j);</span><br><span class="line"></span><br><span class="line">        <span class="built_in">sort</span>(a+<span class="number">1</span>, a+<span class="number">1</span>+n);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">int</span> t = <span class="number">1</span>;</span><br><span class="line">        smaller[ a[<span class="number">1</span>].i ][ a[<span class="number">1</span>].j ][<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i&lt;=n; i++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (a[i]!=a[i<span class="number">-1</span>])</span><br><span class="line">                t++;</span><br><span class="line"></span><br><span class="line">            smaller[ a[i].i ][ a[i].j ][<span class="number">1</span>] = t;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">            bigger[ a[i].i ][ a[i].j ][<span class="number">1</span>] = t - smaller[ a[i].i ][ a[i].j ][<span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=m; j++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> ans = <span class="built_in">max</span>(smaller[i][j][<span class="number">0</span>] + bigger[i][j][<span class="number">1</span>], smaller[i][j][<span class="number">1</span>] + bigger[i][j][<span class="number">0</span>]);  </span><br><span class="line">            ans = <span class="built_in">max</span>(ans, smaller[i][j][<span class="number">0</span>] + bigger[i][j][<span class="number">0</span>]);</span><br><span class="line">            ans = <span class="built_in">max</span>(ans, smaller[i][j][<span class="number">1</span>] + bigger[i][j][<span class="number">1</span>]);</span><br><span class="line"></span><br><span class="line">            cout &lt;&lt; ans &lt;&lt; <span class="string">&quot; &quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        cout &lt;&lt; endl;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;skycsrapers&quot;&gt;Skycsrapers&lt;/h1&gt;
&lt;h1 id=&quot;cf-1137-a&quot;&gt;CF 1137 A&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;这是我的第一场Div.1，结果打完之后又掉回Div.2了，结束了我短暂的Div.1生涯。。。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Zero Quantity Maximization</title>
    <link href="https://blog.songer.xyz/Code/Zero%20Quantity%20Maximization/"/>
    <id>https://blog.songer.xyz/Code/Zero%20Quantity%20Maximization/</id>
    <published>2019-03-20T12:30:50.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="zero-quantity-maximization">Zero Quantity Maximization</h1><h1 id="cf-1133-d">CF 1133 D</h1><span id="more"></span><p>题目来源：<a href="https://codeforces.com/contest/1133/problem/D"><em>Codeforces</em></a></p><h2 id="分析">分析</h2><p>题目给出两个数组<code>a[]</code>和<code>b[]</code>，要求对于满足<span class="math inline">\(c_i = d \cdot a_i + b_i\)</span>的数组<code>c[]</code>，当<code>d</code>取何值时<code>c[]</code>中有尽可能多的<code>0</code>。</p><p>我们只需要假设所有的<code>c[i]</code>都为<code>0</code>，然后求出满足其关系的<code>d</code>，找到出现次数最多的<code>d</code>就可以了。</p><p>这题当时做的时候最早没有用<code>map&lt;&gt;</code>，而是使用了排序后手动计算的方法，结果莫名其妙的出现了许多的bug，换成<code>map&lt;&gt;</code>之后就好了。。。此外，这里其实可以不使用<code>Node</code>，而是直接用一个<code>pair&lt;int, int&gt;</code>即可，只需要记住用<code>gcd()</code>将分数化为最简形式即可。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;map&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 200100</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> a, b;</span><br><span class="line">    <span class="keyword">int</span> k;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">void</span> <span class="title">getK</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">this</span>-&gt;a * <span class="keyword">this</span>-&gt;b&lt;<span class="number">0</span>)</span><br><span class="line">            <span class="keyword">this</span>-&gt;k = <span class="number">-1</span>;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">this</span>-&gt;k = <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> <span class="keyword">bool</span> <span class="keyword">operator</span> &lt; (<span class="keyword">const</span> Node &amp;tmp)<span class="keyword">const</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">abs</span>(<span class="keyword">this</span>-&gt;b * tmp.a) * <span class="keyword">this</span>-&gt;k &lt; <span class="built_in">abs</span>(tmp.b * <span class="keyword">this</span>-&gt;a) * tmp.k;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;node[MAXN];</span><br><span class="line"></span><br><span class="line">map&lt;Node, <span class="keyword">int</span>&gt; mp;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">        cin &gt;&gt; node[i].a;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        cin &gt;&gt; node[i].b;</span><br><span class="line">        node[i].<span class="built_in">getK</span>();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> cnt = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">        <span class="keyword">if</span> (node[i].a==<span class="number">0</span> &amp;&amp; node[i].b==<span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            cnt ++;</span><br><span class="line">        &#125;<span class="keyword">else</span> <span class="keyword">if</span> (node[i].a!=<span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            mp[node[i]]++;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line">    map&lt;Node, <span class="keyword">int</span>&gt;::iterator it;</span><br><span class="line">    <span class="keyword">for</span> (it = mp.<span class="built_in">begin</span>(); it!=mp.<span class="built_in">end</span>(); it++)</span><br><span class="line">        ans = <span class="built_in">max</span>(ans, it-&gt;second);</span><br><span class="line"></span><br><span class="line">    cout &lt;&lt; ans + cnt &lt;&lt; endl;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;zero-quantity-maximization&quot;&gt;Zero Quantity Maximization&lt;/h1&gt;
&lt;h1 id=&quot;cf-1133-d&quot;&gt;CF 1133 D&lt;/h1&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Two Cakes [思维题]</title>
    <link href="https://blog.songer.xyz/Code/Two%20Cakes%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/"/>
    <id>https://blog.songer.xyz/Code/Two%20Cakes%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/</id>
    <published>2019-03-01T01:18:53.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="two-cakes-思维题">Two Cakes [思维题]</h1><h2 id="cf-contest-542-b">CF Contest 542 B</h2><span id="more"></span><p>题目来源：<a href="https://codeforces.com/contest/1130/problem/B"><em>codeforces</em></a></p><h2 id="分析">分析</h2><p>这道题其实和Wannafly Camp中的<a href="http://songer.xyz/index.php/archives/343/"><em>夺宝奇兵</em></a>有异曲同工之妙。我们有两个人，他们分别需要从<code>0</code>走到<code>n</code>，那么我们其实可以发现对于每次从第<span class="math inline">\(i\)</span>个走到<span class="math inline">\(i+1\)</span>个，谁在哪个位置完全没有影响，我们只需要考虑怎么走最近即可。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 100100</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> a[MAXN][<span class="number">2</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=<span class="number">2</span>*n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> x;</span><br><span class="line">        cin &gt;&gt; x;</span><br><span class="line">        <span class="keyword">if</span> (a[x][<span class="number">0</span>]==<span class="number">0</span>)</span><br><span class="line">            a[x][<span class="number">0</span>] = i;</span><br><span class="line">        <span class="keyword">else</span> a[x][<span class="number">1</span>] = i;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">0</span>;</span><br><span class="line">    ans += a[<span class="number">1</span>][<span class="number">0</span>] + a[<span class="number">1</span>][<span class="number">1</span>] - <span class="number">2</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> min1 = <span class="built_in">abs</span>(a[i][<span class="number">0</span>] - a[i+<span class="number">1</span>][<span class="number">0</span>]) + <span class="built_in">abs</span>(a[i][<span class="number">1</span>] - a[i+<span class="number">1</span>][<span class="number">1</span>]);</span><br><span class="line">        <span class="keyword">int</span> min2 = <span class="built_in">abs</span>(a[i][<span class="number">0</span>] - a[i+<span class="number">1</span>][<span class="number">1</span>]) + <span class="built_in">abs</span>(a[i][<span class="number">1</span>] - a[i+<span class="number">1</span>][<span class="number">0</span>]);</span><br><span class="line"></span><br><span class="line">        ans += <span class="built_in">min</span>(min1, min2);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    cout &lt;&lt; ans &lt;&lt; endl;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;two-cakes-思维题&quot;&gt;Two Cakes [思维题]&lt;/h1&gt;
&lt;h2 id=&quot;cf-contest-542-b&quot;&gt;CF Contest 542 B&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>迷宫 [树，思维题]</title>
    <link href="https://blog.songer.xyz/Code/%E8%BF%B7%E5%AE%AB%20[%E6%A0%91%EF%BC%8C%E6%80%9D%E7%BB%B4%E9%A2%98]/"/>
    <id>https://blog.songer.xyz/Code/%E8%BF%B7%E5%AE%AB%20[%E6%A0%91%EF%BC%8C%E6%80%9D%E7%BB%B4%E9%A2%98]/</id>
    <published>2019-02-27T08:52:11.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="迷宫-树思维题">迷宫 [树，思维题]</h1><h2 id="wannafly-day-5-a">Wannafly Day 5 A</h2><span id="more"></span><p>题目来源：<a href="https://zhixincode.com/contest/26/problem/A?problem_id=369"><em>comet OJ</em></a></p><h2 id="分析">分析</h2><p>首先很明显，题目中给出的是一颗树。我们需要将所有的人移到根节点，并且一个节点同时刻只能有一个人。</p><p>我们先假设如果不会有人的位置发生冲突的话，那么花费的时间其实就等于深度最大的人所花费的时间。但实际情况是有可能会有两个人同时需要进入同一个父节点（发生冲突），所以其中一个需要为另一个让路。那么我们可以发现，深度相同的节点之间一定会早晚发生冲突。两个节点发生冲突的结果就是其中一个需要多花费一个时间节点，那么若是三个节点发生冲突呢？一个节点多花费一个时间节点，还有一个多花费两个时间节点。也就是说，对于深度相同的节点来说，若共有<span class="math inline">\(n\)</span>个人，那么便需要比起一个人多花费<span class="math inline">\(n-1\)</span>的时间将所有人走完。</p><p>那么，我们便可以系统地考虑一下这道题里的情况了。我们可以令深度更小的节点一定先到达根节点，这可以确保答案最小。然后我们每一层都有两个关键的性质：深度<code>depth</code>和人数<code>n</code>。然后我们用<code>t[i]</code>表示深度为<code>i</code>的人走完后所花费的时间。深度能够决定当前层的第一个人到达根节点的可能最小时间（实际并不一定是，因为可能深度更小的节点的人未走完），人数则表示该层共花费的时间。那么公式便如下：</p><p><span class="math display">\[ t[i] = max(t[ i - 1], depth - 1) + n - 1 \]</span></p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;queue&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 100100</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INF 0x3f3f3f3f</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> a[MAXN];</span><br><span class="line"><span class="keyword">int</span> dist[MAXN];</span><br><span class="line"><span class="keyword">bool</span> flag[MAXN];</span><br><span class="line"><span class="keyword">int</span> maxDepth = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="class"><span class="keyword">struct</span> <span class="title">Edge</span> *<span class="title">edge</span>;</span></span><br><span class="line">    <span class="keyword">int</span> num, depth, max;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">Node</span>()</span><br><span class="line">    &#123;</span><br><span class="line">        edge = <span class="literal">NULL</span>;</span><br><span class="line">        depth = num = <span class="number">0</span>;</span><br><span class="line">        max = INF;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">&#125;node[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Edge</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    Node *from, *to;</span><br><span class="line">    Edge *next;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">Edge</span>()</span><br><span class="line">    &#123;</span><br><span class="line">        from = to = <span class="literal">NULL</span>;</span><br><span class="line">        next = <span class="literal">NULL</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">Edge</span>(Node *from, Node *to, Edge *next=<span class="literal">NULL</span>)  </span><br><span class="line">        :<span class="built_in">from</span>(from), <span class="built_in">to</span>(to), <span class="built_in">next</span>(from-&gt;edge)  &#123;&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> cnt[MAXN];</span><br><span class="line">queue&lt;Node *&gt; q;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">build</span><span class="params">(Node *nd)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    q.<span class="built_in">push</span>(nd);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (!q.<span class="built_in">empty</span>())</span><br><span class="line">    &#123;</span><br><span class="line">        Node *node = q.<span class="built_in">front</span>();</span><br><span class="line">        q.<span class="built_in">pop</span>();</span><br><span class="line">        <span class="keyword">for</span> (Edge *e = node-&gt;edge; e; e = e-&gt;next)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (e-&gt;to-&gt;depth == <span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                e-&gt;to-&gt;depth = node-&gt;depth + <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">if</span> (e-&gt;to-&gt;num==<span class="number">1</span>)</span><br><span class="line">                    cnt[e-&gt;to-&gt;depth] ++;</span><br><span class="line"></span><br><span class="line">                maxDepth = <span class="built_in">max</span>(maxDepth, e-&gt;to-&gt;depth);</span><br><span class="line"></span><br><span class="line">                q.<span class="built_in">push</span>(e-&gt;to);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">        cin &gt;&gt; node[i].num;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> x, y;</span><br><span class="line">        cin &gt;&gt; x &gt;&gt; y;</span><br><span class="line">        node[x].edge = <span class="keyword">new</span> <span class="built_in">Edge</span>(&amp;node[x], &amp;node[y]);</span><br><span class="line">        node[y].edge = <span class="keyword">new</span> <span class="built_in">Edge</span>(&amp;node[y], &amp;node[x]);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    node[<span class="number">1</span>].depth = <span class="number">1</span>;</span><br><span class="line">    <span class="built_in">build</span>(&amp;node[<span class="number">1</span>]);</span><br><span class="line">    <span class="keyword">if</span> (node[<span class="number">1</span>].num==<span class="number">1</span>)</span><br><span class="line">        cnt[<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> t = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">2</span>; i&lt;=maxDepth; i++)</span><br><span class="line">        <span class="keyword">if</span> (i<span class="number">-1</span>&gt;t &amp;&amp; cnt[i])</span><br><span class="line">        &#123;</span><br><span class="line">            t = i - <span class="number">2</span> + cnt[i];</span><br><span class="line">        &#125;<span class="keyword">else</span> <span class="keyword">if</span> (i<span class="number">-1</span>&lt;=t &amp;&amp; cnt[i])</span><br><span class="line">        &#123;</span><br><span class="line">            t += cnt[i];</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">    cout &lt;&lt; t + cnt[<span class="number">1</span>] &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;迷宫-树思维题&quot;&gt;迷宫 [树，思维题]&lt;/h1&gt;
&lt;h2 id=&quot;wannafly-day-5-a&quot;&gt;Wannafly Day 5 A&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>置置置换</title>
    <link href="https://blog.songer.xyz/Code/%E7%BD%AE%E7%BD%AE%E7%BD%AE%E6%8D%A2/"/>
    <id>https://blog.songer.xyz/Code/%E7%BD%AE%E7%BD%AE%E7%BD%AE%E6%8D%A2/</id>
    <published>2019-02-27T01:18:43.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="置置置换">置置置换</h1><h2 id="wannafly-day-3-g">Wannafly Day 3 G</h2><span id="more"></span><p>题目来源：<a href="https://zhixincode.com/contest/18/problem/G?problem_id=265"><em>comet OJ</em></a></p><h2 id="分析">分析</h2><p>这道题我们是套用公式来解的，不过好像可以使用DP来解决。DP的方法日后补充。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> MOD=<span class="number">1000000007</span>;</span><br><span class="line"><span class="keyword">int</span> n;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> A[<span class="number">1010</span>];</span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">phi</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> k)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> res=k,tmp=k;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">long</span> <span class="keyword">long</span> i=<span class="number">2</span>;i*i&lt;=tmp;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span>(k%i==<span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            res=res/i*(i<span class="number">-1</span>);</span><br><span class="line">            res%=MOD;</span><br><span class="line">            <span class="keyword">while</span>(k%i==<span class="number">0</span>) k/=i;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(k&gt;<span class="number">1</span>) res=res/k*(k<span class="number">-1</span>);</span><br><span class="line">    <span class="keyword">return</span> res;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> C[<span class="number">1010</span>][<span class="number">1010</span>];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;n);</span><br><span class="line">    A[<span class="number">0</span>]=A[<span class="number">1</span>]=A[<span class="number">2</span>]=<span class="number">1</span>;</span><br><span class="line">    C[<span class="number">1</span>][<span class="number">0</span>]=C[<span class="number">1</span>][<span class="number">1</span>]=<span class="number">1</span>;</span><br><span class="line">true<span class="keyword">for</span> (<span class="keyword">int</span> i=<span class="number">2</span>;i&lt;=<span class="number">1000</span>;i++)</span><br><span class="line">true&#123;</span><br><span class="line">truetrueC[i][<span class="number">0</span>]=<span class="number">1</span>;</span><br><span class="line">truetrue<span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=<span class="number">1000</span>;j++)</span><br><span class="line">        &#123;</span><br><span class="line">            C[i][j]=(C[i<span class="number">-1</span>][j]+C[i<span class="number">-1</span>][j<span class="number">-1</span>]);</span><br><span class="line">            C[i][j]%=MOD;</span><br><span class="line">        &#125;</span><br><span class="line">true&#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">3</span>;i&lt;=<span class="number">1000</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j&lt;=i<span class="number">-1</span>;j++)</span><br><span class="line">        &#123;</span><br><span class="line">            A[i]+=(C[i<span class="number">-1</span>][j]*A[j]%MOD)*A[i<span class="number">-1</span>-j] % MOD;</span><br><span class="line">            A[i]%=MOD;</span><br><span class="line">        &#125;</span><br><span class="line">        A[i]=(A[i] * <span class="number">500000004</span>)%MOD;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%lld\n&quot;</span>,A[n]);</span><br><span class="line">    <span class="comment">/*if(n%2==0) printf(&quot;%lld\n&quot;,phi(n)%MOD);</span></span><br><span class="line"><span class="comment">    else</span></span><br><span class="line"><span class="comment">    &#123;</span></span><br><span class="line"><span class="comment">        for(int i=0;i&lt;=n;i++)</span></span><br><span class="line"><span class="comment">        &#123;</span></span><br><span class="line"><span class="comment">            ans+=phi(i)*cal(n,i,MOD);</span></span><br><span class="line"><span class="comment">        &#125;</span></span><br><span class="line"><span class="comment">        printf(&quot;%lld\n&quot;,ans);</span></span><br><span class="line"><span class="comment">    &#125;*/</span></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;置置置换&quot;&gt;置置置换&lt;/h1&gt;
&lt;h2 id=&quot;wannafly-day-3-g&quot;&gt;Wannafly Day 3 G&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Toy Train [思维题]</title>
    <link href="https://blog.songer.xyz/Code/Toy%20Train%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/"/>
    <id>https://blog.songer.xyz/Code/Toy%20Train%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/</id>
    <published>2019-02-27T01:16:33.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="toy-train-思维题">Toy Train [思维题]</h1><h2 id="cf-contest-542-d">CF Contest 542 D</h2><span id="more"></span><h2 id="分析">分析</h2><p>题目要求对于<span class="math inline">\(n\)</span>个不同的起点，分别给出将所有糖果送完花费的最小时间。</p><p>我们可以先假设起点已经固定。由于我们每次可以携带多个糖果，并且可以卸下多个糖果，所以我们可以发现对于不同的<span class="math inline">\(j\)</span>，将最初位于节点<span class="math inline">\(j\)</span>的糖果送完所花费的时间相互之间互不干扰。</p><p>那么对于第<span class="math inline">\(j\)</span>个节点，将这个节点的所有糖果送完所需要花费的时间是多少呢？我们假设起点为<span class="math inline">\(i\)</span>。那么，我们第一次到达<span class="math inline">\(j\)</span>所花费的时间就是<span class="math inline">\((j - i + n) \mod n\)</span>。然后我们假设节点<span class="math inline">\(j\)</span>共有<span class="math inline">\(k\)</span>个糖果，那么我们可以发现我们至少需要经过<span class="math inline">\(j\)</span>节点<span class="math inline">\(k\)</span>次才能拿到所有糖果。所以拿到所有糖果至少需要<span class="math inline">\((j - i + n) \mod n + (k - 1) *n\)</span>次移动。</p><p>此外，我们可以发现在下一次到达<span class="math inline">\(j\)</span>点前，我们一定可以将上次从<span class="math inline">\(j\)</span>点拿走的糖果送出去，所以，我们最后只剩下一个糖果没有送到位置。由于我们想令答案最小，所以只需要令最后送的位置最近即可。</p><p>那么，对于起点<span class="math inline">\(i\)</span>,位置<span class="math inline">\(j\)</span>的<span class="math inline">\(k\)</span>个糖果<span class="math inline">\(a_1 - a_k\)</span>（<span class="math inline">\(k\)</span>必须不为<span class="math inline">\(0\)</span>），所需花费的时间为:</p><p><span class="math display">\[ t[j] = (j - i + n) \mod n + (k - 1) * n + min( (a_i - j + n) \mod n) \]</span></p><p>那么，对于起点<span class="math inline">\(i\)</span>，所花费的最小时间即为<span class="math inline">\(min(t[j])\)</span>。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 5010</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INF 0x3f3f3f3f</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> cnt[MAXN], nearest[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n, m;</span><br><span class="line">    cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">        nearest[i] = INF;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i =<span class="number">1</span>; i&lt;=m; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> x, y;</span><br><span class="line">        cin &gt;&gt; x &gt;&gt; y;</span><br><span class="line">        cnt[x] ++;</span><br><span class="line">        nearest[x] = <span class="built_in">min</span>(nearest[x], (y + n - x) % n );</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">int</span> j = <span class="number">1</span>; j&lt;=n; j++)</span><br><span class="line">            <span class="keyword">if</span> (cnt[j])</span><br><span class="line">                ans = <span class="built_in">max</span>(ans, (cnt[j] - <span class="number">1</span>) * n + nearest[j] + (j - i + n) % n );</span><br><span class="line"></span><br><span class="line">        cout &lt;&lt; ans &lt;&lt; <span class="string">&quot; &quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;toy-train-思维题&quot;&gt;Toy Train [思维题]&lt;/h1&gt;
&lt;h2 id=&quot;cf-contest-542-d&quot;&gt;CF Contest 542 D&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>抢红包机器人 [思维题]</title>
    <link href="https://blog.songer.xyz/Code/%E6%8A%A2%E7%BA%A2%E5%8C%85%E6%9C%BA%E5%99%A8%E4%BA%BA%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/"/>
    <id>https://blog.songer.xyz/Code/%E6%8A%A2%E7%BA%A2%E5%8C%85%E6%9C%BA%E5%99%A8%E4%BA%BA%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/</id>
    <published>2019-02-26T02:19:45.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="抢红包机器人-思维题">抢红包机器人 [思维题]</h1><h2 id="wannafly-day5-g">Wannafly Day5 G</h2><span id="more"></span><p>题目来源：<a href="https://zhixincode.com/contest/26/problem/G?problem_id=375"><em>comet OJ</em></a></p><h2 id="分析">分析</h2><p>由于题目要求至少存在一个机器人，所以我们必须先假设某一个人是机器人，然后以此向下推，推出所有必须是机器人的人，最后的总数就是机器人的最少数量。</p><p>那么，这个问题就变成了“第一个”机器人应该选谁的问题。事实上，由于不同人之间的关系是偏序的，即是可以传递的，譬如<code>i</code>比<code>j</code>快，<code>j</code>比<code>k</code>快，那么<code>i</code>为机器人时<code>k</code>也一定为机器人,所以我们可以直接用类似于floyd的方法推出对于任意的<span class="math inline">\(i,j\)</span>，<span class="math inline">\(i\)</span>是否比<span class="math inline">\(j\)</span>快。然后我们只需要找到能够影响的<span class="math inline">\(j\)</span>最少的<span class="math inline">\(i\)</span>即可。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">int</span> n,m,b,res,c[<span class="number">105</span>],sum;</span><br><span class="line"><span class="keyword">bool</span> a[<span class="number">105</span>][<span class="number">105</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cin&gt;&gt;n&gt;&gt;m;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;m;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        cin&gt;&gt;b;</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=b;j++)</span><br><span class="line">        &#123;</span><br><span class="line">            cin&gt;&gt;c[j];</span><br><span class="line">            <span class="keyword">for</span>(<span class="keyword">int</span> k=<span class="number">1</span>;k&lt;j;k++)</span><br><span class="line">                a[c[k]][c[j]]=<span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> k = <span class="number">1</span>; k &lt;= n; ++k)</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">1</span>; i &lt;= n; ++i)</span><br><span class="line">            <span class="keyword">for</span>(<span class="keyword">int</span> j = <span class="number">1</span>; j &lt;= n; ++j)</span><br><span class="line">                <span class="keyword">if</span>(a[i][k] == <span class="number">1</span> &amp;&amp; a[k][j] == <span class="number">1</span>)</span><br><span class="line">                    a[i][j] = <span class="number">1</span>;</span><br><span class="line">    res=<span class="number">105</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)&#123;</span><br><span class="line">        sum=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=n;j++)</span><br><span class="line">            sum+=a[j][i];</span><br><span class="line">        <span class="keyword">if</span>(a[i][i]==<span class="number">0</span>)</span><br><span class="line">            sum++;</span><br><span class="line">        res=<span class="built_in">min</span>(sum,res);</span><br><span class="line">    &#125;</span><br><span class="line">    cout&lt;&lt;<span class="built_in">max</span>(<span class="number">1</span>,res)&lt;&lt;endl;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;抢红包机器人-思维题&quot;&gt;抢红包机器人 [思维题]&lt;/h1&gt;
&lt;h2 id=&quot;wannafly-day5-g&quot;&gt;Wannafly Day5 G&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>Special Judge [计算几何]</title>
    <link href="https://blog.songer.xyz/Code/Special%20Judge%20[%E8%AE%A1%E7%AE%97%E5%87%A0%E4%BD%95]/"/>
    <id>https://blog.songer.xyz/Code/Special%20Judge%20[%E8%AE%A1%E7%AE%97%E5%87%A0%E4%BD%95]/</id>
    <published>2019-02-26T02:19:28.000Z</published>
    <updated>2021-12-14T16:39:44.681Z</updated>
    
    <content type="html"><![CDATA[<h1 id="special-judge-计算几何">Special Judge [计算几何]</h1><h2 id="wannafly-day4-j">Wannafly Day4 J</h2><span id="more"></span><p>题目来源：<a href="https://zhixincode.com/contest/22/problem/J?problem_id=315"><em>comet OJ</em></a></p><h2 id="分析">分析</h2><p>一道计算几何的模板题，难点在于特殊情况的判断很复杂，很容易想漏。我们需要分别对端点对端点，端点对线段，线段对线段，平行，重合并相交，重合但是线段不相交，重合并包含这几种情况分别进行判断。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">double</span> eps=<span class="number">1e-8</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">double</span> PI=<span class="built_in">acos</span>(<span class="number">-1.0</span>);</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">sgn</span><span class="params">(<span class="keyword">double</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(<span class="built_in">fabs</span>(x)&lt;eps) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span>(x&lt;<span class="number">0</span>) <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Point</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="keyword">double</span> x,y;</span><br><span class="line">    <span class="keyword">int</span> mark;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">Point</span>()&#123;&#125;</span><br><span class="line">    <span class="built_in">Point</span>(<span class="keyword">double</span> _x,<span class="keyword">double</span> _y)</span><br><span class="line">    &#123;</span><br><span class="line">        x=_x;</span><br><span class="line">        y=_y;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">bool</span> <span class="keyword">operator</span> == (<span class="keyword">const</span> Point &amp;b)<span class="keyword">const</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">sgn</span>(x-b.x)==<span class="number">0</span>&amp;&amp;<span class="built_in">sgn</span>(y-b.y)==<span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Point <span class="keyword">operator</span> - (<span class="keyword">const</span> Point &amp;b)<span class="keyword">const</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">Point</span>(x-b.x,y-b.y);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">double</span> <span class="keyword">operator</span> ^ (<span class="keyword">const</span> Point &amp;b)<span class="keyword">const</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> x*b.y-y*b.x;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">double</span> <span class="keyword">operator</span> * (<span class="keyword">const</span> Point &amp;b)<span class="keyword">const</span></span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">return</span> x*b.x+y*b.y;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">Line</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    Point s,e;</span><br><span class="line">    <span class="built_in">Line</span>()&#123;&#125;</span><br><span class="line">    <span class="built_in">Line</span>(Point _s,Point _e)</span><br><span class="line">    &#123;</span><br><span class="line">        s=_s;</span><br><span class="line">        e=_e;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">inter</span><span class="params">(Line l1,Line l2)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">return</span></span><br><span class="line">    <span class="built_in">max</span>(l1.s.x,l1.e.x)&gt;=<span class="built_in">min</span>(l2.s.x,l2.e.x)&amp;&amp;</span><br><span class="line">    <span class="built_in">max</span>(l2.s.x,l2.e.x)&gt;=<span class="built_in">min</span>(l1.s.x,l1.e.x)&amp;&amp;</span><br><span class="line">    <span class="built_in">max</span>(l1.s.y,l1.e.y)&gt;=<span class="built_in">min</span>(l2.s.y,l2.e.y)&amp;&amp;</span><br><span class="line">    <span class="built_in">max</span>(l2.s.y,l2.e.y)&gt;=<span class="built_in">min</span>(l1.s.y,l1.e.y)&amp;&amp;</span><br><span class="line">    <span class="built_in">sgn</span>((l2.s-l1.e)^(l1.s-l1.e))*<span class="built_in">sgn</span>((l2.e-l1.e)^(l1.s-l1.e))&lt;=<span class="number">0</span>&amp;&amp;</span><br><span class="line">    <span class="built_in">sgn</span>((l1.s-l2.e)^(l2.s-l2.e))*<span class="built_in">sgn</span>((l1.e-l2.e)^(l2.s-l2.e))&lt;=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">cmp</span><span class="params">(Point p,Point q)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(p.x==q.x) <span class="keyword">return</span> p.y&lt;q.y;</span><br><span class="line">    <span class="keyword">return</span> p.x&lt;q.x;</span><br><span class="line">&#125;</span><br><span class="line">Point a[<span class="number">1010</span>];</span><br><span class="line"><span class="keyword">int</span> u[<span class="number">2010</span>],v[<span class="number">2010</span>];</span><br><span class="line"><span class="keyword">int</span> ans,n,m;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">&quot;%d%d&quot;</span>,&amp;n,&amp;m);</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">&quot;%d%d&quot;</span>,&amp;u[i],&amp;v[i]);</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">&quot;%lf%lf&quot;</span>,&amp;a[i].x,&amp;a[i].y);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> j=i+<span class="number">1</span>;j&lt;=m;j++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="function">Line <span class="title">l1</span><span class="params">(a[u[i]],a[v[i]])</span>,<span class="title">l2</span><span class="params">(a[u[j]],a[v[j]])</span></span>;</span><br><span class="line">            <span class="keyword">if</span>(<span class="built_in">sgn</span>((l1.e-l1.s)^(l2.e-l2.s))==<span class="number">0</span>)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span>(<span class="built_in">inter</span>(l1,l2))</span><br><span class="line">                &#123;</span><br><span class="line">                    Point b[<span class="number">5</span>];</span><br><span class="line">                    b[<span class="number">1</span>]=a[u[i]];</span><br><span class="line">                    b[<span class="number">1</span>].mark = i;</span><br><span class="line">                    b[<span class="number">2</span>]=a[u[j]];</span><br><span class="line">                    b[<span class="number">2</span>].mark = j;</span><br><span class="line">                    b[<span class="number">3</span>]=a[v[i]];</span><br><span class="line">                    b[<span class="number">3</span>].mark = i;</span><br><span class="line">                    b[<span class="number">4</span>]=a[v[j]];</span><br><span class="line">                    b[<span class="number">4</span>].mark = j;</span><br><span class="line">                    <span class="built_in">sort</span>(b+<span class="number">1</span>,b+<span class="number">1</span>+<span class="number">4</span>,cmp);</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">if</span> (b[<span class="number">1</span>].mark!=b[<span class="number">2</span>].mark &amp;&amp; !(b[<span class="number">2</span>].x == b[<span class="number">3</span>].x &amp;&amp; b[<span class="number">2</span>].y == b[<span class="number">3</span>].y))</span><br><span class="line">                        ans ++;</span><br><span class="line"></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span></span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">if</span>(<span class="built_in">inter</span>(l1,l2)) ans++;</span><br><span class="line">                <span class="keyword">if</span>(u[i]==u[j]||v[i]==u[j]||u[i]==v[j]||v[i]==v[j]) ans--;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;%d\n&quot;</span>,ans);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;special-judge-计算几何&quot;&gt;Special Judge [计算几何]&lt;/h1&gt;
&lt;h2 id=&quot;wannafly-day4-j&quot;&gt;Wannafly Day4 J&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>欧拉回路 [构造题]</title>
    <link href="https://blog.songer.xyz/Code/%E6%AC%A7%E6%8B%89%E5%9B%9E%E8%B7%AF%20[%E6%9E%84%E9%80%A0%E9%A2%98]/"/>
    <id>https://blog.songer.xyz/Code/%E6%AC%A7%E6%8B%89%E5%9B%9E%E8%B7%AF%20[%E6%9E%84%E9%80%A0%E9%A2%98]/</id>
    <published>2019-02-26T02:19:19.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="欧拉回路-构造题">欧拉回路 [构造题]</h1><h2 id="wannafly-day3-d">Wannafly Day3 D</h2><blockquote><p>虽说是构造题，实际这题并没有要求构造，只需输出最值即可。</p></blockquote><span id="more"></span><p>题目来源：<a href="https://zhixincode.com/contest/18/problem/D?problem_id=262"><em>comet OJ</em></a></p><h2 id="分析">分析</h2><p>对于这题，我们可以向欧拉回路的性质上去靠。首先我们都知道，欧拉回路的所有的点的度数都为偶数。那么，我们可以首先假设所有的边都被走过了一遍，此时我们可以得到一个此时的所有的点各自的度数的值。</p><p>那么，我们的目标便是令这些值都为偶数。方法则为将临近的两个奇数度数的点的连边走的次数+1，此时这两个点的度数都会便为偶数。若它们不相邻，则通过连边可以令度数为奇数的点的位置发生移动，最后移到相邻为止即可。</p><p>那么，消去某两个奇数度数点的代价其实就相当于它们之间的曼哈顿距离。而对于题目给出的这个矩形的图，所有奇数点都会出现在非四个顶点位置的四个边上。那么，我们便先将相邻的消掉，然后在对剩下的几个特殊判断处理即可。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n, m;</span><br><span class="line">    cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line">    ans += (n<span class="number">-1</span>) * m + (m<span class="number">-1</span>) * n;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (n%<span class="number">2</span>==<span class="number">0</span> &amp;&amp; m%<span class="number">2</span>==<span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        ans += n - <span class="number">2</span> + m - <span class="number">2</span>;</span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span> (n%<span class="number">2</span>==<span class="number">1</span> &amp;&amp; m%<span class="number">2</span>==<span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        ans += n - <span class="number">3</span> + m - <span class="number">3</span> + <span class="number">4</span>;</span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span> (n%<span class="number">2</span>==<span class="number">0</span> &amp;&amp; m%<span class="number">2</span>==<span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        ans += n - <span class="number">2</span> + m - <span class="number">3</span> + <span class="built_in">min</span>(<span class="number">3</span>, n - <span class="number">1</span>);</span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span> (n%<span class="number">2</span>==<span class="number">1</span> &amp;&amp; m%<span class="number">2</span>==<span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        ans += n - <span class="number">3</span> + m - <span class="number">2</span> + <span class="built_in">min</span>(<span class="number">3</span>, m - <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    cout &lt;&lt; ans &lt;&lt; endl;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;欧拉回路-构造题&quot;&gt;欧拉回路 [构造题]&lt;/h1&gt;
&lt;h2 id=&quot;wannafly-day3-d&quot;&gt;Wannafly Day3 D&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;虽说是构造题，实际这题并没有要求构造，只需输出最值即可。&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>小小马</title>
    <link href="https://blog.songer.xyz/Code/%E5%B0%8F%E5%B0%8F%E9%A9%AC/"/>
    <id>https://blog.songer.xyz/Code/%E5%B0%8F%E5%B0%8F%E9%A9%AC/</id>
    <published>2019-02-26T02:18:52.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="小小马">小小马</h1><h2 id="wannafly-day3-f">Wannafly Day3 F</h2><span id="more"></span><p>题目来源：<a href="https://zhixincode.com/contest/18/problem/F?problem_id=264"><em>comet OJ</em></a></p><h2 id="分析">分析</h2><p>这题其实也是一道思维题。首先，我们先考虑黑点和白点的问题。由于马的跳法，每次<span class="math inline">\(x\)</span>轴和<span class="math inline">\(y\)</span>轴的位移一奇一偶，那么下一个点一定和当前点颜色不同。所以，只要起点和终点颜色不同，则此条件一定满足。</p><p>然后我们考虑是否能到达的问题。我们来考虑棋盘上马的跳法，可以发现，当棋盘的大小大于<span class="math inline">\(3\times 3\)</span>时，马可以到达任何地方。而正好等于<span class="math inline">\(3\times 3\)</span>时，最中间的点无法到达。而棋盘等于<span class="math inline">\(2 \times n\)</span>的时候也直接判断即可。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">int</span> m,n,sx,sy,ex,ey;</span><br><span class="line"><span class="keyword">bool</span> res=<span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    cin&gt;&gt;n&gt;&gt;m&gt;&gt;sx&gt;&gt;sy&gt;&gt;ex&gt;&gt;ey;</span><br><span class="line">    <span class="keyword">if</span>(n==<span class="number">1</span>||m==<span class="number">1</span>||(sx&amp;<span class="number">1</span>)^(sy&amp;<span class="number">1</span>)==(ex&amp;<span class="number">1</span>)^(ey&amp;<span class="number">1</span>))</span><br><span class="line">    &#123;</span><br><span class="line">        res=<span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span>(n==<span class="number">2</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span>(<span class="built_in">abs</span>(ey-sy)%<span class="number">2</span>)</span><br><span class="line">            res=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>(ex!=<span class="number">2</span>-(sx+<span class="built_in">abs</span>(ey-sy)/<span class="number">2</span>)%<span class="number">2</span>)</span><br><span class="line">            res=<span class="number">0</span>;</span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span>(m==<span class="number">2</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span>(<span class="built_in">abs</span>(ex-sx)%<span class="number">2</span>)</span><br><span class="line">            res=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>(ey!=<span class="number">2</span>-(sy+<span class="built_in">abs</span>(ex-sx)/<span class="number">2</span>)%<span class="number">2</span>+<span class="number">1</span>)</span><br><span class="line">            res=<span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">else</span> <span class="keyword">if</span>(m==<span class="number">3</span>&amp;&amp;n==<span class="number">3</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span>((ex==<span class="number">2</span>&amp;&amp;ey==<span class="number">2</span>)||(sx==<span class="number">2</span>&amp;&amp;sy==<span class="number">2</span>))</span><br><span class="line">            res=<span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(res)</span><br><span class="line">        cout&lt;&lt;<span class="string">&quot;Yes&quot;</span>&lt;&lt;endl;</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        cout&lt;&lt;<span class="string">&quot;No&quot;</span>&lt;&lt;endl;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;小小马&quot;&gt;小小马&lt;/h1&gt;
&lt;h2 id=&quot;wannafly-day3-f&quot;&gt;Wannafly Day3 F&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
  <entry>
    <title>夺宝奇兵 [思维题]</title>
    <link href="https://blog.songer.xyz/Code/%E5%A4%BA%E5%AE%9D%E5%A5%87%E5%85%B5%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/"/>
    <id>https://blog.songer.xyz/Code/%E5%A4%BA%E5%AE%9D%E5%A5%87%E5%85%B5%20[%E6%80%9D%E7%BB%B4%E9%A2%98]/</id>
    <published>2019-02-26T02:18:27.000Z</published>
    <updated>2021-12-14T16:39:44.685Z</updated>
    
    <content type="html"><![CDATA[<h1 id="夺宝奇兵-思维题">夺宝奇兵 [思维题]</h1><h2 id="wannafly-day-3-a">Wannafly Day 3 A</h2><span id="more"></span><p>题目来源：<a href="https://zhixincode.com/contest/18/problem/A?problem_id=259"><em>comet OJ</em></a></p><h2 id="分析">分析</h2><p>这道题的关键在于依次从<span class="math inline">\(1\)</span>到<span class="math inline">\(n\)</span>然后从<span class="math inline">\(n\)</span>到<span class="math inline">\(1\)</span>。我们只考虑从<span class="math inline">\(i\)</span>到<span class="math inline">\(i+1\)</span>的情况，因为我们可以发现不同的<span class="math inline">\(i\)</span>之间是不会相互干扰的，那么：当我们的<span class="math inline">\(i\)</span>已确定时，我们只需要选择距离最近的<span class="math inline">\(i+1\)</span>即可。但我们要令<span class="math inline">\(i\)</span>到<span class="math inline">\(i+1\)</span>和后来的从<span class="math inline">\(i+1\)</span>回到<span class="math inline">\(i\)</span>的距离之和最小，那么只需要组合一下，取和最小的情况即可。</p><h2 id="代码">代码</h2><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 100100</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> x[MAXN][<span class="number">2</span>], y[MAXN][<span class="number">2</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">calc</span><span class="params">(<span class="keyword">int</span> i, <span class="keyword">int</span> j)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (j)</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">abs</span>(x[i+<span class="number">1</span>][<span class="number">0</span>] - x[i][<span class="number">0</span>]) + <span class="built_in">abs</span>(x[i+<span class="number">1</span>][<span class="number">1</span>] - x[i][<span class="number">1</span>]) + <span class="built_in">abs</span>(y[i+<span class="number">1</span>][<span class="number">0</span>] - y[i][<span class="number">0</span>]) + <span class="built_in">abs</span>(y[i+<span class="number">1</span>][<span class="number">1</span>] - y[i][<span class="number">1</span>]);</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">abs</span>(x[i+<span class="number">1</span>][<span class="number">0</span>] - x[i][<span class="number">1</span>]) + <span class="built_in">abs</span>(x[i+<span class="number">1</span>][<span class="number">1</span>] - x[i][<span class="number">0</span>]) + <span class="built_in">abs</span>(y[i+<span class="number">1</span>][<span class="number">0</span>] - y[i][<span class="number">1</span>]) + <span class="built_in">abs</span>(y[i+<span class="number">1</span>][<span class="number">1</span>] - y[i][<span class="number">0</span>]);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n, m;</span><br><span class="line">    cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;=n; i++)</span><br><span class="line">    &#123;</span><br><span class="line">        cin &gt;&gt; x[i][<span class="number">0</span>] &gt;&gt; y[i][<span class="number">0</span>];</span><br><span class="line">        cin &gt;&gt; x[i][<span class="number">1</span>] &gt;&gt; y[i][<span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> ans = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">1</span>; i&lt;n; i++)</span><br><span class="line">        ans += <span class="built_in">min</span>( <span class="built_in">calc</span>(i,<span class="number">0</span>), <span class="built_in">calc</span>(i,<span class="number">1</span>) );</span><br><span class="line"></span><br><span class="line">    ans += <span class="built_in">abs</span>(x[n][<span class="number">0</span>] - x[n][<span class="number">1</span>]) + <span class="built_in">abs</span>(y[n][<span class="number">0</span>] - y[n][<span class="number">1</span>]);</span><br><span class="line"></span><br><span class="line">    cout &lt;&lt; ans &lt;&lt; endl;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;夺宝奇兵-思维题&quot;&gt;夺宝奇兵 [思维题]&lt;/h1&gt;
&lt;h2 id=&quot;wannafly-day-3-a&quot;&gt;Wannafly Day 3 A&lt;/h2&gt;</summary>
    
    
    
    
  </entry>
  
</feed>
