<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Aquabet</title>
  
  <subtitle>Talk is cheap. Show me the code.</subtitle>
  <link href="http://blog.aquabet.xyz/atom.xml" rel="self"/>
  
  <link href="http://blog.aquabet.xyz/"/>
  <updated>2022-08-25T16:00:00.000Z</updated>
  <id>http://blog.aquabet.xyz/</id>
  
  <author>
    <name>Aquabet</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>短信同步到teltgram</title>
    <link href="http://blog.aquabet.xyz/TelegramBot/"/>
    <id>http://blog.aquabet.xyz/TelegramBot/</id>
    <published>2022-08-19T16:00:00.000Z</published>
    <updated>2022-08-25T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>&emsp;&emsp;<del>人在美国，刚下飞机</del>。总之我需要一个手机，接收来自中国的电话卡的短信和紧急的电话，也需要一个手机使用美国的电话卡。出门带两个手机明显不是一个好选择，故有此计划。</p><p>&emsp;&emsp;需求清单：</p><ul><li>一部在美国能收到信号的安卓手机（OLED屏幕手机优先）</li></ul><p>&emsp;&emsp;<strong>郑重声明</strong>：本文所提及的功能稳定性要求较高，故不适用于中国大陆地区。以下原因造成了本方法在中国大陆地区使用并不稳定。</p><ul><li>本方法基于Telegram的Bot功能，该功能在中国大陆地区不提供服务。</li><li>通过方法连接上的Telegram网络不稳定。</li><li>微信，QQ，以及其他所有在中国大陆地区能用的聊天软件中，没有一款是官方支持Bot的。使用自己搭建的Bot容易导致封号等，使用别人的非官方Bot容易导致数据泄露等。</li></ul><h2 id="Telegram配置"><a href="#Telegram配置" class="headerlink" title="Telegram配置"></a>Telegram配置</h2><h3 id="TelegramBot"><a href="#TelegramBot" class="headerlink" title="TelegramBot"></a>TelegramBot</h3><p>&emsp;&emsp;Telegram官方是支持Bot的，所以我们只需要添加telegram的Bot他爹 <a href="https://t.me/BotFather">@BotFather</a>，输入<code>/start</code>开始使用。</p><ol><li>输入<code>/newbot</code>，新建一个机器人。</li><li>输入想要的机器人显示的名字。</li><li>输入机器人的用户名，需要以<code>_bot</code>为结尾。</li></ol><p>&emsp;&emsp;之后他会返回你一个账号，如<code>t.me/xxx_bot</code>，该账号即为你的机器人，添加即可。你应该还会收到一个 <code>token</code>，形如 <code>123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11</code>，记下备用，下文使用&lt;token&gt;表示。</p><h3 id="获取个人id"><a href="#获取个人id" class="headerlink" title="获取个人id"></a>获取个人id</h3><p>&emsp;&emsp;添加telegram的机器人 <a href="https://t.me/getidsbot">@GetIDs Bot</a>，开始之后他会返回您的个人信息如下：</p><blockquote><p>├ id: 123456789<br>├ is_bot: false<br>├ first_name: xxx<br>├ username: xxx<br>└ language_code: xxx</p></blockquote><p>&emsp;&emsp;记住id那一串数字，下一步备用，下文使用&lt;userID&gt;表示。</p><p>&emsp;&emsp;<strong>请自行替换下文中的&lt;token&gt;和&lt;userID&gt;</strong><br>&emsp;&emsp;<strong>请自行替换下文中的&lt;token&gt;和&lt;userID&gt;</strong><br>&emsp;&emsp;<strong>请自行替换下文中的&lt;token&gt;和&lt;userID&gt;</strong></p><h3 id="测试你的Bot"><a href="#测试你的Bot" class="headerlink" title="测试你的Bot"></a>测试你的Bot</h3><p>&emsp;&emsp;Bot到目前为止已经配置完全，telegramBot的API为：</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;api.telegram.org&#x2F;bot&lt;token&gt;&#x2F;METHOD_NAME</span><br></pre></td></tr></table></figure><p><strong>（bot&lt;token&gt;的bot三个字母不要删，替换&lt;token&gt;即可）</strong><br>&emsp;&emsp;我们这里使用的METHOD是<code>sendMessage</code>，详细使用方法<a href="https://core.telegram.org/bots/api#sendmessage">点击这里</a>。</p><p>&emsp;&emsp;测试只需要给自己发条信息，故请求</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;api.telegram.org&#x2F;bot&lt;token&gt;&#x2F;sendMessage?chat_id&#x3D;&lt;userID&gt;&amp;text&#x3D;Hello%20World!</span><br></pre></td></tr></table></figure><p>，Telegram中收到该消息则表示配置成功。</p><h2 id="Tasker配置"><a href="#Tasker配置" class="headerlink" title="Tasker配置"></a>Tasker配置</h2><p>&emsp;&emsp;手机端需要安装<a href="https://play.google.com/store/apps/details?id=net.dinglisch.android.taskerm&hl=en_US&gl=US">Tasker</a>。<span class="heimu" title="要破解版联系我">请支持正版。</span></p><h3 id="测试tasker任务"><a href="#测试tasker任务" class="headerlink" title="测试tasker任务"></a>测试tasker任务</h3><p>&emsp;&emsp;在<code>任务</code>中新建任务，随意命名如<code>短信转发</code>。在任务编辑中<code>新建任务</code>，选择<code>网络</code>中的<code>HTTP Request</code>，方法选择<code>PUT</code>，<code>URL</code>输入上文的测试信息</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;api.telegram.org&#x2F;bot&lt;token&gt;&#x2F;sendMessage?chat_id&#x3D;&lt;userID&gt;&amp;text&#x3D;Hello%20World!</span><br></pre></td></tr></table></figure><p>。返回<code>任务编辑</code>界面，左下角运行，Telegram中收到该消息则表示配置成功。</p><h3 id="配置tasker任务"><a href="#配置tasker任务" class="headerlink" title="配置tasker任务"></a>配置tasker任务</h3><p>&emsp;&emsp;回到<code>HTTP Request</code>的设置，将<code>URL</code>修改为你想要的格式，我使用的是</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">https:&#x2F;&#x2F;api.telegram.org&#x2F;bot&lt;token&gt;&#x2F;sendMessage?chat_id&#x3D;&lt;userID&gt;&amp;text&#x3D;%SMSRB %0A%0A%0A发件人：%SMSRN %0A时间：%SMSRD %SMSRT</span><br></pre></td></tr></table></figure><p>&emsp;&emsp;返回<code>任务编辑</code>界面，左下角运行，Telegram中收到最近接收的一条短信则表示配置成功。</p><h3 id="配置tasker事件"><a href="#配置tasker事件" class="headerlink" title="配置tasker事件"></a>配置tasker事件</h3><p>&emsp;&emsp;在<code>配置文件</code>中新建<code>事件</code>，选择<code>电话</code>中的<code>收到短信</code>。过滤器等可以按需选择。之后选择刚才配置的任务，如我上文的命名<code>短信转发</code>。</p><h2 id="Enjoy"><a href="#Enjoy" class="headerlink" title="Enjoy"></a>Enjoy</h2><ul><li>关闭手机的省电优化</li><li>打开Tasker的开机自启动</li><li>（仅限OLED屏幕的手机）安装应用<a href="https://www.coolapk.com/apk/com.hm.jhclock">简黑时钟</a>，桌面安装手机支架，选个好位置摆放。</li><li>给手机插上充电器。</li></ul><p>Enjoy It!</p>]]></content>
    
    
    <summary type="html">短信同步到teltgram</summary>
    
    
    
    <category term="Diary" scheme="http://blog.aquabet.xyz/categories/Diary/"/>
    
    
  </entry>
  
  <entry>
    <title>Codeforces Good Bye 2021: 2022 is NEAR</title>
    <link href="http://blog.aquabet.xyz/Good%20Bye%202021:%202022%20is%20NEAR/"/>
    <id>http://blog.aquabet.xyz/Good%20Bye%202021:%202022%20is%20NEAR/</id>
    <published>2021-12-30T16:00:00.000Z</published>
    <updated>2022-01-01T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;这次补了题，发现好多东西都不会了。</p><span id="more"></span><h2 id="先放题目"><a href="#先放题目" class="headerlink" title="先放题目"></a>先放题目</h2><p>&emsp;&emsp;<a href="https://codeforces.com/contest/1616">Good Bye 2021: 2022 is NEAR</a></p><h2 id="A-Integer-Diversity"><a href="#A-Integer-Diversity" class="headerlink" title="A. Integer Diversity"></a><a href="https://codeforces.com/contest/1616/problem/A">A. Integer Diversity</a></h2><h3 id="题目大意"><a href="#题目大意" class="headerlink" title="题目大意"></a>题目大意</h3><p>&emsp;&emsp;给定一个数组<code>a</code>，可以对其中任意个数变为相反数 $x \rightarrow -x$ 。问最多可以有多少个不同的数。</p><h3 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h3><p>&emsp;&emsp;计算每个数的绝对值出现的次数。出现次数大于2的取2，0取1。求和。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#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">int</span> num;</span><br><span class="line">    <span class="built_in">cin</span>&gt;&gt;num;</span><br><span class="line">    <span class="keyword">int</span> nums[<span class="number">101</span>];</span><br><span class="line">    <span class="built_in">memset</span>(nums, <span class="number">0</span>, <span class="keyword">sizeof</span>(nums));</span><br><span class="line">    <span class="keyword">int</span> thenum;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; num; i++) &#123;</span><br><span class="line">        <span class="built_in">cin</span>&gt;&gt;thenum;</span><br><span class="line">        nums[<span class="built_in">abs</span>(thenum)]++;</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">0</span>; i &lt;= <span class="number">100</span>; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span>(i == <span class="number">0</span> &amp;&amp; nums[i] != <span class="number">0</span>) &#123;</span><br><span class="line">            ans += <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>(nums[i] &gt; <span class="number">2</span>) &#123;</span><br><span class="line">            ans += <span class="number">2</span>;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            ans += nums[i];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">cout</span>&lt;&lt;ans&lt;&lt;<span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="B-Mirror-in-the-String"><a href="#B-Mirror-in-the-String" class="headerlink" title="B. Mirror in the String"></a><a href="https://codeforces.com/contest/1616/problem/B">B. Mirror in the String</a></h2><h3 id="题目大意-1"><a href="#题目大意-1" class="headerlink" title="题目大意"></a>题目大意</h3><p>&emsp;&emsp;题意：给定字符串，选定 $k$，使得 $s_1s_2…s_ks_ks_{k-1}…s_1$ 的字典序最小。</p><h3 id="思路-1"><a href="#思路-1" class="headerlink" title="思路"></a>思路</h3><p>&emsp;&emsp;贪心。</p><ul><li>若 $s_1 = s_2$ ，显然 $s_1s_2$ 是最优解。</li><li>否则，取最长的一段不上升的前缀。</li></ul><h3 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h3><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    <span class="built_in">string</span> s;</span><br><span class="line">    <span class="built_in">cin</span>&gt;&gt;n&gt;&gt;s;</span><br><span class="line">    <span class="keyword">if</span>(n &gt;= <span class="number">2</span> &amp;&amp; s[<span class="number">0</span>] == s[<span class="number">1</span>]) &#123;</span><br><span class="line">        <span class="built_in">cout</span>&lt;&lt;s[<span class="number">0</span>]&lt;&lt;s[<span class="number">0</span>]&lt;&lt;<span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">        <span class="keyword">return</span>;</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">0</span>; i &lt; n<span class="number">-1</span>; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span>(s[i] &lt; s[i+<span class="number">1</span>]) &#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; j++) &#123;</span><br><span class="line">                <span class="built_in">cout</span>&lt;&lt;s[j];</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">for</span>(<span class="keyword">int</span> j = i; j &gt;= <span class="number">0</span>; j--)&#123;</span><br><span class="line">                <span class="built_in">cout</span>&lt;&lt;s[j];</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="built_in">cout</span>&lt;&lt;<span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">            <span class="keyword">return</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> j = <span class="number">0</span>; j &lt; n; j++) &#123;</span><br><span class="line">        <span class="built_in">cout</span>&lt;&lt;s[j];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> j = n<span class="number">-1</span>; j &gt;= <span class="number">0</span>; j--) &#123;</span><br><span class="line">        <span class="built_in">cout</span>&lt;&lt;s[j];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">cout</span>&lt;&lt;<span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="C-Representative-Edges"><a href="#C-Representative-Edges" class="headerlink" title="C. Representative Edges"></a><a href="https://codeforces.com/contest/1616/problem/C">C. Representative Edges</a></h2><h3 id="题目大意-2"><a href="#题目大意-2" class="headerlink" title="题目大意"></a>题目大意</h3><p>&emsp;&emsp;给定数组，至少要修改几个元素，才能使得数组变为等差数列。</p><h3 id="思路-2"><a href="#思路-2" class="headerlink" title="思路"></a>思路</h3><p>&emsp;&emsp;不变的数最少是2个，直接枚举不变的2个数，计算其他位置是否可以不变，取最小。$1 \leq n \leq 70$，$O(n^3)$，能过。</p><h3 id="代码-2"><a href="#代码-2" class="headerlink" title="代码"></a>代码</h3><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    <span class="built_in">cin</span>&gt;&gt;n;</span><br><span class="line">    <span class="keyword">int</span> a[n];</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 class="built_in">cin</span>&gt;&gt;a[i];</span><br><span class="line">    <span class="keyword">int</span> ans = <span class="number">99</span>;</span><br><span class="line">    <span class="keyword">if</span>(n &lt;= <span class="number">2</span>) &#123;</span><br><span class="line">        <span class="built_in">cout</span>&lt;&lt;<span class="number">0</span>&lt;&lt;<span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">        <span class="keyword">return</span>;</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">0</span>; i &lt; n; i++) &#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; n; j++) &#123;</span><br><span class="line">            <span class="keyword">double</span> d = (a[j] - a[i]) * <span class="number">1.0</span> / (j-i);</span><br><span class="line">            <span class="keyword">int</span> tot = n;</span><br><span class="line">            <span class="keyword">for</span>(<span class="keyword">int</span> k = <span class="number">0</span>; k &lt; n; k++) &#123;</span><br><span class="line">                <span class="keyword">if</span>(<span class="built_in">abs</span>(a[k] - (a[i] + (k-i) * d)) &lt;= <span class="number">1e-10</span>) tot--;</span><br><span class="line">            &#125;</span><br><span class="line">            ans = min(ans, tot);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">cout</span>&lt;&lt;ans&lt;&lt;<span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="D-Keep-the-Average-High"><a href="#D-Keep-the-Average-High" class="headerlink" title="D. Keep the Average High"></a><a href="https://codeforces.com/contest/1616/problem/D">D. Keep the Average High</a></h2><h3 id="题目大意-3"><a href="#题目大意-3" class="headerlink" title="题目大意"></a>题目大意</h3><p>&emsp;&emsp;给一个数组a和一个数x。要在a中选择尽可能多的数，使得任意一个长度大于1的子数组 $a_l, a_{l+1} ,…,a_r$ 满足以下条件：</p><ul><li>子数组中存在某个数没有被选择</li><li>$a_l+a_{l+1}+…+a_r \geq x \cdot (r-l+1)$</li></ul><p>&emsp;&emsp;问可以选多少个。</p><h3 id="思路-3"><a href="#思路-3" class="headerlink" title="思路"></a>思路</h3><p>&emsp;&emsp;贪心。$a_l+a_{l+1}+…+a_r \geq x \cdot (r-l+1)$ 表明子数组平均值不小于$x$。所以不能取两个相邻且都小于$x$的数。<br><br>&emsp;&emsp;首先观察如何判断一个取法是否可行。让大于等于x的标记为x，小于的标记为y，则所有可行的取法的子数组必须满足如下模式：</p><ul><li>y或者没有y接着若干个x，然后接着一个y再接着若干个x…。比如yxxy,yxyxyxxy, xxy等等。</li></ul><p>&emsp;&emsp;注意到：</p><ul><li>如果有连续的x，则两部分可以分开判断，子数组为aaaaax xbbbbb，则只需分别判断子数组aaaax 以及xbbbbb是否合法即可。因为两个数的平均数大于等于小的一个。</li><li>同理yxyxyxy的情况只需分别判断每个yxy以及yx,xy是否满足条件即可。</li></ul><p>&emsp;&emsp;因此要判断一个取法是否可行，则只需判断长度为2和3的子数组即可。<br>&emsp;&emsp;我们可以从头到尾贪心取，让前i个取尽量多的数，如果数目相同，则尽量让最后一个最靠前。当前位置为i，如果i - 1没取，那么当前位置就可以取，数目加1。<br>&emsp;&emsp;如果前两个值都取，则判断 <code>a[i] + a[i - 1] + a[i - 2] ≥ 3x</code> 以及 <code>a[i] + a[i - 1] ≥ 2x</code> 是否成立，如果不成立，说明有冲突，选了<code>a[i]</code>就不能选择<code>a[i - 1]</code>，最优肯定是选择<code>a[i - 1]</code>而不是选择<code>a[i]</code>。所以成立就选，不成立不选。<br>&emsp;&emsp;如果只有 <code>a[i - 1]</code> 被取了，<code>a[i - 2]</code> 没被取，则只需判断 <code>a[i] + a[i - 1] ≥ 2x</code> 是否成立。成立就可以选。</p><h3 id="代码-3"><a href="#代码-3" class="headerlink" title="代码"></a>代码</h3><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> n, x;</span><br><span class="line">    <span class="built_in">cin</span>&gt;&gt;n;</span><br><span class="line">    <span class="keyword">int</span> a[n], vis[n];</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++) &#123;</span><br><span class="line">        <span class="built_in">cin</span>&gt;&gt;a[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">memset</span>(vis, <span class="number">0</span>, <span class="keyword">sizeof</span>(vis));</span><br><span class="line">    <span class="built_in">cin</span>&gt;&gt;x;</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">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (i==<span class="number">0</span> || !vis[i - <span class="number">1</span>]) &#123;</span><br><span class="line">            vis[i] = <span class="number">1</span>;</span><br><span class="line">            ans++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>(i &gt;= <span class="number">2</span> &amp;&amp; vis[i - <span class="number">2</span>]) &#123;</span><br><span class="line">            <span class="keyword">if</span>((a[i] + a[i - <span class="number">1</span>]) &gt;= <span class="number">2</span> * x &amp;&amp; (a[i] + a[i - <span class="number">1</span>] + a[i - <span class="number">2</span>]) &gt;= <span class="number">3</span> * x) &#123;</span><br><span class="line">                ans++;</span><br><span class="line">                vis[i] = <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">else</span> <span class="keyword">if</span> (i &gt;= <span class="number">1</span> &amp;&amp; (a[i] + a[i - <span class="number">1</span>]) &gt;= <span class="number">2</span> * x) &#123;</span><br><span class="line">            ans++;</span><br><span class="line">            vis[i] = <span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">cout</span>&lt;&lt;ans&lt;&lt;<span class="string">&quot;\n&quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="E-Lexicographically-Small-Enough"><a href="#E-Lexicographically-Small-Enough" class="headerlink" title="E. Lexicographically Small Enough"></a><a href="https://codeforces.com/contest/1616/problem/E">E. Lexicographically Small Enough</a></h2><h3 id="题目大意-4"><a href="#题目大意-4" class="headerlink" title="题目大意"></a>题目大意</h3><p>&emsp;&emsp;给定字符串 $s,t$ ，每次操作可以将 $s$ 中的相邻元素交换。问至少需要交换多少组相邻元素可以使得 $s &lt; t$。</p><h3 id="思路-4"><a href="#思路-4" class="headerlink" title="思路"></a>思路</h3><p>&emsp;&emsp;枚举相同前缀的长度，贪心。</p><ul><li>假设相同前缀已经固定，长度为 $i(0\le i \le n-1)$，那么最优的情况就是从后面选择一个小于 $t[i]$ 的字符交换过来。最优情况就是选择最近的。</li><li>枚举每个$i$，从0开始，要么从后面选择一个最近的小于 $t[i]$ 的字符过来，要么选择一个等于的让前缀相同。每次选择一个等于的过来，维护剩下的字符后缀(i + 1 ~ n)。这样每次移动可能要 $O(n)$ 来维护，总的复杂度需要 $O(n^2)$。我们可以使用树状数组来维护，只需记录每个位置，有多少个本来位于其后的字符启动到前面去。我们用原来的位置加上这个数就是其当前的位置。复杂度 $O(nlogn)$。</li></ul><h3 id="代码-4"><a href="#代码-4" class="headerlink" title="代码"></a>代码</h3><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> n;</span><br><span class="line"><span class="built_in">vector</span> &lt;<span class="keyword">int</span>&gt; pos[<span class="number">30</span>];</span><br><span class="line"><span class="built_in">string</span> a, b;</span><br><span class="line"><span class="built_in">pair</span>&lt;<span class="keyword">int</span>, <span class="keyword">int</span>&gt; ST[<span class="number">4</span> * <span class="number">100000</span>];</span><br><span class="line"><span class="keyword">bool</span> Erase[<span class="number">100000</span>];</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">Build</span><span class="params">(<span class="keyword">int</span> id, <span class="keyword">int</span> l, <span class="keyword">int</span> r)</span> </span>&#123;</span><br><span class="line">    ST[id] = &#123;<span class="number">0</span>, <span class="number">0</span>&#125;;</span><br><span class="line">    <span class="keyword">if</span>(l == r) &#123;</span><br><span class="line">        ST[id] = &#123;l, <span class="number">0</span>&#125;;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">int</span> mid = (l + r) &gt;&gt; <span class="number">1</span>;</span><br><span class="line">    Build(id &lt;&lt; <span class="number">1</span>, l, mid);</span><br><span class="line">    Build(id &lt;&lt; <span class="number">1</span> ^ <span class="number">1</span>, mid + <span class="number">1</span>, r);</span><br><span class="line">    ST[id].first = max(ST[id &lt;&lt; <span class="number">1</span>].first, ST[id &lt;&lt; <span class="number">1</span> ^ <span class="number">1</span>].first);</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">Down</span><span class="params">(<span class="keyword">int</span> id)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> tmp = ST[id].second;</span><br><span class="line">    ST[id &lt;&lt; <span class="number">1</span>].first += tmp;</span><br><span class="line">    ST[id &lt;&lt; <span class="number">1</span>].second += tmp;</span><br><span class="line">    ST[id &lt;&lt; <span class="number">1</span> ^ <span class="number">1</span>].first += tmp;</span><br><span class="line">    ST[id &lt;&lt; <span class="number">1</span> ^ <span class="number">1</span>].second += tmp;</span><br><span class="line">    ST[id].second = <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">void</span> <span class="title">Update</span><span class="params">(<span class="keyword">int</span> id, <span class="keyword">int</span> l, <span class="keyword">int</span> r, <span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(r &lt; x || y &lt; l) <span class="keyword">return</span>;</span><br><span class="line">    <span class="keyword">if</span>(x &lt;= l &amp;&amp; r &lt;= y) &#123;</span><br><span class="line">        ST[id].first++;</span><br><span class="line">        ST[id].second++;</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    Down(id);</span><br><span class="line">    <span class="keyword">int</span> mid = (l + r) &gt;&gt; <span class="number">1</span>;</span><br><span class="line">    Update(id &lt;&lt; <span class="number">1</span>, l, mid, x, y);</span><br><span class="line">    Update(id &lt;&lt; <span class="number">1</span> ^ <span class="number">1</span>, mid + <span class="number">1</span>, r, x, y);</span><br><span class="line">    ST[id].first = max(ST[id &lt;&lt; <span class="number">1</span>].first, ST[id &lt;&lt; <span class="number">1</span> ^ <span class="number">1</span>].first);</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">Get</span><span class="params">(<span class="keyword">int</span> id, <span class="keyword">int</span> l, <span class="keyword">int</span> r, <span class="keyword">int</span> i)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(r &lt; i || i &lt; l) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span>(l == r) <span class="keyword">return</span> ST[id].first;</span><br><span class="line">    Down(id);</span><br><span class="line">    <span class="keyword">int</span> mid = (l + r) &gt;&gt; <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">return</span> max(Get(id &lt;&lt; <span class="number">1</span>, l, mid, i), Get(id &lt;&lt; <span class="number">1</span> ^ <span class="number">1</span>, mid + <span class="number">1</span>, r, i));</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">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    pos-&gt;clear();</span><br><span class="line">    <span class="built_in">memset</span>(Erase, <span class="number">0</span>, <span class="keyword">sizeof</span>(Erase));</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; n &gt;&gt; a &gt;&gt; b;</span><br><span class="line">    a = <span class="string">&#x27; &#x27;</span> + a; b = <span class="string">&#x27; &#x27;</span> + b;</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>(a[i] != b[i]) &#123;</span><br><span class="line">            <span class="keyword">if</span>(a[i] &lt; b[i]) &#123;</span><br><span class="line">                <span class="built_in">cout</span> &lt;&lt; <span class="number">0</span> &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">                <span class="keyword">return</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    Build(<span class="number">1</span>, <span class="number">1</span>, n);</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> res = INT64_MAX, ans = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i = n; i &gt;= <span class="number">1</span>; i--)</span><br><span class="line">        pos[a[i] - <span class="string">&#x27;a&#x27;</span>].push_back(i);</span><br><span class="line">    <span class="keyword">int</span> p = <span class="number">1</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">        <span class="keyword">while</span>(p &lt;= n &amp;&amp; Erase[p]) &#123;</span><br><span class="line">            p++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">int</span> Min = n + <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">for</span>(<span class="keyword">int</span> j = <span class="number">0</span>; j &lt; b[i] - <span class="string">&#x27;a&#x27;</span>; j++)</span><br><span class="line">            <span class="keyword">if</span>(!pos[j].empty()) &#123;</span><br><span class="line">                Min = min(Min, Get(<span class="number">1</span>, <span class="number">1</span>, n, pos[j].back()));</span><br><span class="line">            &#125;</span><br><span class="line">        <span class="keyword">if</span>(Min &lt;= n) res = min(res, ans + Min - i);</span><br><span class="line">        <span class="keyword">if</span>(a[p] == b[i]) &#123;</span><br><span class="line">            pos[a[p] - <span class="string">&#x27;a&#x27;</span>].pop_back();</span><br><span class="line">            p++;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>(a[p] &lt; b[i]) &#123;</span><br><span class="line">            res = min(res, ans);</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">if</span>(pos[b[i] - <span class="string">&#x27;a&#x27;</span>].empty()) <span class="keyword">break</span>;</span><br><span class="line">            ans += Get(<span class="number">1</span>, <span class="number">1</span>, n, pos[b[i] - <span class="string">&#x27;a&#x27;</span>].back()) - i;</span><br><span class="line">            Erase[pos[b[i] - <span class="string">&#x27;a&#x27;</span>].back()] = <span class="number">1</span>;</span><br><span class="line">            Update(<span class="number">1</span>, <span class="number">1</span>, n, <span class="number">1</span>, pos[b[i] - <span class="string">&#x27;a&#x27;</span>].back());</span><br><span class="line">            pos[b[i] - <span class="string">&#x27;a&#x27;</span>].pop_back();</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">cout</span> &lt;&lt; (res == INT64_MAX ? <span class="number">-1</span> : res) &lt;&lt; <span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="F-Tricolor-Triangles"><a href="#F-Tricolor-Triangles" class="headerlink" title="F. Tricolor Triangles"></a><a href="https://codeforces.com/contest/1616/problem/F">F. Tricolor Triangles</a></h2><h3 id="题目大意-5"><a href="#题目大意-5" class="headerlink" title="题目大意"></a>题目大意</h3><p>&emsp;&emsp;给定一个无向图，至多64个点，至多256条边。要给这些边涂上3种颜色之一，其中有些边已经有颜色，有些未涂色。要求一个涂色方案，使得任何一个构成三角形的三条边颜色要么都相同，要么各不相同。如果不存在合法的涂色方案，输出-1。</p><h3 id="思路-5"><a href="#思路-5" class="headerlink" title="思路"></a>思路</h3><p>&emsp;&emsp;三条边的颜色a,b,c满足相同或各不相同这个条件，可以转化为 $(a + b + c) \% 3 = 0$。<br><br>&emsp;&emsp;建立一个矩阵A，每一行表示每个三角形，每一列表示一条边。每一行有三个位置为1，表示组成这个三角形的三条边。则问题等价于一个同余线性方程$Ax \equiv b mod 3$，其中$x$为每条边的颜色，b为全0。已知 $A,b$，求 $x$。<br><br>&emsp;&emsp;线性同余方程可以用高斯消元求解。由于三角形的个数上界为$m\sqrt{m}$，所以总复杂度为$O(m^3 \sqrt{m})$。</p><h2 id="后记-2021年度总结"><a href="#后记-2021年度总结" class="headerlink" title="后记 2021年度总结"></a>后记 2021年度总结</h2><iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=551339691&auto=0&height=66"></iframe><p>&emsp;&emsp;2021也是过的一塌糊涂。回望过去，发现又是啥都没干的一年，唯一收获的证书是<span class="heimu" title="你知道的太多了">驾照(x</span>。绩点始终上不去，比赛参加一场崩一场，项目做一个烂一个，最后考雅思又被西安疫情打乱。<br>&emsp;&emsp;天天在宿舍neet也不知道在干嘛。好像番也没看几部，游戏也没上分。只有偶尔刷刷题能抚慰下我焦躁的内心。然后发现好多算法、数据结构都忘了，或者只能口胡，打不出来。然后就跳过，也懒得复习，更不必说学新的算法了。<br>&emsp;&emsp;新年愿望啊，愿望是啥呢？好像啥都没有。雅思上岸？绩点飞升？感觉都随缘了，我的人生如果能一直neet下去就好了。<br>&emsp;&emsp;那就希望2022每天都能洗澡吧（x<br>&emsp;&emsp;&emsp;&emsp;&emsp;&emsp;–来自西安疫区在宿舍隔离澡堂不开已经18天没洗澡的我<br>&emsp;&emsp;Update：2022/1/2 看来愿望没实现呢，是说出来就不灵了吗：）</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;emsp;&amp;emsp;这次补了题，发现好多东西都不会了。&lt;/p&gt;</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="Codeforces" scheme="http://blog.aquabet.xyz/tags/Codeforces/"/>
    
  </entry>
  
  <entry>
    <title>Codeforces Round #761 (Div. 2) 解题报告</title>
    <link href="http://blog.aquabet.xyz/Codeforces%20Round%20761%20(Div.%202)/"/>
    <id>http://blog.aquabet.xyz/Codeforces%20Round%20761%20(Div.%202)/</id>
    <published>2021-12-16T16:00:00.000Z</published>
    <updated>2021-12-17T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;好久没打cf了，因为疫情困宿舍没事干，老年选手出来活动下筋骨。只写了ABC，困了就睡了。也懒得复盘补题了。</p><span id="more"></span><h2 id="先放题目"><a href="#先放题目" class="headerlink" title="先放题目"></a>先放题目</h2><p>&emsp;&emsp;<a href="https://codeforces.com/contest/1617">Codeforces Round #761 (Div. 2)</a></p><h2 id="A"><a href="#A" class="headerlink" title="A"></a>A</h2><h3 id="题目大意"><a href="#题目大意" class="headerlink" title="题目大意"></a>题目大意</h3><p>&emsp;&emsp;给俩字符串<code>S</code>，<code>T</code>，其中<code>T</code>为字符串<code>&quot;abc&quot;</code>的排列。求<code>S</code>的排列<code>S&#39;</code>，使得<code>T</code>不是<code>S&#39;</code>的字串且<code>S&#39;</code>字典序最小。</p><h3 id="思路"><a href="#思路" class="headerlink" title="思路"></a>思路</h3><ul><li>如果<code>S</code>中包含了<code>a</code>，<code>b</code>，<code>c</code>三个字母，且<code>T ==&quot;abc&quot;</code>，将<code>S</code>排序后交换<code>b</code>和<code>c</code>的位置，即为答案<code>S&#39;</code>。</li><li>否则则<code>S&#39;</code>就是<code>S</code>的最小字典序。将<code>S</code>排序输出即可。</li></ul><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><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;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</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>&#123;</span><br><span class="line">    <span class="comment">// freopen(&quot;test.in&quot;, &quot;r&quot;, stdin);</span></span><br><span class="line">    <span class="keyword">int</span> n;</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">    <span class="keyword">while</span>(n--) &#123;</span><br><span class="line">        <span class="built_in">string</span> s, t;</span><br><span class="line">        <span class="built_in">cin</span>&gt;&gt;s&gt;&gt;t;</span><br><span class="line">        <span class="keyword">int</span> lens = s.length();</span><br><span class="line">        sort(s.begin(), s.end());</span><br><span class="line">        <span class="keyword">if</span>(t == <span class="string">&quot;abc&quot;</span>) &#123;</span><br><span class="line">            <span class="keyword">int</span> bBegin = lower_bound(s.begin(), s.end(), <span class="string">&#x27;b&#x27;</span>) - s.begin();</span><br><span class="line">            <span class="keyword">int</span> cEnd = upper_bound(s.begin(), s.end(), <span class="string">&#x27;c&#x27;</span>) - s.begin() - <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">if</span>(bBegin &lt; lens - <span class="number">1</span> &amp;&amp; s[cEnd] == <span class="string">&#x27;c&#x27;</span> &amp;&amp; bBegin &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                <span class="keyword">while</span>(bBegin &lt; cEnd) &#123;</span><br><span class="line">                    <span class="keyword">if</span>(s[bBegin] == s[cEnd]) &#123;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    &#125;</span><br><span class="line">                    swap(s[bBegin], s[cEnd]);</span><br><span class="line">                    bBegin++;</span><br><span class="line">                    cEnd--;</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">cout</span>&lt;&lt;s&lt;&lt;<span class="string">&quot;\n&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="B"><a href="#B" class="headerlink" title="B"></a>B</h2><h3 id="题目大意-1"><a href="#题目大意-1" class="headerlink" title="题目大意"></a>题目大意</h3><p>&emsp;&emsp;给定一个数<code>n</code>，求三个数<code>a</code>，<code>b</code>，<code>c</code>，使得$a+b+c=n$，且 $gcd(a,b)=c$， 且$a \neq b \neq c$。</p><h3 id="思路-1"><a href="#思路-1" class="headerlink" title="思路"></a>思路</h3><ul><li>直接暴力令$c=1$</li><li>如果<code>n</code>为偶数，$a=n/2 , b=n/2 + 1 , c=1$</li><li>如果<code>n</code>为奇数，<ul><li>如果 $n/2$ 为偶数，$a=n/2 - 1 , b=n/2 + 1, c=1$</li><li>如果 $n/2$ 为奇数，$a=n/2 - 2 , b=n/2 + 2, c=1$</li></ul></li></ul><p>&emsp;&emsp;(我比赛代码没严格证明为奇数的两个状态，直接写了个循环暴力找的)</p><h3 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h3><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">gcd</span><span class="params">(<span class="keyword">int</span> a, <span class="keyword">int</span> b)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> b &gt; <span class="number">0</span> ? gcd(b, a%b) : a;</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>&#123;</span><br><span class="line">    <span class="comment">// freopen(&quot;test.in&quot;, &quot;r&quot;, stdin);</span></span><br><span class="line">    <span class="keyword">int</span> n;</span><br><span class="line">    <span class="built_in">cin</span>&gt;&gt;n;</span><br><span class="line">    <span class="keyword">while</span>(n--) &#123;</span><br><span class="line">        <span class="keyword">int</span> number;</span><br><span class="line">        <span class="built_in">cin</span> &gt;&gt; number;</span><br><span class="line">        <span class="keyword">if</span>(number % <span class="number">2</span> == <span class="number">1</span>) &#123;</span><br><span class="line">            <span class="keyword">int</span> gap = <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">while</span>(gcd(number/<span class="number">2</span>-gap, number/<span class="number">2</span>+gap) != <span class="number">1</span>) &#123;</span><br><span class="line">                gap++;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="built_in">cout</span>&lt;&lt;number/<span class="number">2</span>-gap&lt;&lt;<span class="string">&quot; &quot;</span>&lt;&lt;number/<span class="number">2</span>+gap&lt;&lt;<span class="string">&quot; &quot;</span>&lt;&lt;<span class="number">1</span>&lt;&lt;<span class="built_in">endl</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="built_in">cout</span>&lt;&lt;number/<span class="number">2</span> - <span class="number">1</span>&lt;&lt;<span class="string">&quot; &quot;</span>&lt;&lt;number/<span class="number">2</span>&lt;&lt;<span class="string">&quot; &quot;</span>&lt;&lt;<span class="number">1</span>&lt;&lt;<span class="built_in">endl</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><h2 id="C"><a href="#C" class="headerlink" title="C"></a>C</h2><h3 id="题目大意-2"><a href="#题目大意-2" class="headerlink" title="题目大意"></a>题目大意</h3><p>&emsp;&emsp;给定一个<code>n</code>，以及一个长度为n的数组。每次操作，选择其中一个数字<code>a</code>，以及任取一个正整数<code>x</code>，让$a = a % x$。问能不能将数组通过若干次操作后变成<code>1 ~ n</code>的一个排列，如果不能，输出<code>-1</code>，能的话输出最少操作次数。</p><h3 id="思路-2"><a href="#思路-2" class="headerlink" title="思路"></a>思路</h3><p>&emsp;&emsp;注意到，一个数模另一个小于它的数，肯定是变小的，a → a % x。并且$2 * (a \% x) \leq a$。<br><br>&emsp;&emsp;首先为了最优性，那些刚好能填补<code>1 ~ n</code>的位置的数，先填补上，这部分肯定是不变的。<br>&emsp;&emsp;我们贪心，从小到大，查找空缺的位置，如果存在空缺<code>k</code>，则需要在剩下的数中取大于<code>2k</code>的一个数<code>a</code>，通过操作后，填补<code>k</code>的位置。为了最优，肯定是取最小的，且没有被使用过的数。<br>&emsp;&emsp;可以通过优先队列来维护每次最小值。遇到一个空缺位置<code>k</code>，如果<code>当前最小值 &lt; 2k</code>，则无解，否则将这个数使用来填补<code>k</code>。</p><h3 id="代码-2"><a href="#代码-2" class="headerlink" title="代码"></a>代码</h3><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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> a[<span class="number">100003</span>], vis[<span class="number">100003</span>];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> t;</span><br><span class="line">    <span class="built_in">cin</span>&gt;&gt;t;</span><br><span class="line">    <span class="keyword">while</span> (t--) &#123;</span><br><span class="line">        <span class="keyword">int</span> n;</span><br><span class="line">        <span class="built_in">cin</span>&gt;&gt;n;</span><br><span class="line">        <span class="built_in">memset</span>(vis, <span class="number">0</span>, <span class="keyword">sizeof</span>(vis));</span><br><span class="line">        <span class="built_in">priority_queue</span>&lt;<span class="keyword">int</span>, <span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;, greater&lt;<span class="keyword">int</span>&gt; &gt; que;</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++) &#123;</span><br><span class="line">            <span class="built_in">cin</span>&gt;&gt;a[i];</span><br><span class="line">            <span class="keyword">if</span> (a[i] &lt;= n &amp;&amp; a[i] &gt;= <span class="number">1</span>) &#123;</span><br><span class="line">                <span class="keyword">if</span> (++vis[a[i]] &gt; <span class="number">1</span>) &#123;</span><br><span class="line">                    que.push(a[i]);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">else</span> &#123;</span><br><span class="line">                que.push(a[i]);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</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">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">if</span> (vis[i]) &#123;</span><br><span class="line">                <span class="keyword">continue</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (que.top() &lt;= <span class="number">2</span> * i) &#123;</span><br><span class="line">                ans = <span class="number">-1</span>;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            &#125;</span><br><span class="line">            que.pop();</span><br><span class="line">            ++ans;</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">    &#125;</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;p&gt;&amp;emsp;&amp;emsp;好久没打cf了，因为疫情困宿舍没事干，老年选手出来活动下筋骨。只写了ABC，困了就睡了。也懒得复盘补题了。&lt;/p&gt;</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="Codeforces" scheme="http://blog.aquabet.xyz/tags/Codeforces/"/>
    
  </entry>
  
  <entry>
    <title>完整的个人RSS使用分享</title>
    <link href="http://blog.aquabet.xyz/RSS/"/>
    <id>http://blog.aquabet.xyz/RSS/</id>
    <published>2021-12-06T16:00:00.000Z</published>
    <updated>2022-08-25T20:12:59.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前文回顾"><a href="#前文回顾" class="headerlink" title="前文回顾"></a>前文回顾</h2><p>&emsp;&emsp;<a href="https://blog.aquabet.xyz/%E5%B7%B2%E5%BD%92%E6%A1%A3/%E9%80%83%E7%A6%BB%E7%9F%A5%E4%B9%8E%E8%AE%A1%E5%88%92">逃离知乎计划</a></p><h2 id="本次目标"><a href="#本次目标" class="headerlink" title="本次目标"></a>本次目标</h2><p>&emsp;&emsp;首先是搭建一个 <a href="https://github.com/DIYgod/RSSHub"><strong>RSSHub</strong></a> 的个人服务器。虽然开发者提供了服务器给大家使用，仍有下列问题：</p><ol><li>偶尔需要翻墙才能连上。</li><li>个人的关注还比较多，老白嫖人家服务器不太好。</li><li>官方Demo有比较慢，同步不了的情况。</li></ol><p>&emsp;&emsp;故最好还是自己搭个RSS服务器。</p><p>&emsp;&emsp;然后是个人的RSS同步服务器 <a href="https://github.com/HenryQW/Awesome-TTRSS"><strong>TTRSS</strong></a>。我需要将哪些信息看过、哪些没看过保持同步。这样电脑看过的信息，就可以在手机上被标记为已读。</p><h2 id="搭建RSSHub服务器"><a href="#搭建RSSHub服务器" class="headerlink" title="搭建RSSHub服务器"></a>搭建RSSHub服务器</h2><p>&emsp;&emsp;还没干，继续白嫖中。:()</p><h2 id="搭建TTRSS服务器"><a href="#搭建TTRSS服务器" class="headerlink" title="搭建TTRSS服务器"></a>搭建TTRSS服务器</h2><p>&emsp;&emsp;参照 <a href="http://ttrss.henry.wang/zh/">Awesome TTRSS</a> 的文档，很简单就能部署在自己的VPS的docker里。官方文档很详细，过程不赘述，有问题可以找我。</p><h2 id="客户端使用"><a href="#客户端使用" class="headerlink" title="客户端使用"></a>客户端使用</h2><p>&emsp;&emsp;在Android平台，我目前使用的是 <a href="https://www.coolapk.com/apk/me.wizos.loread">知微</a>，在 Tiny Tiny RSS 的偏好设置中，安装插件<code>fever</code>，打开 <code>允许外部客户端通过 API 来访问该账户</code>，然后直接用你的TTRSS<code>服务器域名/plugins/fever/</code>和账号密码登录就行。<br>&emsp;&emsp;在iOS 和 macOS 平台可以使用Reeder，至少我很喜欢它在macOS的界面设计。<br>&emsp;&emsp;Windows和Linux平台，可以使用<a href="https://github.com/yang991178/fluent-reader">Fluent Reader</a>，当然也可以直接使用TTRSS的网页端。<br>&emsp;&emsp;kindle本来想直接文章推送的，后来感觉推送太多kindle首页太乱，在网页还搭了个阅读器 <a href="https://github.com/xizeyoupan/kinss">xizeyoupan/kinss</a>。注意下kindle的内置浏览器好像https支持有问题，页面别开<code>强制https</code>即可。</p>]]></content>
    
    
    <summary type="html">辣鸡软件都可以从我手机滚出去了！</summary>
    
    
    
    <category term="Diary" scheme="http://blog.aquabet.xyz/categories/Diary/"/>
    
    
  </entry>
  
  <entry>
    <title>力扣杯2021秋团队赛解题报告</title>
    <link href="http://blog.aquabet.xyz/LCCUP21FT/"/>
    <id>http://blog.aquabet.xyz/LCCUP21FT/</id>
    <published>2021-09-24T16:00:00.000Z</published>
    <updated>2021-09-25T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<!-- more --><h2 id="先放题目"><a href="#先放题目" class="headerlink" title="先放题目"></a>先放题目</h2><p>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/sZ59z6/" target="_blank" rel="noopener noreferrer">LCP 44. 开幕式焰火</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/kplEvH/" target="_blank" rel="noopener noreferrer">LCP 45. 自行车炫技赛场</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/05ZEDJ/" target="_blank" rel="noopener noreferrer">LCP 46. 志愿者调配</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/oPs9Bm/" target="_blank" rel="noopener noreferrer">LCP 47. 入场安检</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/fsa7oZ/" target="_blank" rel="noopener noreferrer">LCP 48. 无限棋局</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/K8GULz/" target="_blank" rel="noopener noreferrer">LCP 49. 环形闯关游戏</a></p><h2 id="A题"><a href="#A题" class="headerlink" title="A题"></a>A题</h2><p>&emsp;&emsp;签到，二叉树的遍历 + map</p><h2 id="B题"><a href="#B题" class="headerlink" title="B题"></a>B题</h2><p>&emsp;&emsp;队友做的，记忆化搜索？</p><h2 id="C题"><a href="#C题" class="headerlink" title="C题"></a>C题</h2><p>&emsp;&emsp;以最后一天的情况建立一个一元一次方程，递推回到第0天，解方程。<br>&emsp;&emsp;我在这题遇到一个大坑：<strong>Leetcode中文版C++不支持对负数的左移<code>&lt;&lt;</code>位运算</strong>，会RE，我以为是哪里爆<code>int</code>了，检查了半天QAQ。</p><h2 id="D题"><a href="#D题" class="headerlink" title="D题"></a>D题</h2><p>&emsp;&emsp;队友说是01背包。</p><h2 id="E题"><a href="#E题" class="headerlink" title="E题"></a>E题</h2><p>&emsp;&emsp;语文题，理解题意后一个（大？）模拟。</p><h2 id="F题"><a href="#F题" class="headerlink" title="F题"></a>F题</h2><p>&emsp;&emsp;惯例:(</p><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><p>&emsp;&emsp;<a href="https://github.com/Aquabet/leetcode" target="_blank" rel="noopener noreferrer">详见我的github仓库</a></p>]]></content>
    
    
    <summary type="html">解题报告</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="LeetCode" scheme="http://blog.aquabet.xyz/tags/LeetCode/"/>
    
  </entry>
  
  <entry>
    <title>力扣杯2021秋个人赛解题报告</title>
    <link href="http://blog.aquabet.xyz/LCCUP21FP/"/>
    <id>http://blog.aquabet.xyz/LCCUP21FP/</id>
    <published>2021-09-10T16:00:00.000Z</published>
    <updated>2021-09-14T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<!-- more --><h2 id="先放题目"><a href="#先放题目" class="headerlink" title="先放题目"></a>先放题目</h2><p>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/0jQkd0/" target="_blank" rel="noopener noreferrer">LCP 39. 无人机方阵</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/uOAnQW/" target="_blank" rel="noopener noreferrer">LCP 40. 心算挑战</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/fHi6rV/" target="_blank" rel="noopener noreferrer">LCP 41. 黑白翻转棋</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/vFjcfV/" target="_blank" rel="noopener noreferrer">LCP 42. 玩具套圈</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/Y1VbOX/" target="_blank" rel="noopener noreferrer">LCP 43. 十字路口的交通</a></p><h2 id="A题B题"><a href="#A题B题" class="headerlink" title="A题B题"></a>A题B题</h2><p>&emsp;&emsp;俩签到题<br>&emsp;&emsp;A题：两组哈希存下每种颜色的个数，然后 <code>ans += map[0][i]-map[1][i]</code> ,  <code>return ans/2</code> 。<br>&emsp;&emsp;B题：贪心 从大到小排序，取前cnt个的和sum，并记录在前cnt个中最小的奇数oddMin和最小的偶数evenMin。然后在<strong>剩下的数</strong>里面找最大的奇数oddMax和最大的偶数evenMax。（注意：这里的oddMin，evenMin要大于等于oddMax，evenMax）如果sum为偶数， <code>return sum</code> 。如果sum是奇数， <code>return max(sum-oddMin+evenMax, sum-evenMin+oddMax)</code> 。</p><h2 id="C题"><a href="#C题" class="headerlink" title="C题"></a>C题</h2><p>&emsp;&emsp;模拟。首先找到图上所有的白点，然后对白点进行搜索。搜索包含三个方向，横着，竖着，斜着。对目标点三个方向分别向前，向后遍历。遇到黑点、空格或者边界就停下来。如果两边截止点都是黑就 <code>ans += 中间的棋数</code> 。如果有一个黑一个空就 <code>putChess = max(putChess, 中间的棋数)</code> （记得记录每颗白棋在三个方向是否遍历过，如果已经遍历过就跳过，可以剪枝）。遍历完之后 <code>ans += putChess</code>。最后还有一个检查<code>while(上一轮检查有棋能翻转)&#123;检查所有白棋能不能被翻，能翻就翻了并且ans += num&#125;</code>。</p><h2 id="D题"><a href="#D题" class="headerlink" title="D题"></a>D题</h2><p>&emsp;&emsp;<del>最开始以为是个计算几何， $O(n^2)$ T了两次优化不过</del><br>&emsp;&emsp;后来想起这个里 <a href="https://www.luogu.com.cn/problem/solution/P2249" target="_blank" rel="noopener noreferrer">P2249 【深基13.例1】查找 题解</a> 用户<code>Graphcity</code>的胡扯莫队。于是我按照这个思路，过了这题，具体如下：<br>&emsp;&emsp;首先对所有圆和玩具按x坐标进行排序，x坐标相同的按y排序。然后开始查询，对每一个圈适配玩具，并将该圆圈的圆心减半径$X_i-r$之后的第一个玩具记为nowMinX，如果下一个圆圈的$X_{i+1}$与$X$不等，此时搜索直接从nowMinX开始，对玩具的Y坐标同样进行类似处理，当$circles_i$和$circles_{i+1}$的$X$坐标相同时，就可以从nowMinY开始。</p><h2 id="E题"><a href="#E题" class="headerlink" title="E题"></a>E题</h2><p>&emsp;&emsp;惯例不做</p><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><p>&emsp;&emsp;<a href="https://github.com/Aquabet/leetcode" target="_blank" rel="noopener noreferrer">详见我的github仓库</a></p>]]></content>
    
    
    <summary type="html">解题报告</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="LeetCode" scheme="http://blog.aquabet.xyz/tags/LeetCode/"/>
    
  </entry>
  
  <entry>
    <title>比赛用模板</title>
    <link href="http://blog.aquabet.xyz/index/"/>
    <id>http://blog.aquabet.xyz/index/</id>
    <published>2021-09-08T16:00:00.000Z</published>
    <updated>2021-09-08T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="Leetcode"><a href="#Leetcode" class="headerlink" title="Leetcode"></a>Leetcode</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LOCAL</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> PB push_back</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> PF push_front</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="keyword">long</span> ull;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">TreeNode</span> &#123;</span></span><br><span class="line">    <span class="keyword">int</span> val;</span><br><span class="line">    TreeNode *left;</span><br><span class="line">    TreeNode *right;</span><br><span class="line">    TreeNode(<span class="keyword">int</span> x) : val(x), left(<span class="literal">NULL</span>), right(<span class="literal">NULL</span>) &#123;&#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function">ll <span class="title">gcd</span><span class="params">(ll a, ll b)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> b ? gcd(b, a%b) : a;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">ll <span class="title">exgcd</span><span class="params">(ll l,ll r,ll &amp;x,ll &amp;y)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(r == <span class="number">0</span>) &#123;</span><br><span class="line">        x = <span class="number">1</span>;</span><br><span class="line">        y = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">return</span> l;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        ll d = exgcd(r, l%r, y, x);</span><br><span class="line">        y -= l/r*x;</span><br><span class="line">        <span class="keyword">return</span> d;</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">ll <span class="title">MOD</span><span class="params">(ll a, ll m)</span> </span>&#123;</span><br><span class="line">    a %= m;</span><br><span class="line">    <span class="keyword">if</span>(a &lt; <span class="number">0</span>)a += m;</span><br><span class="line">    <span class="keyword">return</span> a;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//乘法逆元</span></span><br><span class="line"><span class="function">ll <span class="title">inverse</span><span class="params">(ll a, ll m)</span> </span>&#123;</span><br><span class="line">    a = MOD(a, m);</span><br><span class="line">    <span class="keyword">if</span>(a &lt;= <span class="number">1</span>)<span class="keyword">return</span> a;</span><br><span class="line">    <span class="keyword">return</span> MOD((<span class="number">1</span> - inverse(m, a) * m) / a, m);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//快速幂</span></span><br><span class="line"><span class="function">ll <span class="title">kasumi</span><span class="params">(ll a, ll b, ll mod)</span> </span>&#123;</span><br><span class="line">    a %= mod;</span><br><span class="line">    <span class="keyword">if</span>(b &lt; <span class="number">0</span>)a = inverse(a, mod), b = -b;</span><br><span class="line">    ll ans = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">while</span>(b) &#123;</span><br><span class="line">        <span class="keyword">if</span>(b &amp; <span class="number">1</span>)ans = ans * a % mod;</span><br><span class="line">        a = a * a % mod;</span><br><span class="line">        b /= <span class="number">2</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans % mod;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//二叉树的序列化</span></span><br><span class="line"><span class="function"><span class="built_in">string</span> <span class="title">serialize</span><span class="params">(TreeNode* root)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (!root) &#123;</span><br><span class="line">            <span class="keyword">return</span> <span class="string">&quot;X&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">auto</span> left = <span class="string">&quot;(&quot;</span> + serialize(root-&gt;left) + <span class="string">&quot;)&quot;</span>;</span><br><span class="line">        <span class="keyword">auto</span> right = <span class="string">&quot;(&quot;</span> + serialize(root-&gt;right) + <span class="string">&quot;)&quot;</span>;</span><br><span class="line">        <span class="keyword">return</span> left + to_string(root-&gt;val) + right;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> TreeNode* <span class="title">parseSubtree</span><span class="params">(<span class="keyword">const</span> <span class="built_in">string</span> &amp;data, <span class="keyword">int</span> &amp;ptr)</span> </span>&#123;</span><br><span class="line">    ++ptr; <span class="comment">// 跳过左括号</span></span><br><span class="line">    <span class="keyword">auto</span> subtree = parse(data, ptr);</span><br><span class="line">    ++ptr; <span class="comment">// 跳过右括号</span></span><br><span class="line">    <span class="keyword">return</span> subtree;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">parseInt</span><span class="params">(<span class="keyword">const</span> <span class="built_in">string</span> &amp;data, <span class="keyword">int</span> &amp;ptr)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> x = <span class="number">0</span>, sgn = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">if</span> (!<span class="built_in">isdigit</span>(data[ptr])) &#123;</span><br><span class="line">        sgn = <span class="number">-1</span>;</span><br><span class="line">        ++ptr;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> (<span class="built_in">isdigit</span>(data[ptr])) &#123;</span><br><span class="line">        x = x * <span class="number">10</span> + data[ptr++] - <span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> x * sgn;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">TreeNode* <span class="title">parse</span><span class="params">(<span class="keyword">const</span> <span class="built_in">string</span> &amp;data, <span class="keyword">int</span> &amp;ptr)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (data[ptr] == <span class="string">&#x27;X&#x27;</span>) &#123;</span><br><span class="line">        ++ptr;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">nullptr</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">auto</span> cur = <span class="keyword">new</span> TreeNode(<span class="number">0</span>);</span><br><span class="line">    cur-&gt;left = parseSubtree(data, ptr);</span><br><span class="line">    cur-&gt;val = parseInt(data, ptr);</span><br><span class="line">    cur-&gt;right = parseSubtree(data, ptr);</span><br><span class="line">    <span class="keyword">return</span> cur;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//二叉树的反序列化</span></span><br><span class="line"><span class="function">TreeNode* <span class="title">deserialize</span><span class="params">(<span class="built_in">string</span> data)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> ptr = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">return</span> parse(data, ptr);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> LOCAL</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>&#123;</span><br><span class="line">    freopen(<span class="string">&quot;testdata.in&quot;</span>, <span class="string">&quot;r&quot;</span>, <span class="built_in">stdin</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br></pre></td></tr></table></figure><h2 id="Codeforces"><a href="#Codeforces" class="headerlink" title="Codeforces"></a>Codeforces</h2><figure class="highlight cpp"><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;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> PB push_back</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> PF push_front</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">long</span> <span class="keyword">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> <span class="keyword">unsigned</span> <span class="keyword">long</span> <span class="keyword">long</span> ull;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">read</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">char</span> ch = getchar(); <span class="keyword">int</span> x = <span class="number">0</span>, f = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>) &#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>)f=<span class="number">-1</span>;ch=getchar();&#125;</span><br><span class="line">    <span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) &#123;x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>;ch=getchar();&#125;</span><br><span class="line">    <span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">ll <span class="title">gcd</span><span class="params">(ll a, ll b)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">return</span> b ? gcd(b, a%b) : a;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">ll <span class="title">exgcd</span><span class="params">(ll l,ll r,ll &amp;x,ll &amp;y)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(r == <span class="number">0</span>) &#123;</span><br><span class="line">        x = <span class="number">1</span>;</span><br><span class="line">        y = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">return</span> l;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        ll d = exgcd(r, l%r, y, x);</span><br><span class="line">        y -= l/r*x;</span><br><span class="line">        <span class="keyword">return</span> d;</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">ll <span class="title">MOD</span><span class="params">(ll a, ll m)</span> </span>&#123;</span><br><span class="line">    a %= m;</span><br><span class="line">    <span class="keyword">if</span>(a &lt; <span class="number">0</span>)a += m;</span><br><span class="line">    <span class="keyword">return</span> a;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//乘法逆元</span></span><br><span class="line"><span class="function">ll <span class="title">inverse</span><span class="params">(ll a, ll m)</span> </span>&#123;</span><br><span class="line">    a = MOD(a, m);</span><br><span class="line">    <span class="keyword">if</span>(a &lt;= <span class="number">1</span>)<span class="keyword">return</span> a;</span><br><span class="line">    <span class="keyword">return</span> MOD((<span class="number">1</span> - inverse(m, a) * m) / a, m);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//快速幂</span></span><br><span class="line"><span class="function">ll <span class="title">kasumi</span><span class="params">(ll a, ll b, ll mod)</span> </span>&#123;</span><br><span class="line">    a %= mod;</span><br><span class="line">    <span class="keyword">if</span>(b &lt; <span class="number">0</span>)a = inverse(a, mod), b = -b;</span><br><span class="line">    ll ans = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">while</span>(b) &#123;</span><br><span class="line">        <span class="keyword">if</span>(b &amp; <span class="number">1</span>)ans = ans * a % mod;</span><br><span class="line">        a = a * a % mod;</span><br><span class="line">        b /= <span class="number">2</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans % mod;</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">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="comment">//</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>&#123;</span><br><span class="line">    solve();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">比赛用模板</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="Codeforces" scheme="http://blog.aquabet.xyz/tags/Codeforces/"/>
    
    <category term="LeetCode" scheme="http://blog.aquabet.xyz/tags/LeetCode/"/>
    
  </entry>
  
  <entry>
    <title>Leetcode第255场周赛 解题报告</title>
    <link href="http://blog.aquabet.xyz/Leetcode_Contest_255/"/>
    <id>http://blog.aquabet.xyz/Leetcode_Contest_255/</id>
    <published>2021-08-21T16:00:00.000Z</published>
    <updated>2022-08-25T20:12:59.000Z</updated>
    
    <content type="html"><![CDATA[<!-- more --><h2 id="先放题目"><a href="#先放题目" class="headerlink" title="先放题目"></a>先放题目</h2><p>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/find-greatest-common-divisor-of-array/" target="_blank" rel="noopener noreferrer">1979. 找出数组的最大公约数</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/find-unique-binary-string/" target="_blank" rel="noopener noreferrer">1980. 找出不同的二进制字符串</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/minimize-the-difference-between-target-and-chosen-elements/" target="_blank" rel="noopener noreferrer">1981. 最小化目标值与所选元素的差</a><br>&emsp;&emsp;<a href="https://leetcode-cn.com/problems/find-array-given-subset-sums/" target="_blank" rel="noopener noreferrer">1982. 从子集的和还原数组</a></p><h2 id="A题B题"><a href="#A题B题" class="headerlink" title="A题B题"></a>A题B题</h2><p>&emsp;&emsp;俩签到题<br>&emsp;&emsp;A题：排序之后求个gcd<br>&emsp;&emsp;B题：bitset + next_permutation + to_string 循环nums.find() 找不到的就return</p><h2 id="C题"><a href="#C题" class="headerlink" title="C题"></a>C题</h2><p>&emsp;&emsp;本题的一眼解有点像 <a href="https://leetcode-cn.com/problems/3sum-closest/" target="_blank" rel="noopener noreferrer">16. 最接近的三数之和</a> 的改编。但仔细思考之后发现，如果使用双指针，在70*70的矩阵下面，时间复杂度是$O(n^{68})$。<br><br>&emsp;&emsp;接着便想到到了之前学过的背包九讲中有一种分组背包问题。</p><blockquote><p>有N件物品和一个容量为V的背包。第i件物品的费用是c[i]，价值是w[i]。<br>这些物品被划分为若干组，每组中的物品互相冲突，最多选一件。<br>K求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量，且价值总和最大。</p></blockquote><p>&emsp;&emsp;于是DP直接A掉。</p><h2 id="D题"><a href="#D题" class="headerlink" title="D题"></a>D题</h2><p>&emsp;&emsp;我太菜了，不会:(</p><h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><p>&emsp;&emsp;<a href="https://github.com/Aquabet/leetcode" target="_blank" rel="noopener noreferrer">详见我的github仓库</a></p>]]></content>
    
    
    <summary type="html">解题报告</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="LeetCode" scheme="http://blog.aquabet.xyz/tags/LeetCode/"/>
    
  </entry>
  
  <entry>
    <title>数位dp</title>
    <link href="http://blog.aquabet.xyz/Digital_DP/"/>
    <id>http://blog.aquabet.xyz/Digital_DP/</id>
    <published>2021-08-09T16:00:00.000Z</published>
    <updated>2021-11-09T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><blockquote><p>&emsp;&emsp;数位dp就是套模板 ——lwz<sup><a href="#link0">[0]</a></sup><br></p></blockquote><p>&emsp;&emsp;本文将通过对模板本身进行分析，以及通过一些例题来了解如何使用模板来解决问题。<br>&emsp;&emsp;既然是模板，首先当然要清楚数位dp可以用来解决什么样的问题。总结来说，数位dp可以用于解决在给定区间 $[A,B]$ 内，符合条件 $f(i)$ 的数 $i$ 的个数。条件 $f(i)$ 一般与数的大小无关，而与数的组成有关。如同其名字一样，数位dp便是按照数位来进行dp状态的分析和转移。数位dp解决的问题很多时候看起来很简单，甚至直接的暴力方法都仅有$O(n)$的时间复杂度。但是当这些问题的规模变大，即当 $n$ 在 $10^{19}$ 的级别下，$O(n)$的时间复杂度就完全无法应对，而数位dp是按位dp，数的大小对复杂度的影响很小，很多情况下能够达到$O(log(n))$级别，用来解决这样的问题再合适不过了。<br><br>&emsp;&emsp;从起点向下搜索，到最底层得到方案数，一层一层向上返回答案并累加，最后从搜索起点得到最终答案。这便是数位dp解决问题的过程。而对于 $[l,r]$ 区间问题，我们一般把他转化为两次数位dp,即找 $[0,r]$ 和 $[0,l-1]$ 两段，再将结果相减就得到了我们需要的 $[l,r]$。<br><br>&emsp;&emsp;如同大多数dp一般，数位dp有两种实现方式，递推和记忆化搜索。我个人更喜欢记忆化搜索，同时相比递推方式，记忆化搜索更适合作为模板，因此接下来的数位dp的模板以记忆化搜索的形式呈现。</p><h2 id="题目1"><a href="#题目1" class="headerlink" title="题目1"></a>题目1</h2><p>&emsp;&emsp;首先我们从这道题开始了解数位dp：<a href="https://leetcode-cn.com/problems/number-of-digit-one/">leetcode 233题</a></p><h3 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h3><blockquote><p>&emsp;&emsp;给定一个整数 n，计算所有小于等于 n 的非负整数中数字 1 出现的个数。</p><blockquote><p>示例 1：<br>&emsp;&emsp;输入：n = 13<br>&emsp;&emsp;输出：6<br>示例 2：<br>&emsp;&emsp;输入：n = 0<br>&emsp;&emsp;输出：0<br>提示：<br>&emsp;&emsp;$0  &lt;=  n  &lt;=  10^9$</p></blockquote></blockquote><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><p>&emsp;&emsp;这道题在leetcode上的标签是<font color="red">困难</font>。$10^9$的数据范围，使得直接的暴力算法无法达到要求。从这道条件比较简单的题开始，对模板涉及到的内容进行分析。先附上AC代码，并将其作为基础模板：</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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="keyword">int</span> dp[<span class="number">15</span>][<span class="number">15</span>];</span><br><span class="line"><span class="keyword">int</span> num[<span class="number">15</span>];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> pos, <span class="keyword">int</span> sum, <span class="keyword">int</span> limit)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(pos == <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> sum;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(limit == <span class="number">0</span> &amp;&amp; dp[pos][sum] != <span class="number">-1</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> dp[pos][sum];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">int</span> up = <span class="number">9</span>;</span><br><span class="line">    <span class="keyword">if</span>(limit == <span class="number">1</span>) &#123;</span><br><span class="line">        up = num[pos];</span><br><span class="line">    &#125;</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">0</span>; i &lt;= up; i++) &#123;</span><br><span class="line">        ans = ans + dfs(pos<span class="number">-1</span>, sum+(i == <span class="number">1</span>), i == up &amp;&amp; limit);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(limit == <span class="number">0</span>) &#123;</span><br><span class="line">        dp[pos][sum] = ans;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">countDigitOne</span><span class="params">(<span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> pos = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span>(n != <span class="number">0</span>) &#123;</span><br><span class="line">        pos++;</span><br><span class="line">        num[pos] = n % <span class="number">10</span>;</span><br><span class="line">        n = n / <span class="number">10</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">memset</span>(dp, <span class="number">-1</span>, <span class="keyword">sizeof</span>(dp));</span><br><span class="line">    <span class="keyword">return</span> dfs(pos, <span class="number">0</span>, <span class="number">1</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="comment">// 执行用时: 0 ms</span></span><br><span class="line"><span class="comment">// 内存消耗: 5.9 MB</span></span><br></pre></td></tr></table></figure><h3 id="分析"><a href="#分析" class="headerlink" title="分析"></a>分析</h3><p>&emsp;&emsp;从核心的dfs部分开始看。dfs部分 <code>dfs(int pos,int sum,int limit)</code> 涉及到三个参数，<code>pos</code>，<code>sum</code>以及<code>limit</code>。其中<code>pos</code>表示当前的数位，我们从最高位开始进行dp，<code>sum</code>表示当前状态数码1的个数，是对应这道题目要求而增添的变量，<code>limit</code>表示当前状态是否达到最高位限制。这三个参数中，需要进行解释的主要是<code>limit</code>参数。</p><h4 id="最高位标记limit"><a href="#最高位标记limit" class="headerlink" title="最高位标记limit"></a>最高位标记<code>limit</code></h4><p>&emsp;&emsp;在搜索的数位的过程中，搜索范围可能发生变化。</p><blockquote><p>举个例子：我们在搜索 <code>[0,555]</code> 的数时，显然最高位搜索范围是 <code>0 ~ 5</code> ，而后面的位数的取值范围会根据上一位发生变化：</p><ul><li>当最高位是 <code>1 ~ 4 </code>时，第二位取值为 <code>[0,9]</code>；</li><li>当最高位是 <code>5</code> 时，第二位取值为 <code>[0,5]</code> （再往上取就超出右端点范围了）</li></ul></blockquote><p>&emsp;&emsp;为了分清这两种情况，我们引入了 <code>limit</code> 标记：</p><ul><li>若当前位 <code>limit = 1</code> 而且已经取到了能取到的最高位时，下一位 <code>limit = 1</code> ；</li><li>若当前位 <code>limit = 1</code> 但是没有取到能取到的最高位时，下一位 <code>limit = 0</code> ；</li><li>若当前位 <code>limit = 0</code> 时，下一位 <code>limit = 0</code> 。</li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> up = <span class="number">9</span>;</span><br><span class="line"><span class="keyword">if</span>(limit == <span class="number">1</span>) &#123;</span><br><span class="line">    up = num[pos];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> ans = <span class="number">0</span>;</span><br></pre></td></tr></table></figure><p>&emsp;&emsp;这一部分中的<code>up</code>便是表示当前能取到的最高位数，下一位<code>limit</code>的状态自然是<code>i == up &amp;&amp; limit</code>。<br>&emsp;&emsp;接下来还有一个需要分析的地方：</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span>(limit == <span class="number">0</span> &amp;&amp; dp[pos][sum] != <span class="number">-1</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> dp[pos][sum];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(limit == <span class="number">0</span>) &#123;</span><br><span class="line">    dp[pos][sum] = ans;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&emsp;&emsp;也就是dp值的保存和取用问题。</p><blockquote><p>举个例子：<br>假设存在如下约束：数位上不能出现连续的两个1(11、112、211都是不合法的)<br>假设就是$[1,210]$这个区间的个数<br>状态<code>dp[pos][pre]</code>:当前枚举到<code>pos</code>位，前面一位枚举的是<code>pre</code>(更加前面的位已经合法了)，的个数(假设<code>pos</code>从0开始)。</p></blockquote><p>&emsp;&emsp;先看错误的方法计数，就是不判<code>limit</code>直接dfs。</p><p>&emsp;&emsp;那么假设我们第一次枚举了百位是0，显然后面的枚举<code>limit = false</code>，也就是数位上0到9的枚举，然后当我十位枚举了1，此时考虑<code>dp[0][1]</code>,就是枚举到个位，前一位是1的个数，显然<code>dp[0][1]=9</code>;(个位只有是1的时候是不满足的)，这个状态记录下来，继续dfs，一直到百位枚举了2，十位枚举了1，显然此时递归到了<code>pos=0</code>,<code>pre=1</code>的层，而<code>dp[0][1]</code>的状态已经有了即<code>dp[pos][pre] != -1</code>；此时程序直接<code>return dp[0][1]</code>了，然而显然是错的，因为此时是有<code>limit</code>的个位只能枚举0，根本没有9个数，状态之间存在冲突。(也可以从上面第一题从数学的角度分析一下，我们记录的是0~9这样的重复状态，而<code>limit == 1</code>实际上是属于特殊状态)因此我们可以得到一个结论：当 <code>limit = 1</code> 时，不能记录和取用dp值。<br>&emsp;&emsp;类似上述的分析过程，我们也可以得出：当 <code>lead = 1</code> 时，也不能记录和取用dp值。(<code>lead</code>用于表示前导零，在后面会讲到，提到时可以翻回来看看)<br>&emsp;&emsp;当然也没有这么绝对，一起都是以实际题目为准。<br>&emsp;&emsp;由此我们发现，模板中需要根据实际情况修改的部分就是下面这一部分：</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i &lt;= up;i++) &#123;</span><br><span class="line">    ans = ans + dfs(pos<span class="number">-1</span>, sum+(i == <span class="number">1</span>), i == up &amp;&amp; limit);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&emsp;&emsp;根据实际题目要求，修改其中的约束条件，就可以利用模板来解决问题了。<br>&emsp;&emsp;接下来再看看另一个重要参数，也就是前面提到的lead。</p><h4 id="前导0标记lead"><a href="#前导0标记lead" class="headerlink" title="前导0标记lead"></a>前导0标记<code>lead</code></h4><p>&emsp;&emsp;举个例子：假如我们要从 $[0,1000]$ 找任意相邻两数相等的数。<br><br>&emsp;&emsp;显然 <code>111</code>,<code>222</code>,<code>888</code> 等等是符合题意的数<br>&emsp;&emsp;但是我们发现右端点 <code>1000</code> 是四位数<br>&emsp;&emsp;因此我们搜索的起点是 <code>0000</code> ，而三位数的记录都是 <code>0111</code>,<code>0222</code>,<code>0888</code> 等等<br>&emsp;&emsp;而这种情况下如果我们直接找相邻位相等则 <code>0000</code> 符合题意而 <code>0111</code>,<code>0222</code>,<code>0888</code> 都不符合题意了<br>&emsp;&emsp;所以我们要加一个前导0标记</p><ul><li>如果当前位 <code>lead = 1</code> 而且当前位也是0，那么当前位也是前导0， <code>pos + 1</code> 继续搜；</li><li>如果当前位 <code>lead = 1</code> 但当前位不是0，则本位作为当前数的最高位， <code>pos + 1</code> 继续搜；（注意这次根据题意其他参数可能发生变化）</li></ul><p>&emsp;&emsp;当然前导 0 有时候是不需要判断的，上述的例子是一个有关数字结构上的性质，0会影响数字的结构，所以必须判断前导0；而如果我们研究的是数字的组成（例如这个数字有多少个 1 之类的问题），0并不影响我们的判断，这样就不需要前导0标记了。</p><h2 id="题目2"><a href="#题目2" class="headerlink" title="题目2"></a>题目2</h2><p>接下来看一个前导零的例子：<a href="https://leetcode-cn.com/problems/numbers-at-most-n-given-digit-set/">leetcode 902</a></p><h3 id="题目描述-1"><a href="#题目描述-1" class="headerlink" title="题目描述"></a>题目描述</h3><blockquote><p>&emsp;&emsp;我们有一组排序的数字 D，它是  {‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’} 的非空子集。（请注意，’0’ 不包括在内。）<br>&emsp;&emsp;现在，我们用这些数字进行组合写数字，想用多少次就用多少次。例如 D = {‘1’, ‘3’, ‘5’}，我们可以写出像 ‘13’,  ‘551’,  ‘1351315’ 这样的数字。<br>&emsp;&emsp;返回可以用 D 中的数字写出的小于或等于 N 的正整数的数目。</p><blockquote><p>示例 1：<br>&emsp;&emsp;输入：D = [“1”,”3”,”5”,”7”], N = 100<br>&emsp;&emsp;输出：20<br>&emsp;&emsp;解释：<br>&emsp;&emsp;可写出的 20 个数字是：<br>&emsp;&emsp;1, 3, 5, 7, 11, 13, 15, 17, 31, 33, 35, 37, 51, 53, 55, 57, 71, 73, 75, 77.<br>示例 2：<br>&emsp;&emsp;输入：D = [“1”,”4”,”9”], N = 1000000000<br>&emsp;&emsp;输出：29523<br>&emsp;&emsp;解释：<br>&emsp;&emsp;我们可以写 3 个一位数字，9 个两位数字，27 个三位数字，81 个四位数字，243 个五位数字，729 个六位数字，2187 个七位数字，6561 个八位数字和 19683 个九位数字。总共，可以使用D中的数字写出 29523 个整数。<br>提示：<br>&emsp;&emsp;D 是按排序顺序的数字 ‘1’-‘9’ 的子集。$1  &lt;=  N  &lt;=  10^9$</p></blockquote></blockquote><h3 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h3><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="keyword">int</span> in[<span class="number">10</span>];</span><br><span class="line"><span class="keyword">int</span> dp[<span class="number">15</span>];</span><br><span class="line"><span class="keyword">int</span> nums[<span class="number">15</span>];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> pos,<span class="keyword">int</span> limit,<span class="keyword">int</span> lead)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(pos == <span class="number">0</span>)  <span class="keyword">return</span> !lead;</span><br><span class="line">    <span class="keyword">if</span>(limit == <span class="number">0</span> &amp;&amp; lead == <span class="number">0</span> &amp;&amp; dp[pos] != <span class="number">-1</span>)  <span class="keyword">return</span> dp[pos];</span><br><span class="line">    <span class="keyword">int</span> up = <span class="number">9</span>;</span><br><span class="line">    <span class="keyword">if</span>(limit == <span class="number">1</span>) up = nums[pos];</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">0</span>; i &lt;= up; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span>(lead == <span class="number">1</span> &amp;&amp; i == <span class="number">0</span>) &#123;</span><br><span class="line">            ans = ans + dfs(pos<span class="number">-1</span>, limit &amp;&amp; i == up, lead &amp;&amp; i == <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>(in[i] == <span class="number">1</span>) &#123;</span><br><span class="line">            ans = ans + dfs(pos<span class="number">-1</span>, limit &amp;&amp; i == up, lead &amp;&amp; i == <span class="number">0</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(limit == <span class="number">0</span> &amp;&amp; lead == <span class="number">0</span>)  dp[pos] = ans;</span><br><span class="line">    <span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">atMostNGivenDigitSet</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="built_in">string</span>&gt;&amp; digits, <span class="keyword">int</span> n)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> size = digits.size();</span><br><span class="line">    <span class="built_in">memset</span>(dp, <span class="number">-1</span>, <span class="keyword">sizeof</span>(dp));</span><br><span class="line">    <span class="built_in">memset</span>(in, <span class="number">0</span>, <span class="keyword">sizeof</span>(in));</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; size; i++) &#123;</span><br><span class="line">        in[digits[i][<span class="number">0</span>]-<span class="string">&#x27;0&#x27;</span>] = <span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">int</span> pos = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span>(n != <span class="number">0</span>) &#123;</span><br><span class="line">        pos++;</span><br><span class="line">        nums[pos] = n % <span class="number">10</span>;</span><br><span class="line">        n = n / <span class="number">10</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> dfs(pos, <span class="number">1</span>, <span class="number">1</span>);<span class="comment">//最高位默认有前导零</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h3 id="分析-1"><a href="#分析-1" class="headerlink" title="分析"></a>分析</h3><p>&emsp;&emsp;其中</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span>(lead == <span class="number">1</span> &amp;&amp; i == <span class="number">0</span>) &#123;</span><br><span class="line">    ans = ans + dfs(pos<span class="number">-1</span>, limit &amp;&amp; i == up, lead &amp;&amp; i == <span class="number">0</span>);</span><br><span class="line">&#125; <span class="keyword">else</span> <span class="keyword">if</span>(in[i] == <span class="number">1</span>) &#123;</span><br><span class="line">    ans = ans + dfs(pos<span class="number">-1</span>, limit &amp;&amp; i == up, lead &amp;&amp; i == <span class="number">0</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&emsp;&emsp;便是增加前导零后的处理逻辑的变化，至于具体的要根据实际情况来进行变化。<br>&emsp;&emsp;另外对于状态的记录，最好把所有的额外状态都进行记录，避免状态存在重复和遗漏。虽然这会增加记录数组的维数，但是一般增加的状态都是<code>0,1</code>状态，所以内存方面不会有太多的压力。</p><blockquote><p>&emsp;&emsp;数位dp的状态能记录的最好都记录上 ——lwz</p></blockquote><p>&emsp;&emsp;附上洛谷制作的搜索步骤的图：</p><p><img src="http://blog.aquabet.xyz/Digital_DP/1.png" alt="PIC"></p><p>&emsp;&emsp;接下来就可以利用模板刷题了，随着使用的次数++，熟练度也会不断++的。数位dp说难也难，说难也不难，通过大量的练习就可以熟练掌握。</p><h2 id="题目3"><a href="#题目3" class="headerlink" title="题目3"></a>题目3</h2><p>&emsp;&emsp;<a href="https://acm.hdu.edu.cn/showproblem.php?pid=3555">HDU3555</a></p><h3 id="题目描述-2"><a href="#题目描述-2" class="headerlink" title="题目描述"></a>题目描述</h3><blockquote><p>&emsp;&emsp;The counter-terrorists found a time bomb in the dust. But this time the terrorists improve on the time &gt;bomb. The number sequence of the time bomb counts from 1 to N. If the current number sequence &gt;includes the sub-sequence “49”, the power of the blast would add one point.<br>&emsp;&emsp;Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?<br>Input<br>&emsp;&emsp;The first line of input consists of an integer T (1  &lt;=  T  &lt;=  10000), indicating the number of test cases. &gt;For each test case, there will be an integer N (1  &lt;=  N  &lt;=  2^63-1) as the description.<br>&emsp;&emsp;The input terminates by end of file marker.<br>Output<br>&emsp;&emsp;For each test case, output an integer indicating the final points of the power.</p><blockquote><p>Sample Input<br>&emsp;&emsp;3<br>&emsp;&emsp;1<br>&emsp;&emsp;50<br>&emsp;&emsp;500<br>Sample Output<br>&emsp;&emsp;0<br>&emsp;&emsp;1<br>&emsp;&emsp;15<br>Hint<br>&emsp;&emsp;From 1 to 500, the numbers that include the sub-sequence “49” are “49”,”149”,”249”,”349”,”449”,”490”,”491”,”492”,”493”,”494”,”495”,”496”,”497”,”498”,”499”,so the answer is 15.</p></blockquote></blockquote><h3 id="分析-amp-amp-代码"><a href="#分析-amp-amp-代码" class="headerlink" title="分析&amp;&amp;代码"></a>分析&amp;&amp;代码</h3><p>&emsp;&emsp;因为查找的数是一个两位数，所以我们增加<code>pre</code>参数，表示当前数位的前一位，来帮助进行约束判断。AC代码如下：</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> num[<span class="number">30</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dp[<span class="number">30</span>][<span class="number">20</span>][<span class="number">2</span>];</span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">dfs</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> pos, <span class="keyword">long</span> <span class="keyword">long</span> pre, <span class="keyword">long</span> <span class="keyword">long</span> limit, <span class="keyword">long</span> <span class="keyword">long</span> check)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(pos == <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> check;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(limit == <span class="number">0</span> &amp;&amp; dp[pos][pre][check] != <span class="number">-1</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> dp[pos][pre][check]</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> up = <span class="number">9</span>;</span><br><span class="line">    <span class="keyword">if</span>(limit == <span class="number">1</span>) &#123;</span><br><span class="line">        up = num[pos];</span><br><span class="line">    &#125;</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">long</span> <span class="keyword">long</span> i = <span class="number">0</span>; i &lt;= up; i++) &#123;</span><br><span class="line">        ans = ans + dfs(pos<span class="number">-1</span>, i, i == up &amp;&amp; limit, ((i == <span class="number">9</span>) &amp;&amp; (pre == <span class="number">4</span>)) || check);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(limit == <span class="number">0</span>) &#123;</span><br><span class="line">        dp[pos][pre][check] = ans;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</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">long</span> <span class="keyword">long</span> t;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; t;</span><br><span class="line">    <span class="built_in">memset</span>(dp, <span class="number">-1</span>, <span class="keyword">sizeof</span>(dp));</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">long</span> <span class="keyword">long</span> i = <span class="number">0</span>; i &lt; t; i++) &#123;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> x;</span><br><span class="line">        <span class="built_in">cin</span>&gt;&gt;x;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> pos = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span>(x != <span class="number">0</span>) &#123;</span><br><span class="line">            pos++;</span><br><span class="line">            num[pos] = x % <span class="number">10</span>;</span><br><span class="line">            x = x / <span class="number">10</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">cout</span>&lt;&lt;dfs(pos, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>)&lt;&lt;<span class="built_in">endl</span>;</span><br><span class="line">    &#125;</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><p>&emsp;&emsp;PS：这题要爆<code>int</code>，记得开<code>long long</code>。</p><h2 id="题目4"><a href="#题目4" class="headerlink" title="题目4"></a>题目4</h2><p>最后再来道家乡の题: <a href="https://www.luogu.com.cn/problem/P4124">[CQOI2016]手机号码</a></p><h3 id="题目描述-3"><a href="#题目描述-3" class="headerlink" title="题目描述"></a>题目描述</h3><blockquote><p>&emsp;&emsp;人们选择手机号码时都希望号码好记、吉利。比如号码中含有几位相邻的相同数字、不含谐音不吉利的数字等。手机运营商在发行新号码时也会考虑这些因素，从号段中选取含有某些特征的号码单独出售。为了便于前期规划，运营商希望开发一个工具来自动统计号段中满足特征的号码数量。<br>&emsp;&emsp;工具需要检测的号码特征有两个：号码中要出现至少 3 个相邻的相同数字；号码中不能同时出现 8 和 4。号码必须同时包含两个特征才满足条件。满足条件的号码例如：13000988721、23333333333、14444101000。而不满足条件的号码例如：1015400080、10010012022。<br>&emsp;&emsp;手机号码一定是 11 位数，前不含前导的 0。工具接收两个数 L 和 R，自动统计出 [L,R] 区间内所有满足条件的号码数量。L 和 R 也是 11 位的手机号码。<br>输入格式<br>&emsp;&emsp;输入文件内容只有一行，为空格分隔的 2 个正整数 L,R。<br>输出格式<br>&emsp;&emsp;输出文件内容只有一行，为 1 个整数，表示满足条件的手机号数量。</p><blockquote><p>输入样例<br>&emsp;&emsp;12121284000 12121285550<br>输出样例<br>&emsp;&emsp;5<br>说明/提示<br>&emsp;&emsp;样例解释：满足条件的号码： 12121285000、 12121285111、 12121285222、 12121285333、 12121285550。</p><p>数据范围：$10^{10} \le L\le R &lt; 10^{11}$</p></blockquote></blockquote><h3 id="分析-amp-amp-代码-1"><a href="#分析-amp-amp-代码-1" class="headerlink" title="分析&amp;&amp;代码"></a>分析&amp;&amp;代码</h3><p>&emsp;&emsp;只需要增加<code>check8</code>，<code>check4</code>，连续段检查三个状态，同时注意前导零的处理就可以了。<del>早生几年我也能混进省队了</del><br>AC代码如下：</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><span class="line">50</span><br><span class="line">51</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;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dp[<span class="number">20</span>][<span class="number">20</span>][<span class="number">20</span>][<span class="number">2</span>][<span class="number">2</span>][<span class="number">2</span>];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> num[<span class="number">60</span>];</span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">dfs</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> pos, <span class="keyword">long</span> <span class="keyword">long</span> pre1, <span class="keyword">long</span> <span class="keyword">long</span> pre2, <span class="keyword">long</span> <span class="keyword">long</span> limit, <span class="keyword">long</span> <span class="keyword">long</span> lead, <span class="keyword">long</span> <span class="keyword">long</span> check8, <span class="keyword">long</span> <span class="keyword">long</span> check4, <span class="keyword">long</span> <span class="keyword">long</span> checkll)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (pos == <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> checkll &amp;&amp; !(check4 == <span class="number">1</span> &amp;&amp; check8 == <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (limit == <span class="number">0</span> &amp;&amp; lead == <span class="number">0</span> &amp;&amp; dp[pos][pre1][pre2][check8][check4][checkll] != <span class="number">-1</span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> dp[pos][pre1][pre2][check8][check4][checkll];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> up = <span class="number">9</span>;</span><br><span class="line">    <span class="keyword">if</span> (limit == <span class="number">1</span>) &#123;</span><br><span class="line">        up = num[pos];</span><br><span class="line">    &#125;</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">long</span> <span class="keyword">long</span> i = <span class="number">0</span>; i &lt;= up; i++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (lead == <span class="number">1</span> &amp;&amp; i == <span class="number">0</span>)  &#123;</span><br><span class="line">            ans = ans + dfs(pos - <span class="number">1</span>, pre2, i, limit &amp;&amp; i == up, lead &amp;&amp; i == <span class="number">0</span>, check8, check4, <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> (lead == <span class="number">1</span>) &#123;</span><br><span class="line">            ans = ans + dfs(pos - <span class="number">1</span>, pre2, i, limit &amp;&amp; i == up, lead &amp;&amp; i == <span class="number">0</span>, check8 || i == <span class="number">8</span>, check4 || i == <span class="number">4</span>, <span class="number">0</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            ans = ans + dfs(pos - <span class="number">1</span>, pre2, i, limit &amp;&amp; i == up, lead &amp;&amp; i == <span class="number">0</span>, check8 || i == <span class="number">8</span>, check4 || i == <span class="number">4</span>, checkll || (i == pre2 &amp;&amp; pre2 == pre1));</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (limit == <span class="number">0</span> &amp;&amp; lead == <span class="number">0</span>) &#123;</span><br><span class="line">        dp[pos][pre1][pre2][check8][check4][checkll] = ans;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ans;</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">solve</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x)</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> pos = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (x != <span class="number">0</span>) &#123;</span><br><span class="line">        pos++;</span><br><span class="line">        num[pos] = x % <span class="number">10</span>;</span><br><span class="line">        x = x / <span class="number">10</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> dfs(pos, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>, <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>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> x, y;</span><br><span class="line">    <span class="built_in">cin</span> &gt;&gt; x &gt;&gt; y;</span><br><span class="line">    <span class="built_in">memset</span>(dp, <span class="number">-1</span>, <span class="keyword">sizeof</span>(dp));</span><br><span class="line">    <span class="built_in">cout</span> &lt;&lt; solve(y) - solve(x - <span class="number">1</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><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><p>[0] <a id="link0" href="https://www.sohu.com/a/273617542_100201031" target="_blank" rel="noopener noreferrer">洛谷日报第84期</a><br>[1] <a href="https://blog.csdn.net/jk211766/article/details/81474632">数位dp总结之从入门到模板</a></p>]]></content>
    
    
    <summary type="html">数位dp就是套模板 ——lwz</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="模板" scheme="http://blog.aquabet.xyz/tags/%E6%A8%A1%E6%9D%BF/"/>
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="LeetCode" scheme="http://blog.aquabet.xyz/tags/LeetCode/"/>
    
  </entry>
  
  <entry>
    <title>KMP算法</title>
    <link href="http://blog.aquabet.xyz/kmp/"/>
    <id>http://blog.aquabet.xyz/kmp/</id>
    <published>2021-04-27T16:00:00.000Z</published>
    <updated>2021-04-27T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<!-- more --><h2 id="字符串匹配问题"><a href="#字符串匹配问题" class="headerlink" title="字符串匹配问题"></a>字符串匹配问题</h2><p>&emsp;&emsp;字符串匹配，是指“<strong>字符串 P 是否为字符串 S 的子串？如果是，它出现在 S 的哪些位置？</strong>”的问题，其中S称为主串，P称为模式串。我们假设 S 串长度为 n , P 串长度为 m ，其中 n &gt; m。</p><h2 id="Brute-Force"><a href="#Brute-Force" class="headerlink" title="Brute-Force"></a>Brute-Force</h2><p>&emsp;&emsp;容易想到朴素暴力匹配，从前往后逐字符比较，遇到不同的字符就<code>continue</code> ； P 串结束了返回 <code>True</code> ， S 串结束而 P 串未结束返回 <code>False</code> 。具体流程如下：</p><ul><li>枚举 $i\in[0,n-m)$</li><li>将 S[i] ~ S[i+m] 与 P 作比较。如果一致，则找到了一个匹配。</li></ul><p>&emsp;&emsp;此方法被称为 Brute-Force 法，最坏的时间复杂度$O(nm)$。</p><p>例如：</p><p>&emsp;&emsp;主串：</p><p><img src="http://blog.aquabet.xyz/kmp/%E4%B8%BB%E4%B8%B21.png" alt="主串" title="主串"></p><p>&emsp;&emsp;模式串：</p><p><img src="http://blog.aquabet.xyz/kmp/%E6%A8%A1%E5%BC%8F%E4%B8%B21.png" alt="模式串" title="模式串"></p><p>&emsp;&emsp;全匹配流程如下图所示：</p><p><img src="http://blog.aquabet.xyz/kmp/%E5%8C%B9%E9%85%8D2.png" alt="继续匹配" title="继续匹配"></p><p>&emsp;&emsp;其中数字表示匹配的顺序。</p><h2 id="改进的思路"><a href="#改进的思路" class="headerlink" title="改进的思路"></a>改进的思路</h2><p>&emsp;&emsp;我们无法改变 P 串或者 S 串的复杂度，因此只能在匹配次数上进行优化。可以发现，在 Brute-Force 算法中，在最坏情况下，例如S=”aaaaaaaaaab”,P=”aaaab”时，会进行 $n-m+1$ 次位移，每次位移最多会进行 m 次匹配，因此总时间复杂度是$O((n-m+1)*(m))$，也就是$O(mn)$的。</p><p>&emsp;&emsp;回到最初，我们需要实现的任务是“字符串匹配”，而每一次失败都会给我们带来一些信息——<strong>主串的某一个子串等于模式串的某一个前缀</strong>。这个前缀便是优化的关键之处。</p><h2 id="next数组的引入"><a href="#next数组的引入" class="headerlink" title="next数组的引入"></a>next数组的引入</h2><p>&emsp;&emsp;next数组是对于模式串而言的。 P 的 next 数组定义为： next[i] 表示 P[0] ~ P[i] 这一个子串，使得 前 k 个字符 恰等于 后 k 个字符 的最大的 k 。特别地， k 不能取 i+1 （因为这个子串一共才 i+1 个字符，自己肯定与自己相等，就没有意义了）。</p><p><img src="http://blog.aquabet.xyz/kmp/Next%E6%95%B0%E7%BB%84.png" alt="next数组"></p><p>&emsp;&emsp;上面给出了一个例子。P=”abaabac”时， next[4] = 2 ，这是因为 P[0] ~ P[4] 这个子串是”abaab”，前两个字符与后两个字符相等，因此 next[4] 取 2 。而 next[6] = 0 ，是因为”abaabac”找不到前缀与后缀相同，因此只能取0。</p><p>&emsp;&emsp;如果把模式串视为一把标尺，在主串上移动，那么 Brute-Force 就是每次失配之后只右移一位；改进算法则是每次失配之后，移很多位，跳过那些不可能匹配成功的位置。但是该如何确定要移多少位呢？</p><p><img src="http://blog.aquabet.xyz/kmp/%E5%8C%B9%E9%85%8D3.png" alt="KMP"></p><p>&emsp;&emsp;如上，在 S[0] 尝试匹配，失配于 S[3] &lt;=&gt; P[3] 之后，我们直接把模式串往右移了两位，让 S[3] 对准 P[1]。 接着继续匹配，失配于 S[8] &lt;=&gt; P[6], 接下来我们把 P 往右平移了三位，把 S[8] 对准 P[3]. 此后继续匹配直到成功。</p><p>&emsp;&emsp;我们应该如何移动这把标尺？<strong>很明显，如图中箭头所示，旧的后缀要与新的前缀一致</strong>（如果不一致，那就肯定没法匹配上了）！</p><p>&emsp;&emsp;回忆next数组的性质：P[0] 到 P[i] 这一段子串中，前 next[i] 个字符与后 next[i] 个字符一模一样。既然如此，如果失配在 P[r] , 那么 P[0] ~ P[r-1] 这一段里面，前 next[r-1] 个字符恰好和后 next[r-1] 个字符相等——也就是说，我们可以拿长度为 next[r-1] 的那一段前缀，来顶替当前后缀的位置，让匹配继续下去！</p><p>&emsp;&emsp;那么，如何分析这个字符串匹配的复杂度呢？乍一看，pos值可能不停地变成next[pos-1]，代价会很高；但我们使用摊还分析，显然pos值一共顶多自增len(S)次，因此pos值减少的次数不会高于len(S)次。由此，不难分析出整个匹配算法的时间复杂度:$O(m+n)$。</p><h2 id="求next数组"><a href="#求next数组" class="headerlink" title="求next数组"></a>求next数组</h2><p>&emsp;&emsp;终于来到了我们最后一个问题——如何构建next数组。<br>&emsp;&emsp;回顾next数组的完整定义：</p><ul><li>定义 “k-前缀” 为一个字符串的前 k 个字符； “k-后缀” 为一个字符串的后 k 个字符。k 必须小于字符串长度。</li><li>next[x] 定义为： P[0] ~ P[x] 这一段字符串，使得<strong>k-前缀恰等于k-后缀</strong>的最大的k。</li></ul><p>&emsp;&emsp;这个定义中，不知不觉地就包含了一个匹配——前缀和后缀相等。接下来，我们考虑采用递推的方式求出next数组。如果next[0], next[1], … next[x-1]均已知，那么如何求出 next[x] 呢？</p><p>&emsp;&emsp;来分情况讨论。首先，已经知道了 next[x-1]（以下记为now），如果 P[x] 与 P[now] 一样，那最长相等前后缀的长度就可以扩展一位，很明显 next[x] = now + 1. 图示如下。</p><p><img src="http://blog.aquabet.xyz/kmp/next%E6%95%B0%E7%BB%841.png" alt="next数组"></p><p>&emsp;&emsp;刚刚解决了 P[x] = P[now] 的情况。那如果 P[x] 与 P[now] 不一样，又该怎么办？</p><p><img src="http://blog.aquabet.xyz/kmp/next%E6%95%B0%E7%BB%842.png" alt="next数组"></p><p>&emsp;&emsp;如图。长度为 now 的子串 A 和子串 B 是 P[0]~P[x-1] 中最长的公共前后缀。可惜 A 右边的字符和 B 右边的那个字符不相等，next[x]不能改成 now+1 了。因此，我们应该缩短这个now，把它改成小一点的值，再来试试 P[x] 是否等于 P[now].</p><p>&emsp;&emsp;now该缩小到多少呢？显然，我们不想让now缩小太多。因此我们决定，在保持“P[0]~P[x-1]的now-前缀仍然等于now-后缀”的前提下，让这个新的now尽可能大一点。 P[0]~P[x-1] 的公共前后缀，前缀一定落在串A里面、后缀一定落在串B里面。换句话讲：接下来now应该改成：使得A的k-前缀等于B的k-后缀的最大的k.</p><p>&emsp;&emsp;您应该已经注意到了一个非常强的性质——串A和串B是相同的！B的后缀等于A的后缀！因此，使得A的k-前缀等于B的k-后缀的最大的k，其实就是串A的最长公共前后缀的长度 —— next[now-1]！</p><p>把now更改为next[now-1]之后：</p><p><img src="http://blog.aquabet.xyz/kmp/next%E6%95%B0%E7%BB%843.png" alt="next数组"></p><p>&emsp;&emsp;来看上面的例子。当P[now]与P[x]不相等的时候，我们需要缩小now——把now变成next[now-1]，直到P[now]=P[x]为止。P[now]=P[x]时，就可以直接向右扩展了。</p><p>&emsp;&emsp;应用摊还分析，不难证明构建next数组的时间复杂度是$O(m)$的。至此，我们以$O(n+m)$的时间复杂度，实现了构建next数组、利用next数组进行字符串匹配。</p><h2 id="最后是代码"><a href="#最后是代码" class="headerlink" title="最后是代码"></a>最后是代码</h2><p>（未审核，谨慎复制粘贴）</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> lens, lenp;</span><br><span class="line"><span class="keyword">int</span> next1[<span class="number">1000001</span>];</span><br><span class="line"><span class="keyword">char</span> S[<span class="number">1000001</span>];</span><br><span class="line"><span class="keyword">char</span> P[<span class="number">1000001</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">get_next</span><span class="params">()</span> </span>&#123; <span class="comment">//求出next数组</span></span><br><span class="line">    <span class="keyword">int</span> t1 = <span class="number">0</span>, t2;</span><br><span class="line">    next1[<span class="number">0</span>] = t2 = <span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">while</span>(t1 &lt; lenp) &#123;</span><br><span class="line">        <span class="keyword">if</span>(t2 == <span class="number">-1</span> || P[t1] == P[t2]) &#123;</span><br><span class="line">            next1[++t1] = ++t2;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            t2 = next1[t2];</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">void</span> <span class="title">KMP</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">int</span> t1 = <span class="number">0</span>, t2 = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span>(t1 &lt; lens) &#123;</span><br><span class="line">        <span class="keyword">if</span>(t2 == <span class="number">-1</span> || S[t1] == P[t2]) &#123;</span><br><span class="line">            t1++,t2++;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            t2 = next1[t2];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span>(t2 == lenp) &#123;</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;%d\n&quot;</span>, t1 - lenp + <span class="number">1</span>);</span><br><span class="line">            t2 = next1[t2];</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">mian</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="built_in">cin</span>&gt;&gt;S&gt;&gt;P;</span><br><span class="line">    lens = <span class="built_in">strlen</span>(S);</span><br><span class="line">    lenp = <span class="built_in">strlen</span>(P);</span><br><span class="line">    get_next();</span><br><span class="line">    KMP();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">KMP算法</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="模板" scheme="http://blog.aquabet.xyz/tags/%E6%A8%A1%E6%9D%BF/"/>
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>并查集</title>
    <link href="http://blog.aquabet.xyz/Disjoint_Set_Union/"/>
    <id>http://blog.aquabet.xyz/Disjoint_Set_Union/</id>
    <published>2021-01-10T16:00:00.000Z</published>
    <updated>2021-01-10T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<!-- more --><h2 id="前言C"><a href="#前言C" class="headerlink" title="前言C"></a>前言C</h2><p>&emsp;&emsp;最近刷每日一题，连着两天出了并查集，分别是 <a href="https://leetcode-cn.com/problems/number-of-provinces/">547. 省份数量</a> 和 <a href="https://leetcode-cn.com/problems/smallest-string-with-swaps/">1202. 交换字符串中的元素</a> 下面以 <a href="https://leetcode-cn.com/problems/number-of-provinces/">547. 省份数量</a> 为例，简单阐述下并查集。</p><h2 id="原理"><a href="#原理" class="headerlink" title="原理"></a>原理</h2><p>&emsp;&emsp;并查集是一种简洁实用的数据结构，通常用于判断两元素是否属于同一集合时使用。并查集只有两种操作，合并集合和查询集合。<br>&emsp;&emsp;并查集中引入了代表元素的概念，即用一个元素来代替整个集合。可以把并查集类比为一颗树，树是从上往下的有向图，并查集是从下往上的有向图。这样，一个树上的所有节点最终都能找到树的根节点，也就是说，集合的所有元素都能找到并查集的代表元素。</p><h3 id="初始化"><a href="#初始化" class="headerlink" title="初始化"></a>初始化</h3><p>&emsp;&emsp;将每个元素的父节点初始化为自己。</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> fa[n];</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++) &#123;</span><br><span class="line">    fa[i] = i;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="并操作"><a href="#并操作" class="headerlink" title="并操作"></a>并操作</h3><p>&emsp;&emsp;并操作将两个集合合并到同一集合。只需要一个元素的代表元素(A)认另一个元素的代表元素(B)当爹就行。这样，A集合和B集合都变为了B集合，两个集合合并为了同一个集合。</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#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; j++) &#123;</span><br><span class="line">        <span class="keyword">if</span>(isConnected[i][j] == <span class="number">1</span>) &#123;<span class="comment">//如果联通，合并。</span></span><br><span class="line">            fa[findfa(fa,j)] = findfa(fa,i);</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><h3 id="查操作"><a href="#查操作" class="headerlink" title="查操作"></a>查操作</h3><p>&emsp;&emsp;查操作通常使用递归，不停地找父节点。直到找到一个节点的父节点是这个节点本身，那么这个节点就是待查元素的代表元素。</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">findfa</span><span class="params">(<span class="keyword">int</span> *fa, <span class="keyword">int</span> p)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(fa[p] != p) &#123;</span><br><span class="line">        <span class="keyword">return</span> findfa(fa,fa[p]);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> p;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>&emsp;&emsp;理解了并查集的基本操作，剩下就顺着题意写就完事。</p><h2 id="完整代码"><a href="#完整代码" class="headerlink" title="完整代码"></a>完整代码</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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> &#123;</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line">    <span class="function"><span class="keyword">int</span> <span class="title">findfa</span><span class="params">(<span class="keyword">int</span> *fa, <span class="keyword">int</span> p)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span>(fa[p] != p) &#123;</span><br><span class="line">            <span class="keyword">return</span> findfa(fa,fa[p]);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> &#123;</span><br><span class="line">            <span class="keyword">return</span> p;</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">findCircleNum</span><span class="params">(<span class="built_in">vector</span>&lt;<span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt;&gt;&amp; isConnected)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">int</span> n = isConnected.size();</span><br><span class="line">        <span class="keyword">if</span>(n == <span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">int</span> fa[n];</span><br><span class="line">        <span class="keyword">int</span> ans = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">bool</span> read[n];</span><br><span class="line">        <span class="built_in">memset</span>(read, <span class="literal">false</span>, <span class="keyword">sizeof</span>(read));</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++) &#123;</span><br><span class="line">            fa[i] = i;</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">0</span>; i &lt; n; i++) &#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; j++) &#123;</span><br><span class="line">                <span class="keyword">if</span>(isConnected[i][j] == <span class="number">1</span>) &#123;</span><br><span class="line">                    fa[findfa(fa,j)] = findfa(fa,i);</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="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">            <span class="keyword">int</span> thisfa = findfa(fa,i);</span><br><span class="line">            <span class="keyword">if</span>(read[thisfa] == <span class="literal">false</span>) &#123;</span><br><span class="line">                ans++;</span><br><span class="line">                read[thisfa] = <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</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></pre></td></tr></table></figure><h2 id="路径压缩"><a href="#路径压缩" class="headerlink" title="路径压缩"></a>路径压缩</h2><p>&emsp;&emsp;对于层数较高且查询的次数要求较高时，上面所示的并查集并不能高效地完成所需要求。因此我们引入了并查集的路径压缩。对于路径压缩，我们只需要修改并操作的代码，把构造一个棵树改为构造一棵层数为1的树<span class="heimu">仙人掌</span>。在一般情况下，路径压缩的并查集把并操作的效率略微降低，查操作的效率提高，在刷题时可以取舍使用。</p><h2 id="更多"><a href="#更多" class="headerlink" title="更多"></a>更多</h2><p>&emsp;&emsp;并查集是应用极广的数据结构，最小生成树的Kruskal算法也常通过并查集来写。<br>&emsp;&emsp;Kruskal算法的主要思想：以边为主导地位，始终选择当前可用的最小边权的边（sort或priority_queue）并加入集合，下面展示Kruskal的核心代码：</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">father</span><span class="params">(<span class="keyword">int</span> x)</span> </span>&#123;<span class="comment">//找代表元素，并查集的一部分</span></span><br><span class="line">    <span class="keyword">if</span>(fat[x] != x) &#123;</span><br><span class="line">        <span class="keyword">return</span> father(fat[x]);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> x;</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">unionn</span><span class="params">(<span class="keyword">int</span> x, <span class="keyword">int</span> y)</span> </span>&#123;<span class="comment">//加入团体，并查集的一部分</span></span><br><span class="line">    fat[father(y)] = father(x);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(father(edge[i].from) != father(edge[i].to)) &#123;<span class="comment">//假如不在一个团体</span></span><br><span class="line">    unionn(edge[i].from, edge[i].to);<span class="comment">//加入 </span></span><br><span class="line">    tot += edge[i].dis;<span class="comment">//记录边权 </span></span><br><span class="line">    k++;<span class="comment">//已连接边数+1 </span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">并查集&amp;LeetCode547</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="模板" scheme="http://blog.aquabet.xyz/tags/%E6%A8%A1%E6%9D%BF/"/>
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="LeetCode" scheme="http://blog.aquabet.xyz/tags/LeetCode/"/>
    
  </entry>
  
  <entry>
    <title>LaTeX公式基础</title>
    <link href="http://blog.aquabet.xyz/latex/"/>
    <id>http://blog.aquabet.xyz/latex/</id>
    <published>2021-01-07T16:00:00.000Z</published>
    <updated>2021-01-07T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="行内模式"><a href="#行内模式" class="headerlink" title="行内模式"></a>行内模式</h2><p>使用 <code>$ ... $</code> 或者 <code>\( ... \)</code> 包裹公式</p><h2 id="特显模式"><a href="#特显模式" class="headerlink" title="特显模式"></a>特显模式</h2><p>使用 <code>$$ ... $$</code> 或者 <code>\[ ... \]</code> 包裹公式</p><h2 id="占用字符"><a href="#占用字符" class="headerlink" title="占用字符"></a>占用字符</h2><p><code># $ % &amp; _ &#123; &#125;</code> 为占用字符，输入时使用 <code>\</code> 进行转义，例如 <code>\# \$ \&amp;</code> 的方式进行输入。</p><p>此外，在数学模式中输入中文会报错，最好的方式是使用 <code>\mabox&#123;中文内容&#125;</code> 。</p><h2 id="上下标"><a href="#上下标" class="headerlink" title="上下标"></a>上下标</h2><p>使用 <code>^</code> 来表示上标，使用 <code>_</code> 来表示下标。例如 $C^3_5$ 写作 <code>C^3_5</code> 。<br>在使用上下标时，有多个字符需使用<code>&#123; &#125;</code>包裹，例如$x^{10}$ 写作<code>x^&#123;10&#125;</code>。</p><h2 id="希腊字母"><a href="#希腊字母" class="headerlink" title="希腊字母"></a>希腊字母</h2><table><thead><tr><th align="center">字母</th><th align="center">代码</th><th align="center">字母</th><th align="center">代码</th><th align="center">字母</th><th align="center">代码</th></tr></thead><tbody><tr><td align="center">$\alpha$</td><td align="center"><code>\alpha</code></td><td align="center">$\beta$</td><td align="center"><code>\bata</code></td><td align="center">$\Gamma$</td><td align="center"><code>\Gamma</code></td></tr><tr><td align="center">$\gamma$</td><td align="center"><code>\gamma</code></td><td align="center">$\delta$</td><td align="center"><code>\delta</code></td><td align="center">$\Delta$</td><td align="center"><code>\Delta</code></td></tr><tr><td align="center">$\epsilon$</td><td align="center"><code>\epsilon</code></td><td align="center">$\varepsilon$</td><td align="center"><code>\varepsilon</code></td><td align="center">$\Theta$</td><td align="center"><code>\Theta</code></td></tr><tr><td align="center">$\zeta$</td><td align="center"><code>\zeta</code></td><td align="center">$\eta$</td><td align="center"><code>\eta</code></td><td align="center">$\Lambda$</td><td align="center"><code>\Lambda</code></td></tr><tr><td align="center">$\theta$</td><td align="center"><code>\theta</code></td><td align="center">$\vartheta$</td><td align="center"><code>\vartheta</code></td><td align="center">$\Xi$</td><td align="center"><code>\Xi</code></td></tr><tr><td align="center">$\iota$</td><td align="center"><code>\iota</code></td><td align="center">$\kappa$</td><td align="center"><code>\kappa</code></td><td align="center">$\Pi$</td><td align="center"><code>\Pi</code></td></tr><tr><td align="center">$\lambda$</td><td align="center"><code>\lambda</code></td><td align="center">$\mu$</td><td align="center"><code>\mu</code></td><td align="center">$\Sigma$</td><td align="center"><code>\Sigma</code></td></tr><tr><td align="center">$\nu$</td><td align="center"><code>\nu</code></td><td align="center">$\xi$</td><td align="center"><code>\xi</code></td><td align="center">$\Upsilon$</td><td align="center"><code>\Upsilon</code></td></tr><tr><td align="center">$o$</td><td align="center"><code>o</code></td><td align="center">$\pi$</td><td align="center"><code>\pi</code></td><td align="center">$\Phi$</td><td align="center"><code>\Phi</code></td></tr><tr><td align="center">$\varpi$</td><td align="center"><code>\varpi</code></td><td align="center">$\rho$</td><td align="center"><code>\rho</code></td><td align="center">$\Psi$</td><td align="center"><code>\Psi</code></td></tr><tr><td align="center">$\varrho$</td><td align="center"><code>\varrho</code></td><td align="center">$\sigma$</td><td align="center"><code>\sigma</code></td><td align="center">$\Omega$</td><td align="center"><code>\Omega</code></td></tr><tr><td align="center">$\varsigma$</td><td align="center"><code>\varsigma</code></td><td align="center">$\tau$</td><td align="center"><code>\tau</code></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">$\upsilon$</td><td align="center"><code>\upsilon</code></td><td align="center">$\phi$</td><td align="center"><code>\phi</code></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">$\varphi$</td><td align="center"><code>\varphi</code></td><td align="center">$\chi$</td><td align="center"><code>\chi</code></td><td align="center"></td><td align="center"></td></tr><tr><td align="center">$\psi$</td><td align="center"><code>\psi</code></td><td align="center">$\omega$</td><td align="center"><code>\omega</code></td><td align="center"></td><td align="center"></td></tr></tbody></table><h2 id="分数和开方"><a href="#分数和开方" class="headerlink" title="分数和开方"></a>分数和开方</h2><p>分数用<code>\frac&#123;分子&#125;&#123;分母&#125;</code>，例如 $\frac{1}{\pi}$  写作：<code>\frac&#123;1&#125;&#123;\pi&#125;</code>。<br>开方用<code>\sqrt[n]&#123;表达式&#125;</code>，例如 $\sqrt[2]{1+k+k^2}$ 写作：<code>\sqrt[2]&#123;1+k+k^2&#125;</code>。</p><h2 id="省略号"><a href="#省略号" class="headerlink" title="省略号"></a>省略号</h2><table><thead><tr><th align="center">符号</th><th align="center">代码</th><th align="center">符号</th><th align="center">代码</th></tr></thead><tbody><tr><td align="center">$\dots$</td><td align="center"><code>\dots</code></td><td align="center">$\vdots$</td><td align="center"><code>\vdots</code></td></tr><tr><td align="center">$\cdots$</td><td align="center"><code>\cdots</code></td><td align="center">$\ddots$</td><td align="center"><code>\ddots</code></td></tr></tbody></table><h2 id="括号和分隔符"><a href="#括号和分隔符" class="headerlink" title="括号和分隔符"></a>括号和分隔符</h2><p><code>()</code>,<code>[]</code>,<code>|</code>可以直接输入，<code>&#123;&#125;</code>使用时应输入<code>\&#123;\&#125;</code>，<code>||</code>使用时应输入<code>\|</code>。显示大号的括号或者分隔符时，需对应使用<code>\left</code>和<code>\right</code>,例如：</p><p>$f(x,y,z) = 3y^2 z \left(3+\frac{7x+5}{1+y^2}\right).$ 写作：<code>f(x,y,z) = 3y^2 z \left(3+\frac&#123;7x+5&#125;&#123;1+y^2&#125;\right).</code>。<br>$\left.\frac{du}{dx}\right|_{x=0}$ 写作：<code>\left.\frac&#123;du&#125;&#123;dx&#125;\right|_&#123;x=0&#125;</code>。</p><h2 id="矩阵"><a href="#矩阵" class="headerlink" title="矩阵"></a>矩阵</h2><p>$$<br>\left(\begin{array}{ccc}<br>a &amp; b &amp; c \\<br>d &amp; e &amp; f \\<br>g &amp; h &amp; i<br>\end{array}\right)<br>$$</p><p>使用代码</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></pre></td><td class="code"><pre><span class="line">\left(\begin&#123;<span class="built_in">array</span>&#125;&#123;ccc&#125;</span><br><span class="line">a &amp; b &amp; c \\</span><br><span class="line">d &amp; e &amp; f \\</span><br><span class="line">g &amp; h &amp; i</span><br><span class="line">\end&#123;<span class="built_in">array</span>&#125;\right)</span><br></pre></td></tr></table></figure><p>$$<br>\chi(\lambda) = \left|<br>\begin{array}{ccc}<br>\lambda - a &amp; -b &amp; -c \\<br>-d &amp; \lambda - e &amp; -f \\<br>-g &amp; -h &amp; \lambda - i<br>\end{array} \right|.<br>$$</p><p>使用代码</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></pre></td><td class="code"><pre><span class="line">\chi(\lambda) = \left|</span><br><span class="line">\begin&#123;<span class="built_in">array</span>&#125;&#123;ccc&#125;</span><br><span class="line">\lambda - a &amp; -b &amp; -c \\</span><br><span class="line">-d &amp; \lambda - e &amp; -f \\</span><br><span class="line">-g &amp; -h &amp; \lambda - i</span><br><span class="line">\end&#123;<span class="built_in">array</span>&#125; \right|.</span><br></pre></td></tr></table></figure><h2 id="导数，极限，求和，积分"><a href="#导数，极限，求和，积分" class="headerlink" title="导数，极限，求和，积分"></a>导数，极限，求和，积分</h2><p>$$\frac{du}{dt}\text{ and }\frac{d^2 u}{dx^2}$$</p><p>使用代码</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">\frac&#123;du&#125;&#123;dt&#125;\text&#123; <span class="keyword">and</span> &#125;\frac&#123;d^<span class="number">2</span> u&#125;&#123;dx^<span class="number">2</span>&#125;</span><br></pre></td></tr></table></figure><p>部分符号和极限表达式：</p><p>$$\lim_{x \to +\infty},\inf_{x &gt; s},\sup_K$$</p><p>使用代码</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">\lim_&#123;x \to +\infty&#125;,\inf_&#123;x &gt; s&#125;,\sup_K</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">基础公式，不包含宏包介绍使用</summary>
    
    
    
    <category term="LaTeX" scheme="http://blog.aquabet.xyz/categories/LaTeX/"/>
    
    
    <category term="模板" scheme="http://blog.aquabet.xyz/tags/%E6%A8%A1%E6%9D%BF/"/>
    
  </entry>
  
  <entry>
    <title>线段树模板</title>
    <link href="http://blog.aquabet.xyz/segment_tree/"/>
    <id>http://blog.aquabet.xyz/segment_tree/</id>
    <published>2021-01-07T16:00:00.000Z</published>
    <updated>2021-01-07T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<!-- more --><p>&emsp;&emsp;线段树模板带快读快出，忘了从哪位大神抄来的了</p><p>&emsp;&emsp;OI时期代码，不保证正确性。</p><p><a href="https://www.luogu.org/problemnew/show/P3374">单点修改，区间查询</a></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><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><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</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;cstring&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;cstdlib&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 class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stack&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 100010</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INF 10000009</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MOD 10000007</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LL long long</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> in(a) a=read()</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> REP(i,k,n) for(long long i=k;i&lt;=n;i++)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> DREP(i,k,n) for(long long i=k;i&gt;=n;i--)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> cl(a) memset(a,0,sizeof(a))</span></span><br><span class="line"><span class="comment">/*相当于：&#123;</span></span><br><span class="line"><span class="comment">    long long a;</span></span><br><span class="line"><span class="comment">    scanf(&quot;%lld&quot;,&amp;a);</span></span><br><span class="line"><span class="comment">    return a;</span></span><br><span class="line"><span class="comment">&#125;</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> x=<span class="number">0</span>,f=<span class="number">1</span>;<span class="keyword">char</span> ch=getchar();</span><br><span class="line">    <span class="keyword">for</span>(;!<span class="built_in">isdigit</span>(ch);ch=getchar()) <span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">for</span>(;<span class="built_in">isdigit</span>(ch);ch=getchar()) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/*相当于：&#123;</span></span><br><span class="line"><span class="comment">    printf(&quot;%lld&quot;,a);</span></span><br><span class="line"><span class="comment">&#125;</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">out</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(x&lt;<span class="number">0</span>) <span class="built_in">putchar</span>(<span class="string">&#x27;-&#x27;</span>),x=-x;</span><br><span class="line">    <span class="keyword">if</span>(x&gt;<span class="number">9</span>) out(x/<span class="number">10</span>);</span><br><span class="line">    <span class="built_in">putchar</span>(x%<span class="number">10</span>+<span class="string">&#x27;0&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> n,m,p;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> input[MAXN];</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span>&#123;</span></span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> l,r;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> sum,mlz,plz;</span><br><span class="line">&#125;tree[<span class="number">4</span>*MAXN];<span class="comment">//线段树记得开四倍空间</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">build</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i,<span class="keyword">long</span> <span class="keyword">long</span> l,<span class="keyword">long</span> <span class="keyword">long</span> r)</span></span>&#123;</span><br><span class="line">    tree[i].l=l;</span><br><span class="line">    tree[i].r=r;</span><br><span class="line">    tree[i].mlz=<span class="number">1</span>;</span><br><span class="line">    <span class="keyword">if</span>(l==r)&#123;</span><br><span class="line">        tree[i].sum=input[l]%p;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> mid=(l+r)&gt;&gt;<span class="number">1</span>;</span><br><span class="line">    build(i&lt;&lt;<span class="number">1</span>,l,mid);</span><br><span class="line">    build(i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>,mid+<span class="number">1</span>,r);</span><br><span class="line">    tree[i].sum=(tree[i&lt;&lt;<span class="number">1</span>].sum+tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum)%p;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">pushdown</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i)</span></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> k1=tree[i].mlz,k2=tree[i].plz;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>].sum=(tree[i&lt;&lt;<span class="number">1</span>].sum*k1+k2*(tree[i&lt;&lt;<span class="number">1</span>].r-tree[i&lt;&lt;<span class="number">1</span>].l+<span class="number">1</span>))%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum=(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum*k1+k2*(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].r-tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].l+<span class="number">1</span>))%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>].mlz=(tree[i&lt;&lt;<span class="number">1</span>].mlz*k1)%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].mlz=(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].mlz*k1)%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>].plz=(tree[i&lt;&lt;<span class="number">1</span>].plz*k1+k2)%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].plz=(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].plz*k1+k2)%p;</span><br><span class="line">    tree[i].plz=<span class="number">0</span>;</span><br><span class="line">    tree[i].mlz=<span class="number">1</span>;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">mul</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i,<span class="keyword">long</span> <span class="keyword">long</span> l,<span class="keyword">long</span> <span class="keyword">long</span> r,<span class="keyword">long</span> <span class="keyword">long</span> k)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].r&lt;l || tree[i].l&gt;r)  <span class="keyword">return</span> ;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].l&gt;=l &amp;&amp; tree[i].r&lt;=r)&#123;</span><br><span class="line">        tree[i].sum=(tree[i].sum*k)%p;</span><br><span class="line">        tree[i].mlz=(tree[i].mlz*k)%p;</span><br><span class="line">        tree[i].plz=(tree[i].plz*k)%p;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    pushdown(i);</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>].r&gt;=l)  mul(i&lt;&lt;<span class="number">1</span>,l,r,k);</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].l&lt;=r)  mul(i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>,l,r,k);</span><br><span class="line">    tree[i].sum=(tree[i&lt;&lt;<span class="number">1</span>].sum+tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum)%p;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i,<span class="keyword">long</span> <span class="keyword">long</span> l,<span class="keyword">long</span> <span class="keyword">long</span> r,<span class="keyword">long</span> <span class="keyword">long</span> k)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].r&lt;l || tree[i].l&gt;r)  <span class="keyword">return</span> ;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].l&gt;=l &amp;&amp; tree[i].r&lt;=r)&#123;</span><br><span class="line">        tree[i].sum+=((tree[i].r-tree[i].l+<span class="number">1</span>)*k)%p;</span><br><span class="line">        tree[i].plz=(tree[i].plz+k)%p;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    pushdown(i);</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>].r&gt;=l)  add(i&lt;&lt;<span class="number">1</span>,l,r,k);</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].l&lt;=r)  add(i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>,l,r,k);</span><br><span class="line">    tree[i].sum=(tree[i&lt;&lt;<span class="number">1</span>].sum+tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum)%p;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="title">search</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i,<span class="keyword">long</span> <span class="keyword">long</span> l,<span class="keyword">long</span> <span class="keyword">long</span> r)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].r&lt;l || tree[i].l&gt;r)  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].l&gt;=l &amp;&amp; tree[i].r&lt;=r)</span><br><span class="line">        <span class="keyword">return</span> tree[i].sum;</span><br><span class="line">    pushdown(i);</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> sum=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>].r&gt;=l)  sum+=search(i&lt;&lt;<span class="number">1</span>,l,r)%p;</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].l&lt;=r)  sum+=search(i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>,l,r)%p;</span><br><span class="line">    <span class="keyword">return</span> sum%p;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    in(n);    in(m);in(p);</span><br><span class="line">    REP(i,<span class="number">1</span>,n)  in(input[i]);</span><br><span class="line">    build(<span class="number">1</span>,<span class="number">1</span>,n);</span><br><span class="line"></span><br><span class="line">    REP(i,<span class="number">1</span>,m)&#123;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> fl,a,b,c;</span><br><span class="line">        in(fl);</span><br><span class="line">        <span class="keyword">if</span>(fl==<span class="number">1</span>)&#123;</span><br><span class="line">            in(a);in(b);in(c);</span><br><span class="line">            c%=p;</span><br><span class="line">            mul(<span class="number">1</span>,a,b,c);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span>(fl==<span class="number">2</span>)&#123;</span><br><span class="line">            in(a);in(b);in(c);</span><br><span class="line">            c%=p;</span><br><span class="line">            add(<span class="number">1</span>,a,b,c);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span>(fl==<span class="number">3</span>)&#123;</span><br><span class="line">            in(a);in(b);</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;%lld\n&quot;</span>,search(<span class="number">1</span>,a,b));</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">5 4 1000</span></span><br><span class="line"><span class="comment">1 2 3 4 5</span></span><br><span class="line"><span class="comment">3 1 5</span></span><br><span class="line"><span class="comment">2 1 5 1</span></span><br><span class="line"><span class="comment">1 1 5 2</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">3 1 5</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><p><a href="https://www.luogu.org/problemnew/show/P3368">区间修改，单点查询</a></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><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></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;cstring&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;queue&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">int</span> n,m;</span><br><span class="line"><span class="keyword">int</span> ans;</span><br><span class="line"><span class="keyword">int</span> input[<span class="number">500010</span>];</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> left,right;</span><br><span class="line">    <span class="keyword">int</span> num;</span><br><span class="line">&#125;tree[<span class="number">2000010</span>];</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">build</span><span class="params">(<span class="keyword">int</span> left,<span class="keyword">int</span> right,<span class="keyword">int</span> index)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    tree[index].num=<span class="number">0</span>;</span><br><span class="line">    tree[index].left=left;</span><br><span class="line">    tree[index].right=right;</span><br><span class="line">       <span class="keyword">if</span>(left==right)</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    <span class="keyword">int</span> mid=(right+left)/<span class="number">2</span>;</span><br><span class="line">    build(left,mid,index*<span class="number">2</span>);</span><br><span class="line">    build(mid+<span class="number">1</span>,right,index*<span class="number">2</span>+<span class="number">1</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">pls</span><span class="params">(<span class="keyword">int</span> index,<span class="keyword">int</span> l,<span class="keyword">int</span> r,<span class="keyword">int</span> k)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[index].left&gt;=l &amp;&amp; tree[index].right&lt;=r)</span><br><span class="line">    &#123;</span><br><span class="line">        tree[index].num+=k;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(tree[index*<span class="number">2</span>].right&gt;=l)</span><br><span class="line">       pls(index*<span class="number">2</span>,l,r,k);</span><br><span class="line">    <span class="keyword">if</span>(tree[index*<span class="number">2</span>+<span class="number">1</span>].left&lt;=r)</span><br><span class="line">       pls(index*<span class="number">2</span>+<span class="number">1</span>,l,r,k);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">search</span><span class="params">(<span class="keyword">int</span> index,<span class="keyword">int</span> dis)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ans+=tree[index].num;</span><br><span class="line">    <span class="keyword">if</span>(tree[index].left==tree[index].right)</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    <span class="keyword">if</span>(dis&lt;=tree[index*<span class="number">2</span>].right)</span><br><span class="line">        search(index*<span class="number">2</span>,dis);</span><br><span class="line">    <span class="keyword">if</span>(dis&gt;=tree[index*<span class="number">2</span>+<span class="number">1</span>].left)</span><br><span class="line">        search(index*<span class="number">2</span>+<span class="number">1</span>,dis);</span><br><span class="line">&#125;</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="built_in">cin</span>&gt;&gt;n&gt;&gt;m;</span><br><span class="line">    build(<span class="number">1</span>,n,<span class="number">1</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="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;input[i]);</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> a;</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;a);</span><br><span class="line">        <span class="keyword">if</span>(a==<span class="number">1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">int</span> x,y,z;</span><br><span class="line">            <span class="built_in">scanf</span>(<span class="string">&quot;%d%d%d&quot;</span>,&amp;x,&amp;y,&amp;z);</span><br><span class="line">            pls(<span class="number">1</span>,x,y,z);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span>(a==<span class="number">2</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            ans=<span class="number">0</span>;</span><br><span class="line">            <span class="keyword">int</span> x;</span><br><span class="line">            <span class="built_in">scanf</span>(<span class="string">&quot;%d&quot;</span>,&amp;x);</span><br><span class="line">            search(<span class="number">1</span>,x);</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;%d\n&quot;</span>,ans+input[x]);</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><a href="https://www.luogu.org/problemnew/show/P3372">区间加法</a></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><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></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="meta">#<span class="meta-keyword">define</span> init long long</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line">init n,m;</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">    init l,r,data;</span><br><span class="line">    init lt;</span><br><span class="line">&#125;tree[<span class="number">1000010</span>];</span><br><span class="line">init arr[<span class="number">1000010</span>];</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">build</span><span class="params">(init l,init r,init index,init arr[])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    tree[index].lt=<span class="number">0</span>;</span><br><span class="line">    tree[index].l=l;</span><br><span class="line">    tree[index].r=r;</span><br><span class="line">    <span class="keyword">if</span>(l==r)</span><br><span class="line">    &#123;</span><br><span class="line">        tree[index].data=arr[l];</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    init mid=(l+r)/<span class="number">2</span>;</span><br><span class="line">    build(l,mid,index*<span class="number">2</span>,arr);</span><br><span class="line">    build(mid+<span class="number">1</span>,r,index*<span class="number">2</span>+<span class="number">1</span>,arr);</span><br><span class="line">    tree[index].data=tree[index*<span class="number">2</span>].data+tree[index*<span class="number">2</span>+<span class="number">1</span>].data;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">push_down</span><span class="params">(init index)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[index].lt!=<span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        tree[index*<span class="number">2</span>].lt+=tree[index].lt;</span><br><span class="line">        tree[index*<span class="number">2</span>+<span class="number">1</span>].lt+=tree[index].lt;</span><br><span class="line">        init mid=(tree[index].l+tree[index].r)/<span class="number">2</span>;</span><br><span class="line">        tree[index*<span class="number">2</span>].data+=tree[index].lt*(mid-tree[index*<span class="number">2</span>].l+<span class="number">1</span>);</span><br><span class="line">        tree[index*<span class="number">2</span>+<span class="number">1</span>].data+=tree[index].lt*(tree[index*<span class="number">2</span>+<span class="number">1</span>].r-mid);</span><br><span class="line">        tree[index].lt=<span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">up_data</span><span class="params">(init index,init l,init r,init k)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[index].r&lt;=r &amp;&amp; tree[index].l&gt;=l)</span><br><span class="line">    &#123;</span><br><span class="line">        tree[index].data+=k*(tree[index].r-tree[index].l+<span class="number">1</span>);</span><br><span class="line">        tree[index].lt+=k;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    push_down(index);</span><br><span class="line">    <span class="keyword">if</span>(tree[index*<span class="number">2</span>].r&gt;=l)</span><br><span class="line">        up_data(index*<span class="number">2</span>,l,r,k);</span><br><span class="line">    <span class="keyword">if</span>(tree[index*<span class="number">2</span>+<span class="number">1</span>].l&lt;=r)</span><br><span class="line">        up_data(index*<span class="number">2</span>+<span class="number">1</span>,l,r,k);</span><br><span class="line">    tree[index].data=tree[index*<span class="number">2</span>].data+tree[index*<span class="number">2</span>+<span class="number">1</span>].data;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">init <span class="title">search</span><span class="params">(init index,init l,init r)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[index].l&gt;=l &amp;&amp; tree[index].r&lt;=r)</span><br><span class="line">        <span class="keyword">return</span> tree[index].data;</span><br><span class="line">    push_down(index);</span><br><span class="line">    init num=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span>(tree[index*<span class="number">2</span>].r&gt;=l)</span><br><span class="line">        num+=search(index*<span class="number">2</span>,l,r);</span><br><span class="line">    <span class="keyword">if</span>(tree[index*<span class="number">2</span>+<span class="number">1</span>].l&lt;=r)</span><br><span class="line">        num+=search(index*<span class="number">2</span>+<span class="number">1</span>,l,r);</span><br><span class="line">    <span class="keyword">return</span> num;</span><br><span class="line">&#125;</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">cin</span>&gt;&gt;n&gt;&gt;m;</span><br><span class="line">    <span class="keyword">for</span>(init i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">        <span class="built_in">cin</span>&gt;&gt;arr[i];</span><br><span class="line">    build(<span class="number">1</span>,n,<span class="number">1</span>,arr);</span><br><span class="line">    <span class="keyword">for</span>(init i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        init f;</span><br><span class="line">        <span class="built_in">cin</span>&gt;&gt;f;</span><br><span class="line">        <span class="keyword">if</span>(f==<span class="number">1</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            init a,b,c;</span><br><span class="line">            <span class="built_in">cin</span>&gt;&gt;a&gt;&gt;b&gt;&gt;c;</span><br><span class="line">            up_data(<span class="number">1</span>,a,b,c);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span>(f==<span class="number">2</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            init a,b;</span><br><span class="line">            <span class="built_in">cin</span>&gt;&gt;a&gt;&gt;b;</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;%lld\n&quot;</span>,search(<span class="number">1</span>,a,b));</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><a href="https://www.luogu.org/problemnew/show/P3373">区间乘法</a></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><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><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</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;cstring&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;cstdlib&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 class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;stack&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MAXN 100010</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> INF 10000009</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> MOD 10000007</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> LL long long</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> in(a) a=read()</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> REP(i,k,n) for(long long i=k;i&lt;=n;i++)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> DREP(i,k,n) for(long long i=k;i&gt;=n;i--)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> cl(a) memset(a,0,sizeof(a))</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> x=<span class="number">0</span>,f=<span class="number">1</span>;<span class="keyword">char</span> ch=getchar();</span><br><span class="line">    <span class="keyword">for</span>(;!<span class="built_in">isdigit</span>(ch);ch=getchar()) <span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">for</span>(;<span class="built_in">isdigit</span>(ch);ch=getchar()) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">out</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(x&lt;<span class="number">0</span>) <span class="built_in">putchar</span>(<span class="string">&#x27;-&#x27;</span>),x=-x;</span><br><span class="line">    <span class="keyword">if</span>(x&gt;<span class="number">9</span>) out(x/<span class="number">10</span>);</span><br><span class="line">    <span class="built_in">putchar</span>(x%<span class="number">10</span>+<span class="string">&#x27;0&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> n,m,p;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> input[MAXN];</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span>&#123;</span></span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> l,r;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> sum,mlz,plz;</span><br><span class="line">&#125;tree[<span class="number">4</span>*MAXN];</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">build</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i,<span class="keyword">long</span> <span class="keyword">long</span> l,<span class="keyword">long</span> <span class="keyword">long</span> r)</span></span>&#123;</span><br><span class="line">    tree[i].l=l;</span><br><span class="line">    tree[i].r=r;</span><br><span class="line">    tree[i].mlz=<span class="number">1</span>;</span><br><span class="line">    <span class="keyword">if</span>(l==r)&#123;</span><br><span class="line">        tree[i].sum=input[l]%p;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> mid=(l+r)&gt;&gt;<span class="number">1</span>;</span><br><span class="line">    build(i&lt;&lt;<span class="number">1</span>,l,mid);</span><br><span class="line">    build(i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>,mid+<span class="number">1</span>,r);</span><br><span class="line">    tree[i].sum=(tree[i&lt;&lt;<span class="number">1</span>].sum+tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum)%p;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">pushdown</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i)</span></span>&#123;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> k1=tree[i].mlz,k2=tree[i].plz;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>].sum=(tree[i&lt;&lt;<span class="number">1</span>].sum*k1+k2*(tree[i&lt;&lt;<span class="number">1</span>].r-tree[i&lt;&lt;<span class="number">1</span>].l+<span class="number">1</span>))%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum=(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum*k1+k2*(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].r-tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].l+<span class="number">1</span>))%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>].mlz=(tree[i&lt;&lt;<span class="number">1</span>].mlz*k1)%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].mlz=(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].mlz*k1)%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>].plz=(tree[i&lt;&lt;<span class="number">1</span>].plz*k1+k2)%p;</span><br><span class="line">    tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].plz=(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].plz*k1+k2)%p;</span><br><span class="line">    tree[i].plz=<span class="number">0</span>;</span><br><span class="line">    tree[i].mlz=<span class="number">1</span>;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">mul</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i,<span class="keyword">long</span> <span class="keyword">long</span> l,<span class="keyword">long</span> <span class="keyword">long</span> r,<span class="keyword">long</span> <span class="keyword">long</span> k)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].r&lt;l || tree[i].l&gt;r)  <span class="keyword">return</span> ;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].l&gt;=l &amp;&amp; tree[i].r&lt;=r)&#123;</span><br><span class="line">        tree[i].sum=(tree[i].sum*k)%p;</span><br><span class="line">        tree[i].mlz=(tree[i].mlz*k)%p;</span><br><span class="line">        tree[i].plz=(tree[i].plz*k)%p;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    pushdown(i);</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>].r&gt;=l)  mul(i&lt;&lt;<span class="number">1</span>,l,r,k);</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].l&lt;=r)  mul(i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>,l,r,k);</span><br><span class="line">    tree[i].sum=(tree[i&lt;&lt;<span class="number">1</span>].sum+tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum)%p;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i,<span class="keyword">long</span> <span class="keyword">long</span> l,<span class="keyword">long</span> <span class="keyword">long</span> r,<span class="keyword">long</span> <span class="keyword">long</span> k)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].r&lt;l || tree[i].l&gt;r)  <span class="keyword">return</span> ;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].l&gt;=l &amp;&amp; tree[i].r&lt;=r)&#123;</span><br><span class="line">        tree[i].sum+=((tree[i].r-tree[i].l+<span class="number">1</span>)*k)%p;</span><br><span class="line">        tree[i].plz=(tree[i].plz+k)%p;</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    pushdown(i);</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>].r&gt;=l)  add(i&lt;&lt;<span class="number">1</span>,l,r,k);</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].l&lt;=r)  add(i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>,l,r,k);</span><br><span class="line">    tree[i].sum=(tree[i&lt;&lt;<span class="number">1</span>].sum+tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].sum)%p;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="title">search</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> i,<span class="keyword">long</span> <span class="keyword">long</span> l,<span class="keyword">long</span> <span class="keyword">long</span> r)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].r&lt;l || tree[i].l&gt;r)  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].l&gt;=l &amp;&amp; tree[i].r&lt;=r)</span><br><span class="line">        <span class="keyword">return</span> tree[i].sum;</span><br><span class="line">    pushdown(i);</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> sum=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>].r&gt;=l)  sum+=search(i&lt;&lt;<span class="number">1</span>,l,r)%p;</span><br><span class="line">    <span class="keyword">if</span>(tree[i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>].l&lt;=r)  sum+=search(i&lt;&lt;<span class="number">1</span>|<span class="number">1</span>,l,r)%p;</span><br><span class="line">    <span class="keyword">return</span> sum%p;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    in(n);    in(m);in(p);</span><br><span class="line">    REP(i,<span class="number">1</span>,n)  in(input[i]);</span><br><span class="line">    build(<span class="number">1</span>,<span class="number">1</span>,n);</span><br><span class="line"></span><br><span class="line">    REP(i,<span class="number">1</span>,m)&#123;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> fl,a,b,c;</span><br><span class="line">        in(fl);</span><br><span class="line">        <span class="keyword">if</span>(fl==<span class="number">1</span>)&#123;</span><br><span class="line">            in(a);in(b);in(c);</span><br><span class="line">            c%=p;</span><br><span class="line">            mul(<span class="number">1</span>,a,b,c);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span>(fl==<span class="number">2</span>)&#123;</span><br><span class="line">            in(a);in(b);in(c);</span><br><span class="line">            c%=p;</span><br><span class="line">            add(<span class="number">1</span>,a,b,c);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span>(fl==<span class="number">3</span>)&#123;</span><br><span class="line">            in(a);in(b);</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;%lld\n&quot;</span>,search(<span class="number">1</span>,a,b));</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">5 4 1000</span></span><br><span class="line"><span class="comment">1 2 3 4 5</span></span><br><span class="line"><span class="comment">3 1 5</span></span><br><span class="line"><span class="comment">2 1 5 1</span></span><br><span class="line"><span class="comment">1 1 5 2</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">3 1 5</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure><p>区间根号，没有找到合适的模板题</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><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></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;cstring&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">define</span> MAXN 1000010</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> REP(i,k,n) for(int i=k;i&lt;=n;i++)</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> in(a) a=read()</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="keyword">int</span> x=<span class="number">0</span>,f=<span class="number">1</span>;</span><br><span class="line">    <span class="keyword">char</span> ch=getchar();</span><br><span class="line">    <span class="keyword">for</span>(;!<span class="built_in">isdigit</span>(ch);ch=getchar())</span><br><span class="line">        <span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>)</span><br><span class="line">          f=<span class="number">-1</span>;</span><br><span class="line">    <span class="keyword">for</span>(;<span class="built_in">isdigit</span>(ch);ch=getchar())</span><br><span class="line">        x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span>&#123;</span></span><br><span class="line">    <span class="keyword">int</span> l,r;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> lz,sum,maxx,minn;</span><br><span class="line">&#125;tree[MAXN&lt;&lt;<span class="number">2</span>];</span><br><span class="line"><span class="keyword">int</span> n,m,input[MAXN];</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">build</span><span class="params">(<span class="keyword">int</span> i,<span class="keyword">int</span> l,<span class="keyword">int</span> r)</span></span>&#123;</span><br><span class="line">    tree[i].l=l;tree[i].r=r;</span><br><span class="line">    <span class="keyword">if</span>(l==r)&#123;</span><br><span class="line">        tree[i].sum=tree[i].minn=tree[i].maxx=input[l];</span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">int</span> mid=(l+r)&gt;&gt;<span class="number">1</span>;</span><br><span class="line">    build(i*<span class="number">2</span>,l,mid);</span><br><span class="line">    build(i*<span class="number">2</span>+<span class="number">1</span>,mid+<span class="number">1</span>,r);</span><br><span class="line">    tree[i].sum=tree[i*<span class="number">2</span>].sum+tree[i*<span class="number">2</span>+<span class="number">1</span>].sum;</span><br><span class="line">    tree[i].minn=min(tree[i*<span class="number">2</span>].minn,tree[i*<span class="number">2</span>+<span class="number">1</span>].minn);</span><br><span class="line">    tree[i].maxx=max(tree[i*<span class="number">2</span>].maxx,tree[i*<span class="number">2</span>+<span class="number">1</span>].maxx);</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">push_down</span><span class="params">(<span class="keyword">int</span> i)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(!tree[i].lz)  <span class="keyword">return</span> ;</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> k=tree[i].lz;</span><br><span class="line">    tree[i*<span class="number">2</span>].lz+=k;</span><br><span class="line">    tree[i*<span class="number">2</span>+<span class="number">1</span>].lz+=k;</span><br><span class="line">    tree[i*<span class="number">2</span>].sum-=(tree[i*<span class="number">2</span>].r-tree[i*<span class="number">2</span>].l+<span class="number">1</span>)*k;</span><br><span class="line">    tree[i*<span class="number">2</span>+<span class="number">1</span>].sum-=(tree[i*<span class="number">2</span>+<span class="number">1</span>].r-tree[i*<span class="number">2</span>+<span class="number">1</span>].l+<span class="number">1</span>)*k;</span><br><span class="line">    tree[i*<span class="number">2</span>].minn-=k;</span><br><span class="line">    tree[i*<span class="number">2</span>+<span class="number">1</span>].minn-=k;</span><br><span class="line">    tree[i*<span class="number">2</span>].maxx-=k;</span><br><span class="line">    tree[i*<span class="number">2</span>+<span class="number">1</span>].maxx-=k;</span><br><span class="line">    tree[i].lz=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">Sqrt</span><span class="params">(<span class="keyword">int</span> i,<span class="keyword">int</span> l,<span class="keyword">int</span> r)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].l&gt;=l &amp;&amp; tree[i].r&lt;=r &amp;&amp; (tree[i].minn-(<span class="keyword">long</span> <span class="keyword">long</span>)<span class="built_in">sqrt</span>(tree[i].minn))==(tree[i].maxx-(<span class="keyword">long</span> <span class="keyword">long</span>)<span class="built_in">sqrt</span>(tree[i].maxx)))&#123;</span><br><span class="line">        <span class="keyword">long</span> <span class="keyword">long</span> u=tree[i].minn-(<span class="keyword">long</span> <span class="keyword">long</span>)<span class="built_in">sqrt</span>(tree[i].minn);</span><br><span class="line">        tree[i].lz+=u;</span><br><span class="line">        tree[i].sum-=(tree[i].r-tree[i].l+<span class="number">1</span>)*u;</span><br><span class="line">        tree[i].minn-=u;</span><br><span class="line">        tree[i].maxx-=u;</span><br><span class="line">            <span class="comment">//cout&lt;&lt;&quot;i&quot;&lt;&lt;i&lt;&lt;&quot; &quot;&lt;&lt;tree[i].sum&lt;&lt;endl;</span></span><br><span class="line">        <span class="keyword">return</span> ;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].r&lt;l || tree[i].l&gt;r)  <span class="keyword">return</span> ;</span><br><span class="line">    push_down(i);</span><br><span class="line">    <span class="keyword">if</span>(tree[i*<span class="number">2</span>].r&gt;=l)  Sqrt(i*<span class="number">2</span>,l,r);</span><br><span class="line">    <span class="keyword">if</span>(tree[i*<span class="number">2</span>+<span class="number">1</span>].l&lt;=r)  Sqrt(i*<span class="number">2</span>+<span class="number">1</span>,l,r);</span><br><span class="line">    tree[i].sum=tree[i*<span class="number">2</span>].sum+tree[i*<span class="number">2</span>+<span class="number">1</span>].sum;</span><br><span class="line">    tree[i].minn=min(tree[i*<span class="number">2</span>].minn,tree[i*<span class="number">2</span>+<span class="number">1</span>].minn);</span><br><span class="line">    tree[i].maxx=max(tree[i*<span class="number">2</span>].maxx,tree[i*<span class="number">2</span>+<span class="number">1</span>].maxx);</span><br><span class="line">    <span class="comment">//cout&lt;&lt;&quot;i&quot;&lt;&lt;i&lt;&lt;&quot; &quot;&lt;&lt;tree[i].sum&lt;&lt;endl;</span></span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">long</span> <span class="keyword">long</span> <span class="title">search</span><span class="params">(<span class="keyword">int</span> i,<span class="keyword">int</span> l,<span class="keyword">int</span> r)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].l&gt;=l &amp;&amp; tree[i].r&lt;=r)</span><br><span class="line">        <span class="keyword">return</span> tree[i].sum;</span><br><span class="line">    <span class="keyword">if</span>(tree[i].r&lt;l || tree[i].l&gt;r)  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    push_down(i);</span><br><span class="line">    <span class="keyword">long</span> <span class="keyword">long</span> s=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span>(tree[i*<span class="number">2</span>].r&gt;=l)  s+=search(i*<span class="number">2</span>,l,r);</span><br><span class="line">    <span class="keyword">if</span>(tree[i*<span class="number">2</span>+<span class="number">1</span>].l&lt;=r)  s+=search(i*<span class="number">2</span>+<span class="number">1</span>,l,r);</span><br><span class="line">    <span class="keyword">return</span> s;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    in(n);</span><br><span class="line">    REP(i,<span class="number">1</span>,n)  in(input[i]);</span><br><span class="line">    build(<span class="number">1</span>,<span class="number">1</span>,n);</span><br><span class="line">    in(m);</span><br><span class="line">    <span class="keyword">int</span> a,b,c;</span><br><span class="line">    REP(i,<span class="number">1</span>,m)&#123;</span><br><span class="line">        in(a);in(b);in(c);</span><br><span class="line">        <span class="keyword">if</span>(a==<span class="number">1</span>)</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;%lld\n&quot;</span>,search(<span class="number">1</span>,b,c));</span><br><span class="line">        <span class="keyword">if</span>(a==<span class="number">2</span>)&#123;</span><br><span class="line">            Sqrt(<span class="number">1</span>,b,c);</span><br><span class="line">            <span class="comment">//for(int i=1;i&lt;=7;i++)</span></span><br><span class="line">            <span class="comment">//    cout&lt;&lt;tree[i].sum&lt;&lt;&quot; &quot;;</span></span><br><span class="line">           <span class="comment">// cout&lt;&lt;endl;</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>]]></content>
    
    
    <summary type="html">仅模板，讲解下次一定</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="模板" scheme="http://blog.aquabet.xyz/tags/%E6%A8%A1%E6%9D%BF/"/>
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>LeetCode百题纪念</title>
    <link href="http://blog.aquabet.xyz/leetcode_100_mark/"/>
    <id>http://blog.aquabet.xyz/leetcode_100_mark/</id>
    <published>2020-12-26T16:00:00.000Z</published>
    <updated>2020-12-26T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;百题突破。真·突破。</p><span id="more"></span><p>&emsp;&emsp;POJ没过百题，Codeforces没过百题，洛谷事实上也算没过百题。今天终于把LeetCode水过了百题。翻了下统计数据，大概过半的AC都在凌晨，过半的WA都在白天。以前晚上是玩手机等12点，登游戏打每日，睡觉。现在是登LeetCode，A掉每日一题，睡觉。</p><p>&emsp;&emsp;自从去年，决定不打ACM之后，就很少进行系统性的算法训练了。刚开始刷LeetCode，还能在一道Easy题上卡三四次提交。后来越来越熟练，逐渐找回了切题手感，经常能在12：30以前睡觉。</p><p>&emsp;&emsp;前百题都是C++提交的，<span class="heimu" title="你知道的太多了">因为C++招的太少了，</span>未来提交的代码，可能就不再会仅限于C++了。</p><p>&emsp;&emsp;可能是作为前OIer的缘故，个人感觉，LeetCode的题普遍比较水。比如 <a href="https://leetcode-cn.com/problems/count-of-range-sum/">327. 区间和的个数</a> ，用线段树可以说是随便切(挖个坑，写题解)。各种标着困难的DP读一遍题就能写转移方程（挖个坑，DP专题）。还有大部分题的数据点都挺弱，随便乱搞贪心暴力都能过。但，不可否认的，在实际工作中，LeetCode的题，提供的思路，远比竞赛中的**玩意有用。LeetCode还能使用几乎所有库<del>，妈妈再也不用担心我不会手写红黑树了</del>。</p><p>&emsp;&emsp;本来重建博客是为了存点题解模板的，因为写完睡觉的习惯，似乎很少有时间能写题解。</p><p>&emsp;&emsp;最近也期末了，<del>刷每日一题的时间都是少女前线&amp;&amp;碧蓝航线给的，</del>等考完期末，<strong>也许</strong>会好好把前面刷过的题，稍微整理下吧。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;&amp;emsp;&amp;emsp;百题突破。真·突破。&lt;/p&gt;</summary>
    
    
    
    <category term="Diary" scheme="http://blog.aquabet.xyz/categories/Diary/"/>
    
    
  </entry>
  
  <entry>
    <title>优先队列+自定义排序</title>
    <link href="http://blog.aquabet.xyz/priority_queues/"/>
    <id>http://blog.aquabet.xyz/priority_queues/</id>
    <published>2020-12-04T16:00:00.000Z</published>
    <updated>2020-12-04T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>自定义比较函数</p><!-- more --><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></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">cmp</span> &#123;</span></span><br><span class="line">    <span class="function"><span class="keyword">bool</span> <span class="title">operator</span> <span class="params">()</span> <span class="params">(node a, node b)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> a.value &lt; b.value;<span class="comment">//按value的小根堆</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>声明一个优先队列</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">priority_queue</span>&lt;node, <span class="built_in">vector</span>&lt;node &gt;, cmp &gt; aPriorityQueue;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">优先队列+自定义排序模板</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="模板" scheme="http://blog.aquabet.xyz/tags/%E6%A8%A1%E6%9D%BF/"/>
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>洗牌算法</title>
    <link href="http://blog.aquabet.xyz/shuffle_cards_algorithm/"/>
    <id>http://blog.aquabet.xyz/shuffle_cards_algorithm/</id>
    <published>2020-12-04T16:00:00.000Z</published>
    <updated>2020-12-04T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>&emsp;&emsp;一个简单的算法 实现打乱arr[]数组<br>&emsp;&emsp;正好做东西用上的</p><!-- more --><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 = n<span class="number">-1</span>; i &gt;= <span class="number">0</span>; i--)</span><br><span class="line">    swap(arr[i],arr[rand()%(i+<span class="number">1</span>)]);<span class="comment">//调换arr[i]和arr[rand(0,i)];</span></span><br></pre></td></tr></table></figure><p>时间复杂度O(n)</p>]]></content>
    
    
    <summary type="html">一个简单的算法 实现打乱arr[]数组</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="模板" scheme="http://blog.aquabet.xyz/tags/%E6%A8%A1%E6%9D%BF/"/>
    
    <category term="奇技淫巧" scheme="http://blog.aquabet.xyz/tags/%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/"/>
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>C++对拍模板</title>
    <link href="http://blog.aquabet.xyz/checkCode/"/>
    <id>http://blog.aquabet.xyz/checkCode/</id>
    <published>2020-09-29T16:00:00.000Z</published>
    <updated>2020-10-19T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>各文件如下：</p><!-- more --><figure class="highlight bat"><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></pre></td><td class="code"><pre><span class="line">@<span class="built_in">echo</span> off</span><br><span class="line">:loop</span><br><span class="line">MakeData.exe #造数据的程序</span><br><span class="line">answer.exe #待对拍文件</span><br><span class="line">baoli.exe #暴力（保证正确的代码）</span><br><span class="line">fc answer.out baoli.out #输出文件的文件名</span><br><span class="line"><span class="keyword">if</span> <span class="keyword">not</span>  <span class="keyword">errorlevel</span> <span class="number">1</span> <span class="keyword">goto</span> loop</span><br><span class="line"><span class="built_in">pause</span></span><br><span class="line">:end</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">  MakeData.cpp，添加这两句话 并用rand()初始化数据</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    freopen(<span class="string">&quot;data.in&quot;</span>,<span class="string">&quot;w&quot;</span>,<span class="built_in">stdout</span>);</span><br><span class="line">    srand(time(<span class="literal">NULL</span>));</span><br><span class="line">    ......<span class="comment">//生成数据并cout</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">  待测试文件</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    freopen(<span class="string">&quot;data.in&quot;</span>,<span class="string">&quot;r&quot;</span>,<span class="built_in">stdin</span>);</span><br><span class="line">    freopen(<span class="string">&quot;answer.out&quot;</span>,<span class="string">&quot;w&quot;</span>,<span class="built_in">stdout</span>);</span><br><span class="line">    ......<span class="comment">//执行程序并cout</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">  确认正确的文件/暴力文件</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    freopen(<span class="string">&quot;data.in&quot;</span>,<span class="string">&quot;r&quot;</span>,<span class="built_in">stdin</span>);</span><br><span class="line">    freopen(<span class="string">&quot;baoli.out&quot;</span>,<span class="string">&quot;w&quot;</span>,<span class="built_in">stdout</span>);</span><br><span class="line">    ......<span class="comment">//执行程序并cout</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>用如Dev-cpp等软件将MakeData.cpp，answer.cpp，baoli.cpp分别编译并生产.exe文件，运行Compare.bat，如果遇到答案不同时，Compare.bat将自动停下来并输出有问题的数据。</p>]]></content>
    
    
    <summary type="html">对拍模板</summary>
    
    
    
    <category term="算法" scheme="http://blog.aquabet.xyz/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="模板" scheme="http://blog.aquabet.xyz/tags/%E6%A8%A1%E6%9D%BF/"/>
    
    <category term="奇技淫巧" scheme="http://blog.aquabet.xyz/tags/%E5%A5%87%E6%8A%80%E6%B7%AB%E5%B7%A7/"/>
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="Windows" scheme="http://blog.aquabet.xyz/tags/Windows/"/>
    
  </entry>
  
  <entry>
    <title>Visual Studio Code C++ gdb 断点调试 配置指南</title>
    <link href="http://blog.aquabet.xyz/vscode_gdb/"/>
    <id>http://blog.aquabet.xyz/vscode_gdb/</id>
    <published>2019-11-26T16:00:00.000Z</published>
    <updated>2020-10-19T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>在Workspace下的.vscode目录下新建两个文件，分别为launch.json，task.json。</p><span id="more"></span><figure class="highlight json"><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></pre></td><td class="code"><pre><span class="line">&#123;<span class="comment">//launch.json</span></span><br><span class="line">    <span class="attr">&quot;version&quot;</span>: <span class="string">&quot;0.2.0&quot;</span>,</span><br><span class="line">    <span class="attr">&quot;configurations&quot;</span>: [</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="attr">&quot;name&quot;</span>: <span class="string">&quot;(gdb) Launch&quot;</span>,</span><br><span class="line">            <span class="attr">&quot;type&quot;</span>: <span class="string">&quot;cppdbg&quot;</span>,</span><br><span class="line">            <span class="attr">&quot;request&quot;</span>: <span class="string">&quot;launch&quot;</span>,</span><br><span class="line">            <span class="attr">&quot;targetArchitecture&quot;</span>: <span class="string">&quot;x86&quot;</span></span><br><span class="line">            <span class="string">&quot;program&quot;</span>: <span class="string">&quot;$&#123;workspaceRoot&#125;\\$&#123;fileBasenameNoExtension&#125;.exe&quot;</span></span><br><span class="line">            <span class="string">&quot;miDebuggerPath&quot;</span>:<span class="string">&quot;C:\\mingw\\bin\\gdb.exe&quot;</span>,  <span class="comment">//此处修改为自己的目录</span></span><br><span class="line">            <span class="attr">&quot;args&quot;</span>: [],</span><br><span class="line">            <span class="attr">&quot;stopAtEntry&quot;</span>: <span class="literal">false</span>,</span><br><span class="line">            <span class="attr">&quot;cwd&quot;</span>: <span class="string">&quot;$&#123;workspaceRoot&#125;&quot;</span>,</span><br><span class="line">            <span class="attr">&quot;externalConsole&quot;</span>: <span class="literal">true</span>,</span><br><span class="line">            <span class="attr">&quot;preLaunchTask&quot;</span>: <span class="string">&quot;g++&quot;</span></span><br><span class="line">            &#125;</span><br><span class="line">    ]</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure><figure class="highlight json"><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></pre></td><td class="code"><pre><span class="line">&#123;<span class="comment">//task.json</span></span><br><span class="line">    <span class="attr">&quot;version&quot;</span>:<span class="string">&quot;2.0.0&quot;</span>,</span><br><span class="line">    <span class="attr">&quot;command&quot;</span>: <span class="string">&quot;g++&quot;</span>,</span><br><span class="line">    <span class="attr">&quot;args&quot;</span>: [<span class="string">&quot;-g&quot;</span>,<span class="string">&quot;-std=c++11&quot;</span>,<span class="string">&quot;$&#123;file&#125;&quot;</span>,<span class="string">&quot;-o&quot;</span>,<span class="string">&quot;$&#123;workspaceRoot&#125;\\$&#123;fileBasenameNoExtension&#125;.exe&quot;</span>],</span><br><span class="line">    <span class="attr">&quot;problemMatcher&quot;</span>: &#123;</span><br><span class="line">        <span class="attr">&quot;owner&quot;</span>: <span class="string">&quot;cpp&quot;</span>,</span><br><span class="line">        <span class="attr">&quot;fileLocation&quot;</span>: [<span class="string">&quot;relative&quot;</span>, <span class="string">&quot;$&#123;workspaceRoot&#125;&quot;</span>],</span><br><span class="line">        <span class="attr">&quot;pattern&quot;</span>: &#123;</span><br><span class="line">            <span class="attr">&quot;regexp&quot;</span>: <span class="string">&quot;^(.*):(\\d+):(\\d+):\\s+(warning|error):\\s+(.*)$&quot;</span>,</span><br><span class="line">            <span class="attr">&quot;file&quot;</span>: <span class="number">1</span>,</span><br><span class="line">            <span class="attr">&quot;line&quot;</span>: <span class="number">2</span>,</span><br><span class="line">            <span class="attr">&quot;column&quot;</span>: <span class="number">3</span>,</span><br><span class="line">            <span class="attr">&quot;severity&quot;</span>: <span class="number">4</span>,</span><br><span class="line">            <span class="attr">&quot;message&quot;</span>: <span class="number">5</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>]]></content>
    
    
    <summary type="html">&lt;p&gt;在Workspace下的.vscode目录下新建两个文件，分别为launch.json，task.json。&lt;/p&gt;</summary>
    
    
    
    <category term="开发环境" scheme="http://blog.aquabet.xyz/categories/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="VSCode" scheme="http://blog.aquabet.xyz/tags/VSCode/"/>
    
  </entry>
  
  <entry>
    <title>Visual Studio Code Windows10 C++ 配置指南</title>
    <link href="http://blog.aquabet.xyz/vscode_c++/"/>
    <id>http://blog.aquabet.xyz/vscode_c++/</id>
    <published>2019-10-27T16:00:00.000Z</published>
    <updated>2020-10-19T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<p>注意：因为不同电脑系统原因，所有操作建议在<strong>管理员</strong>模式下运行</p><span id="more"></span><h2 id="下载所需要的文件"><a href="#下载所需要的文件" class="headerlink" title="下载所需要的文件"></a>下载所需要的文件</h2><p>首先进入以下网址下载<a href="https://code.visualstudio.com/">Visual Studio Code</a></p><p>进入以下网址下载<a href="https://osdn.net/projects/mingw/releases/">MinGW</a></p><h2 id="安装并配置MinGW"><a href="#安装并配置MinGW" class="headerlink" title="安装并配置MinGW"></a>安装并配置MinGW</h2><h3 id="安装MinGW"><a href="#安装MinGW" class="headerlink" title="安装MinGW"></a>安装MinGW</h3><p>打开MinGW，左侧目录中，进入<code>Basic Setup</code>，点击<code>mingw32-gcc-g++-bin</code>前的小方块，点击<code>Mark for Installation</code>，再点左上角的<code>Installation</code>，再点<code>Apply Changes</code>，等待安装完成。关闭。</p><p>如果需要进行gdb调试，还需要在<code>All Packages</code>里找到<code>mingw32-gdb-bin</code>，安装后才能进行单步调试。</p><h3 id="配置环境变量"><a href="#配置环境变量" class="headerlink" title="配置环境变量"></a>配置环境变量</h3><p>点击Windows系统左下角的搜索 -&gt; 输入”环境”两个字 -&gt; “编辑系统环境变量” -&gt; 高级 -&gt; 环境变量。在系统变量中找到Path，双击进入，新建，浏览，将<code>MinGW安装目录\MinGW\bin</code>添加进去，比如我的是<code>&quot;C:\MinGW\bin&quot;</code></p><h2 id="配置Visual-Studio-Code"><a href="#配置Visual-Studio-Code" class="headerlink" title="配置Visual Studio Code"></a>配置Visual Studio Code</h2><h3 id="安装必要扩展"><a href="#安装必要扩展" class="headerlink" title="安装必要扩展"></a>安装必要扩展</h3><p>打开Visual Studio Code，在左侧边栏中找到扩展，搜索并安装C/C++, Code Runner。<br><code>ctrl+shift+P</code>打开Command Palette,运行<code>C/Cpp: Edit configurations</code>生成<code>c_cpp_properties.json</code>。编译器路径选<code>MinGW安装目录\MinGW\bin\g++.exe</code>。</p><h2 id="测试能否正常使用"><a href="#测试能否正常使用" class="headerlink" title="测试能否正常使用"></a>测试能否正常使用</h2><p>随便打开一个c/cpp文件或者新建一个文件，复制以下代码</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">mian</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="built_in">cout</span>&lt;&lt;<span class="string">&quot;Hello World!&quot;</span>&lt;&lt;<span class="built_in">endl</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>按Ctrl+S保存后，按右上角的三角形，即可开始编译运行。</p><h2 id="一些可选的可选推荐"><a href="#一些可选的可选推荐" class="headerlink" title="一些可选的可选推荐"></a>一些可选的可选推荐</h2><h3 id="Code-Runner设置"><a href="#Code-Runner设置" class="headerlink" title="Code Runner设置"></a>Code Runner设置</h3><p>按<code>Ctrl+,</code>，进入设置，搜索<code>Code Runner</code>。</p><p>勾选<code>Run In Terminal</code>，可以使代码在VSCode自带的终端中运行，不弹出新的黑框框。</p><p>勾选<code>Save File Before Run</code>，可以在运行时自动保存。</p><h3 id="断点调试设置"><a href="#断点调试设置" class="headerlink" title="断点调试设置"></a>断点调试设置</h3><p><a href="https://aquabet.xyz/2020/10/27/Visual%20Studio%20Code%20C++%20gdb%20%E6%96%AD%E7%82%B9%E8%B0%83%E8%AF%95%20%E9%85%8D%E7%BD%AE%E6%8C%87%E5%8D%97/">详见此文</a></p><h3 id="其他推荐使用的拓展插件"><a href="#其他推荐使用的拓展插件" class="headerlink" title="其他推荐使用的拓展插件"></a>其他推荐使用的拓展插件</h3><p>下次新开一篇，下次一定。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;注意：因为不同电脑系统原因，所有操作建议在&lt;strong&gt;管理员&lt;/strong&gt;模式下运行&lt;/p&gt;</summary>
    
    
    
    <category term="开发环境" scheme="http://blog.aquabet.xyz/categories/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="C++" scheme="http://blog.aquabet.xyz/tags/C/"/>
    
    <category term="Windows" scheme="http://blog.aquabet.xyz/tags/Windows/"/>
    
    <category term="VSCode" scheme="http://blog.aquabet.xyz/tags/VSCode/"/>
    
  </entry>
  
  <entry>
    <title>Visual Studio Code中配置Github</title>
    <link href="http://blog.aquabet.xyz/vscode_github/"/>
    <id>http://blog.aquabet.xyz/vscode_github/</id>
    <published>2019-10-21T16:00:00.000Z</published>
    <updated>2020-10-29T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="安装Git"><a href="#安装Git" class="headerlink" title="安装Git"></a>安装Git</h2><p>百度或者进入<a href="https://git-scm.com/">以下网站</a><br>下载并安装git</p><span id="more"></span><h2 id="配置GitHub"><a href="#配置GitHub" class="headerlink" title="配置GitHub"></a>配置GitHub</h2><p>打开GitHub首页<br>点击左侧New新建一个空repository<br>确认后显示SSH地址 形如<code>git@github.com:xxxx/xxxx.git</code><br>在仓库中点击绿色code 选择SSH 亦可查询自己的SSH地址</p><h2 id="创建Git本地文件夹"><a href="#创建Git本地文件夹" class="headerlink" title="创建Git本地文件夹"></a>创建Git本地文件夹</h2><p>在目标文件夹中 点击右键 选择Git Bash Here<br>依次输入如下代码</p><figure class="highlight plain"><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></pre></td><td class="code"><pre><span class="line">git init</span><br><span class="line">git config user.name &#39;你的名字&#39; -g    #你的名字替换为你的GitHub ID</span><br><span class="line">git config user.email &#39;你的邮箱&#39; -g    #你的邮箱为你的Github注册邮箱</span><br><span class="line">git add .    #意为选择所有文件</span><br><span class="line">git commit -m &quot;update&quot;    #添加更新说明</span><br><span class="line">git remote add origin git@github.com:xxxx&#x2F;xxxx.git    #替换为你的SSH地址</span><br><span class="line">git push -u origin master    #推送到master分支</span><br></pre></td></tr></table></figure><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><p>如果在输出最后一行报错<code>fatal:Could not read from remote repository</code><br>则需要设置<code>SSH key</code><br>右上角个人图标—Settings—左边栏SSH and GPG keys—New SSH key<br>title随便取<br>在Git Bash中执行以下命令<br><code>ssh-keygen -t rsa -b 4096 -C &quot;你的邮箱&quot;</code><br>一路回车 直到一堆泡泡出现<br>再输入<br><code>cat ~/.ssh/id_rsa.pub</code><br>得到一串字符串<br>将其复制到新建SSH时的密码栏 保存<br>再次执行<br><code>git push -u origin master</code> 就能正常执行推送服务了</p>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;安装Git&quot;&gt;&lt;a href=&quot;#安装Git&quot; class=&quot;headerlink&quot; title=&quot;安装Git&quot;&gt;&lt;/a&gt;安装Git&lt;/h2&gt;&lt;p&gt;百度或者进入&lt;a href=&quot;https://git-scm.com/&quot;&gt;以下网站&lt;/a&gt;&lt;br&gt;下载并安装git&lt;/p&gt;</summary>
    
    
    
    <category term="开发环境" scheme="http://blog.aquabet.xyz/categories/%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/"/>
    
    
    <category term="VSCode" scheme="http://blog.aquabet.xyz/tags/VSCode/"/>
    
    <category term="Github" scheme="http://blog.aquabet.xyz/tags/Github/"/>
    
  </entry>
  
</feed>
