https://fidel.js.org
Fidel's Lab
我们有缘再见。
https://fidel.js.org/images/favicon.ico
Fidel
2021-09-13T04:00:00.000Z
https://fidel.js.org/2021/09/13/cpp14-guide/
从 C++98 到 C++14 —— OIer 升级指南
<p>2021 年 9 月 1 日,<span class="exturl" data-url="aHR0cHM6Ly93d3cubm9pLmNuL3h3LzIwMjEtMDktMDEvNzM1NzI5LnNodG1s">NOI 赛事终于对 C++ 语言支持了 C++14 标准</span>。</p>
<p>由于 C++14 相比于 C++98 新增了不少内容,而大部分 OIer 此前的练习、比赛都基于 C++98 标准,为帮助大家快速上手 C++14 的重要好用的特性,这里给大家对 C++14 的新增内容作简单梳理。</p>
<span id="more"></span>
<div class="note info">
<p>本文<strong>仅针对 OI</strong> 介绍 C++14 <strong>相对于 C++98</strong> 的新增内容,因此部分 C++11 新增的内容也会在本文中出现。</p>
<p>本文所述「等价于」仅表示在大多数情况下运行代码产生的效果相同,<strong>并不表示在具体实现和汇编层面完全等价</strong>。</p>
</div>
<h1 id="启用-c14"><a class="anchor" href="#启用-c14">#</a> 启用 C++14</h1>
<p>确保 GCC 版本为 <code>5</code> 或以上,或 Clang 版本为 <code>3.4</code> 或以上。</p>
<details class="info"><summary>更多关于编译器支持 C++14 的版本的信息</summary><div>
<p><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwLzE0">C++14 - cppreference.com</span></p>
</div></details>
<p><strong>在编译命令中加入以下选项指定 C++ 标准</strong>:</p>
<figure class="highlight bash"><figcaption data-lang="bash"></figcaption><table><tr><td data-num="1"></td><td><pre>-std<span class="token operator">=</span>c++14</pre></td></tr></table></figure><h1 id="新特性"><a class="anchor" href="#新特性">#</a> 新特性</h1>
<h2 id="auto"><a class="anchor" href="#auto">#</a> <code>auto</code></h2>
<p>顾名思义,根据赋值表达式自动指定类型。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">114514</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">auto</span> b <span class="token operator">=</span> a <span class="token operator">+</span> <span class="token number">1919810</span><span class="token punctuation">;</span> <span class="token comment">// auto -> int</span></pre></td></tr></table></figure><p>等价于:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">114514</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">int</span> b <span class="token operator">=</span> a <span class="token operator">+</span> <span class="token number">1919810</span><span class="token punctuation">;</span></pre></td></tr></table></figure><details class="info"><summary>参考资料</summary><div>
<ul>
<li><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2F1dG8=">占位类型说明符 (C++11 起) - cppreference.com</span></li>
</ul>
</div></details>
<h2 id="decltype"><a class="anchor" href="#decltype">#</a> <code>decltype</code></h2>
<p>顾名思义,推断传入的参数的类型。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">114514</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">decltype</span><span class="token punctuation">(</span>a<span class="token punctuation">)</span> b <span class="token operator">=</span> <span class="token number">1919810</span><span class="token punctuation">;</span> <span class="token comment">// int</span></pre></td></tr></table></figure><details class="info"><summary>参考资料</summary><div>
<ul>
<li><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2RlY2x0eXBl">decltype 说明符 - cppreference.com</span></li>
</ul>
</div></details>
<h2 id="范围-for-循环"><a class="anchor" href="#范围-for-循环">#</a> 范围 <code>for</code> 循环</h2>
<p>从 C++11 起,可以使用范围 <code>for</code> 循环<strong>遍历数组中的每一个元素</strong>:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> a<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> x <span class="token operator">:</span> a<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token function">func</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>等价于:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> arr<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> N<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">int</span> x <span class="token operator">=</span> arr<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// copy</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token function">func</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>与 <code>auto</code> 结合起来的等价写法:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> arr<span class="token punctuation">[</span>N<span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> x <span class="token operator">:</span> arr<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token function">func</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p><span class="label warning">注意</span> 这里的 <code>x</code> 是 <code>arr[i]</code> 的<strong>拷贝</strong>,对 <code>x</code> 进行操作<strong>不会</strong>影响 <code>arr[i]</code> 的值。</p>
<p>使用 <code>auto</code> 和范围 <code>for</code> 循环,可以使原本复杂的迭代器遍历变得十分简洁:</p>
<p>(以下代码以 <code>std::vector</code> 为例)</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> arr<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> x <span class="token operator">:</span> arr<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token function">func</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>等价于原本的一大坨:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span><span class="token double-colon punctuation">::</span>iterator i <span class="token operator">=</span> arr<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">!=</span> arr<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">int</span> x <span class="token operator">=</span> <span class="token operator">*</span>i<span class="token punctuation">;</span> <span class="token comment">// copy</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token function">func</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p><span class="label warning">注意</span> 这里的 <code>x</code> 是 <code>arr</code> 的<strong>拷贝</strong>,对 <code>x</code> 进行操作<strong>不会</strong>影响 <code>arr</code> 的值。</p>
<p>如果想<strong>修改</strong>遍历的内容,可以使用 <code>auto&</code> :</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> arr<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> <span class="token operator">&</span>x <span class="token operator">:</span> arr<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token function">func</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>等价于:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span><span class="token double-colon punctuation">::</span>iterator i <span class="token operator">=</span> arr<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">!=</span> arr<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token function">func</span><span class="token punctuation">(</span><span class="token operator">*</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p><span class="label warning">注意</span> 这里的 <code>x</code> 是 <code>arr</code> 的<strong>引用</strong>,对 <code>x</code> 进行操作<strong>会</strong>影响 <code>arr</code> 的值。</p>
<div class="note warning">
<p>使用 <code>std::vector<bool></code> 时,慎用 <code>auto</code> ,因为 <code>std::vector<bool></code> 采用了特殊的实现方法。<span class="exturl" data-url="aHR0cHM6Ly96aHVhbmxhbi56aGlodS5jb20vcC8yNTE0ODU5Mg==">详见下面的参考资料</span>。</p>
</div>
<details class="info"><summary>参考资料</summary><div>
<ul>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL3JhbmdlLWZvcg==">基于范围的 for 循环 (C++11 起) - cppreference.com</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly96aHVhbmxhbi56aGlodS5jb20vcC8yNTE0ODU5Mg==">[Brief Talk] auto, auto&, const auto & 以及其它形式的 auto 变种在 for-range loop 的选择 - 知乎</span></p>
</li>
</ul>
</div></details>
<h2 id="模板相关"><a class="anchor" href="#模板相关">#</a> 模板相关</h2>
<h3 id="变量模板"><a class="anchor" href="#变量模板">#</a> 变量模板</h3>
<p>从 C++14 起,可以对变量使用模板。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">template</span> <span class="token operator"><</span> 形参列表 <span class="token operator">></span> 变量声明</pre></td></tr></table></figure><p>引用 <span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL3ZhcmlhYmxlX3RlbXBsYXRl">cppreference.com 中的例子</span>:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">template</span> <span class="token operator"><</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token operator">></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">constexpr</span> T pi <span class="token operator">=</span> <span class="token function">T</span><span class="token punctuation">(</span><span class="token number">3.1415926535897932385L</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 变量模板</span></pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token keyword">template</span> <span class="token operator"><</span><span class="token keyword">class</span> <span class="token class-name">T</span><span class="token operator">></span></pre></td></tr><tr><td data-num="5"></td><td><pre>T <span class="token function">circular_area</span><span class="token punctuation">(</span>T r<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// 函数模板</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">return</span> pi<span class="token operator"><</span>T<span class="token operator">></span> <span class="token operator">*</span> r <span class="token operator">*</span> r<span class="token punctuation">;</span> <span class="token comment">//pi<T> 是变量模板实例化</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><h3 id="可变模板形参"><a class="anchor" href="#可变模板形参">#</a> 可变模板形参</h3>
<p>从 C++11 起,允许模板中传入可变个数的参数。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">template</span> <span class="token operator"><</span><span class="token keyword">typename</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> T<span class="token operator">></span></pre></td></tr></table></figure><p>现在,你可以使用可变模板形参实现 <span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Rpc2N1c3MvMzE5NzUx">C++98 做不到的</span><strong>输出多个变量</strong>和<strong>自适应变量类型</strong>的 Debug 输出:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name">DEBUG</span></span></pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token keyword">void</span> <span class="token function">debug_out</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> std<span class="token double-colon punctuation">::</span>cerr <span class="token operator"><<</span> <span class="token char">'\n'</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token keyword">template</span> <span class="token operator"><</span><span class="token keyword">typename</span> <span class="token class-name">Head</span><span class="token operator">></span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token keyword">void</span> <span class="token function">debug_out</span><span class="token punctuation">(</span>Head H<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="9"></td><td><pre> std<span class="token double-colon punctuation">::</span>cerr <span class="token operator"><<</span> H <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="11"></td><td><pre></pre></td></tr><tr><td data-num="12"></td><td><pre><span class="token keyword">template</span> <span class="token operator"><</span><span class="token keyword">typename</span> <span class="token class-name">Head</span><span class="token punctuation">,</span> <span class="token keyword">typename</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> Tail<span class="token operator">></span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token keyword">void</span> <span class="token function">debug_out</span><span class="token punctuation">(</span>Head H<span class="token punctuation">,</span> Tail<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span> T<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="14"></td><td><pre> std<span class="token double-colon punctuation">::</span>cerr <span class="token operator"><<</span> H <span class="token operator"><<</span> <span class="token string">", "</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token function">debug_out</span><span class="token punctuation">(</span>T<span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="17"></td><td><pre></pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifdef</span> <span class="token expression">DEBUG</span></span></pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">debug</span><span class="token expression"><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span> std<span class="token double-colon punctuation">::</span>cerr <span class="token operator"><<</span> </span><span class="token string">"["</span> <span class="token expression">#__VA_ARGS__ </span><span class="token string">"]: "</span><span class="token expression"><span class="token punctuation">,</span> <span class="token function">debug_out</span><span class="token punctuation">(</span>__VA_ARGS__<span class="token punctuation">)</span></span></span></pre></td></tr><tr><td data-num="20"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">else</span></span></pre></td></tr><tr><td data-num="21"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">define</span> <span class="token macro-name function">debug</span><span class="token expression"><span class="token punctuation">(</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">.</span><span class="token punctuation">)</span></span></span></pre></td></tr><tr><td data-num="22"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span></pre></td></tr></table></figure><div class="note info">
<p>改写自:<span class="exturl" data-url="aHR0cHM6Ly9odWFydW9qaS5naXRodWIuaW8vMjAyMS8wNi8wNS8lRTMlODAlOTAlRTYlOUQlODIlRTklQTElQjklRTMlODAlOTElRTclQkMlQkElRTclOUMlODElRTYlQkElOTAv">【杂项】缺省源 - 滑蒻稽的博客</span></p>
</div>
<details class="info"><summary>参考资料</summary><div>
<ul>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL3ZhcmlhYmxlX3RlbXBsYXRl">变量模板 (C++14 起) - cppreference.com</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL3RlbXBsYXRlX3BhcmFtZXRlcnM=">模板形参与模板实参 - cppreference.com</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly9odWFydW9qaS5naXRodWIuaW8vMjAyMS8wNi8wNS8lRTMlODAlOTAlRTYlOUQlODIlRTklQTElQjklRTMlODAlOTElRTclQkMlQkElRTclOUMlODElRTYlQkElOTAv">【杂项】缺省源 - 滑蒻稽的博客</span></p>
</li>
</ul>
</div></details>
<h2 id="lambda-表达式"><a class="anchor" href="#lambda-表达式">#</a> Lambda 表达式</h2>
<p>Lambda 表达式,换种说法就是<strong>行内 (inline) 匿名函数</strong>。(个人理解)</p>
<p>比如以下的 Lambda 表达式写法:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token function">sort</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> arr<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> a <span class="token operator">></span> b<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// desending sort</span></pre></td></tr></table></figure><p>等价于:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">bool</span> <span class="token function">cmp</span><span class="token punctuation">(</span><span class="token keyword">int</span> a<span class="token punctuation">,</span> <span class="token keyword">int</span> b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> a <span class="token operator">></span> b<span class="token punctuation">;</span> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token function">sort</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> arr<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> cmp<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>与 <code>auto</code> 结合起来:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token function">sort</span><span class="token punctuation">(</span>arr<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> arr<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">auto</span> a<span class="token punctuation">,</span> <span class="token keyword">auto</span> b<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> a <span class="token operator">></span> b<span class="token punctuation">;</span> <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// desending sort</span></pre></td></tr></table></figure><p>Lambda 表达式的完整语法结构为: <code>[ 捕获 ] ( 形参 ) lambda 说明符 约束 (可选) { 函数体 }</code></p>
<p>再举个例子:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> lim <span class="token operator">=</span> <span class="token number">114514</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">auto</span> function <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">[</span>lim<span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">)</span> <span class="token operator">-></span> <span class="token keyword">bool</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">></span> lim<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> x <span class="token operator">=</span> lim<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">return</span> <span class="token boolean">false</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">return</span> <span class="token boolean">true</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token punctuation">}</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token function">function</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p><code>[ ]</code> 中的捕获参数列表允许局部变量在函数中调用。</p>
<p><code>-></code> 指定了函数的返回类型。</p>
<p>更多关于 Lambda 的用法详见下面的参考资料。</p>
<details class="info"><summary>参考资料</summary><div>
<ul>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2xhbWJkYQ==">Lambda 表达式 (C++11 起) - cppreference.com</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0ExMTM4NDc0MzgyL2FydGljbGUvZGV0YWlscy8xMTExNDk3OTI=">C ++ Lambda 表达式详解 - CSDN</span></p>
</li>
</ul>
</div></details>
<h2 id="二进制字面量-数位分隔符"><a class="anchor" href="#二进制字面量-数位分隔符">#</a> 二进制字面量 & 数位分隔符</h2>
<p>从 C++14 起,可以在代码中直接书写二进制常量。</p>
<p>从 C++14 起,可以以单引号 <code>'</code> 表示数位分隔符,会在编译时忽略。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> var <span class="token operator">=</span> <span class="token number">0b11011111101010010</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">int</span> var <span class="token operator">=</span> <span class="token number">0b0001'1011'1111'0101'0010</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">int</span> var <span class="token operator">=</span> <span class="token number">114'514</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>等价于:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> var <span class="token operator">=</span> <span class="token number">114514</span><span class="token punctuation">;</span></pre></td></tr></table></figure><details class="info"><summary>参考资料</summary><div>
<ul>
<li><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2xhbmd1YWdlL2ludGVnZXJfbGl0ZXJhbA==">整数字面量 - cppreference.com</span></li>
</ul>
</div></details>
<h1 id="新-stl-库功能特性"><a class="anchor" href="#新-stl-库功能特性">#</a> 新 STL 库功能特性</h1>
<h2 id="unordered_set-unordered_map"><a class="anchor" href="#unordered_set-unordered_map">#</a> <code><unordered_set></code> & <code><unordered_map></code></h2>
<p><strong> <code><set></code> </strong> 和 <strong> <code><map></code> </strong> 的更快的 Hash 实现,用法与 <code><set></code> 和 <code><map></code> 相同。</p>
<h2 id="regex"><a class="anchor" href="#regex">#</a> <code><regex></code></h2>
<p><strong>正则表达式 (Regular Expression)</strong>,是一种用于在字符串中匹配模式的微型语言,可实现对字符串的<strong>匹配</strong>、<strong>搜索</strong>、<strong>分词</strong>和<strong>替换</strong>操作。字符串处理神器。</p>
<p>正则表达式的<strong>时间复杂度</strong>取决于表达式的复杂度,<a href="https://stackoverflow.com/questions/5892115/whats-the-time-complexity-of-average-regex-algorithms">在<strong>平均情况下</strong>正则表达式的时间复杂度为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span></a>。</p>
<p>如果读者还不了解正则表达式,建议先在<span class="exturl" data-url="aHR0cHM6Ly93d3cucnVub29iLmNvbS9yZWdleHAvcmVnZXhwLXN5bnRheC5odG1s">这里</span>学习一下。</p>
<h3 id="正则语法"><a class="anchor" href="#正则语法">#</a> 正则语法</h3>
<p><code>std::regex</code> 默认使用 ECMAScript 语法:</p>
<table>
<thead>
<tr>
<th style="text-align:left">符号</th>
<th style="text-align:left">释义</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left"><code>^</code></td>
<td style="text-align:left">匹配行的开头</td>
</tr>
<tr>
<td style="text-align:left"><code>$</code></td>
<td style="text-align:left">匹配行的结尾</td>
</tr>
<tr>
<td style="text-align:left"><code>.</code></td>
<td style="text-align:left">匹配任意单个字符</td>
</tr>
<tr>
<td style="text-align:left"><code>[…]</code></td>
<td style="text-align:left">匹配 <code>[]</code> 中的任意一个字符</td>
</tr>
<tr>
<td style="text-align:left"><strong> <code>(…)</code> </strong></td>
<td style="text-align:left"><strong>设定分组</strong></td>
</tr>
<tr>
<td style="text-align:left"><code>\</code></td>
<td style="text-align:left">转义字符</td>
</tr>
<tr>
<td style="text-align:left"><code>\d</code></td>
<td style="text-align:left">匹配数字 <code>[0-9]</code></td>
</tr>
<tr>
<td style="text-align:left"><code>\D</code></td>
<td style="text-align:left"><code>\d</code> 取反</td>
</tr>
<tr>
<td style="text-align:left"><code>\w</code></td>
<td style="text-align:left">匹配字母 <code>[a-z]</code> ,数字,下划线</td>
</tr>
<tr>
<td style="text-align:left"><code>\W</code></td>
<td style="text-align:left"><code>\w</code> 取反</td>
</tr>
<tr>
<td style="text-align:left"><code>\s</code></td>
<td style="text-align:left">匹配空格</td>
</tr>
<tr>
<td style="text-align:left"><code>\S</code></td>
<td style="text-align:left"><code>\s</code> 取反</td>
</tr>
<tr>
<td style="text-align:left"><code>+</code></td>
<td style="text-align:left">前面的元素重复 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 次或多次</td>
</tr>
<tr>
<td style="text-align:left"><code>*</code></td>
<td style="text-align:left">前面的元素重复任意次</td>
</tr>
<tr>
<td style="text-align:left"><code>?</code></td>
<td style="text-align:left">前面的元素重复 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span> 次或 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 次</td>
</tr>
<tr>
<td style="text-align:left"><code>{n}</code></td>
<td style="text-align:left">前面的元素重复 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 次</td>
</tr>
<tr>
<td style="text-align:left"><code>{n,}</code></td>
<td style="text-align:left">前面的元素重复至少 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 次</td>
</tr>
<tr>
<td style="text-align:left"><code>{n,m}</code></td>
<td style="text-align:left">前面的元素重复至少 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 次,至多 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">m</span></span></span></span> 次</td>
</tr>
<tr>
<td style="text-align:left"><code>|</code></td>
<td style="text-align:left">逻辑或</td>
</tr>
</tbody>
</table>
<p><span class="label warning">注意</span> 在 C++ 中书写正则表达式时,需要以 2 个反斜杠 <code>\\</code> 代替<strong>所有</strong>转义字符的单个反斜杠 <code>\</code> 。</p>
<div class="note info">
<p>更多正则表达式的语法详见<span class="exturl" data-url="aHR0cHM6Ly93d3cucnVub29iLmNvbS9yZWdleHAvcmVnZXhwLXN5bnRheC5odG1s">参考资料</span>。</p>
</div>
<h3 id="匹配-stdregex_match"><a class="anchor" href="#匹配-stdregex_match">#</a> 匹配 ( <code>std::regex_match</code> )</h3>
<p>传入 2 个参数:<strong>待匹配字符串</strong>和<strong>模式字符串 ( <code>std::regex</code> )</strong>。当待匹配字符串与模式字符串<strong>完全对应</strong>时,则返回 <code>true</code> ,否则返回 <code>false</code> 。</p>
<p>以下例子使用 <code>regex_match</code> 来匹配 XML 格式(或是 HTML 格式)的字符串。其中, <code>"<.*>.*</.*>"</code> 为模式字符串。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span>regex <span class="token function">pattern</span><span class="token punctuation">(</span><span class="token string">"<.*>.*</.*>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">bool</span> ret <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">regex_match</span><span class="token punctuation">(</span><span class="token string">"<html>value</html>"</span><span class="token punctuation">,</span> pattern<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// true</span></pre></td></tr><tr><td data-num="3"></td><td><pre>ret <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">regex_match</span><span class="token punctuation">(</span><span class="token string">"<xml>value<xml>"</span><span class="token punctuation">,</span> pattern<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// false</span></pre></td></tr></table></figure><h3 id="搜索-stdregex_search"><a class="anchor" href="#搜索-stdregex_search">#</a> 搜索 ( <code>std::regex_search</code> )</h3>
<p>传入 3 个参数:<strong>待匹配字符串</strong>、<strong>用于储存匹配结果的字符串</strong> 和<strong>模式字符串 ( <code>std::regex</code> )</strong>。当模式字符串在待匹配字符串中能匹配<strong>一次</strong>时,则返回 <code>true</code> ,否则返回 <code>false</code> 。<strong>用于储存匹配结果的字符串 ( <code>std::cmatch</code> )</strong> 中会存入匹配的子串。</p>
<p>其中,用于储存匹配结果的字符串的常用类型为 <code>std::cmatch</code> 和 <code>std::smatch</code> ,分别对应 C 风格字符串 <code>char*</code> 和 <code>std::string</code> 。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span>regex <span class="token function">pattern</span><span class="token punctuation">(</span><span class="token string">"<(.*)>(.*)</(\\1)>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre>std<span class="token double-colon punctuation">::</span>cmatch m<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">auto</span> ret <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">regex_search</span><span class="token punctuation">(</span><span class="token string">"begin<xml>value</xml>end"</span><span class="token punctuation">,</span> m<span class="token punctuation">,</span> pattern<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>在以上的示例中,用于储存匹配结果的字符串 <code>m</code> 有以下调用方法:</p>
<ul>
<li>
<p><code>m.str()</code></p>
<ul>
<li>
<p><code>m.str()</code> ,等价于 <code>m.str(0)</code> ,返回匹配的完整字符串。在上述例子中,返回 <code>"<xml>value</xml>"</code> 。</p>
</li>
<li>
<p><code>m.str(n)</code> ,返回匹配的字符串中的第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个<strong>元素</strong>(从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 开始),<strong>以模式串中的括号 <code>()</code> 划分</strong>。在上述例子中, <code>m.str(1)</code> 返回 <code>"xml"</code> , <code>m.str(2)</code> 返回 <code>"value"</code> , <code>m.str(3)</code> 返回 <code>"xml"</code> 。</p>
</li>
</ul>
</li>
<li>
<p><code>m.size()</code></p>
<p>返回匹配的字符串中的<strong>元素个数</strong>加 1。在上述例子中,返回 <code>4</code> 。</p>
</li>
<li>
<p><code>m.prefix()</code></p>
<p>返回匹配的字符串的<strong>前缀</strong>(匹配的子串前的不匹配部分)。在上述例子中,返回 <code>"begin"</code> 。</p>
</li>
<li>
<p><code>m.suffix()</code></p>
<p>返回匹配的字符串的<strong>后缀</strong>(匹配的子串后的不匹配部分)。在上述例子中,返回 <code>"end"</code> 。</p>
</li>
</ul>
<p>使用<strong>迭代器</strong>,可以遍历搜索出所有匹配的子串:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span>regex <span class="token function">pattern</span><span class="token punctuation">(</span><span class="token string">"<(.*)>(.*)</(\\1)>"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre>std<span class="token double-colon punctuation">::</span>string <span class="token function">content</span><span class="token punctuation">(</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token string">"begin<xml>value</xml>end<widget>example</widget>I<luogu>AK</luogu>IOI"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre>std<span class="token double-colon punctuation">::</span>smatch m<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">auto</span> pos <span class="token operator">=</span> content<span class="token punctuation">.</span><span class="token function">cbegin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> end <span class="token operator">=</span> content<span class="token punctuation">.</span><span class="token function">cend</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> std<span class="token double-colon punctuation">::</span><span class="token function">regex_search</span><span class="token punctuation">(</span>pos<span class="token punctuation">,</span> end<span class="token punctuation">,</span> m<span class="token punctuation">,</span> pattern<span class="token punctuation">)</span><span class="token punctuation">;</span> pos <span class="token operator">=</span> m<span class="token punctuation">.</span><span class="token function">suffix</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>first<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="7"></td><td><pre> std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> m<span class="token punctuation">.</span><span class="token function">str</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>其中, <code>m.suffix().first</code> 返回指向后缀的第一个字符的迭代器,即匹配结束的位置。</p>
<h3 id="分词-stdregex_token_iterator"><a class="anchor" href="#分词-stdregex_token_iterator">#</a> 分词 ( <code>std::regex_token_iterator</code> )</h3>
<p>模板类 <code>std::regex_token_iterator</code> 提供了分词迭代器:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span>string <span class="token function">content</span><span class="token punctuation">(</span><span class="token string">"kkksc03@luogu.com.cn,i@ak.ioi,114@514.1919.810"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre>std<span class="token double-colon punctuation">::</span>regex <span class="token function">pattern</span><span class="token punctuation">(</span><span class="token string">","</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre>std<span class="token double-colon punctuation">::</span>sregex_token_iterator <span class="token function">pos</span><span class="token punctuation">(</span>content<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> content<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> pattern<span class="token punctuation">,</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">decltype</span><span class="token punctuation">(</span>pos<span class="token punctuation">)</span> end<span class="token punctuation">;</span> pos <span class="token operator">!=</span> end<span class="token punctuation">;</span> <span class="token operator">++</span>pos<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="5"></td><td><pre> std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> pos<span class="token operator">-></span><span class="token function">str</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span>endl<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>其中, <code>std::sregex_token_iterator</code> 是针对 <code>string</code> 类型的特化。构造函数传入 4 个参数:<strong>待匹配字符串的开始和结束迭代器</strong>、<strong>模式字符串 ( <code>std::regex</code> )</strong> 和<strong>捕获模式</strong>。</p>
<p>当捕获模式为 <code>-1</code> 时,返回的迭代器指向匹配的字符串<strong>前</strong>的内容。当捕获模式为 <code>0</code> 时,返回的迭代器指向匹配的字符串,即在上述例子中的分隔符 <code>","</code> 。</p>
<h3 id="替换-stdregex_replace"><a class="anchor" href="#替换-stdregex_replace">#</a> 替换 ( <code>std::regex_replace</code> )</h3>
<p><code>std::regex_replace</code> 函数实现了正则替换功能。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span>string <span class="token function">content</span><span class="token punctuation">(</span><span class="token string">"1:Luogu,2:kkksc03,3:AKIOI"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre>std<span class="token double-colon punctuation">::</span>regex <span class="token function">pattern</span><span class="token punctuation">(</span><span class="token string">"(\\d+):(\\w+)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre>std<span class="token double-colon punctuation">::</span>cout <span class="token operator"><<</span> std<span class="token double-colon punctuation">::</span><span class="token function">regex_replace</span><span class="token punctuation">(</span>content<span class="token punctuation">,</span> pattern<span class="token punctuation">,</span> <span class="token string">"id=$1, name=$2\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token comment">// OUTPUT: {id=1,name=Luogu},{id=2,name=kkksc03},{id=3,name=AKIOI}</span></pre></td></tr></table></figure><p><code>std::regex_replace</code> 函数传入 3 个参数:<strong>待处理的字符串</strong>、<strong>模式字符串 ( <code>std::regex</code> )</strong> 和<strong>替换字符串</strong>。</p>
<p>可以在模式字符串中使用括号 <code>()</code> 分组,在替换字符串中使用 <code>$n</code> 表示分组序号(从 1 开始),实现部分替换。</p>
<details class="info"><summary>参考资料</summary><div>
<ul>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2hlYWRlci9yZWdleA==">正则表达式库 - cppreference.com</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vY29vbGNwcC9wL2NwcC1yZWdleC5odG1s">C++ 正则表达式 - cpluspluser - 博客园</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly93d3cucnVub29iLmNvbS9yZWdleHAvcmVnZXhwLXN5bnRheC5odG1s">正则表达式 - 语法 | 菜鸟教程</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTg5MjExNS93aGF0cy10aGUtdGltZS1jb21wbGV4aXR5LW9mLWF2ZXJhZ2UtcmVnZXgtYWxnb3JpdGhtcw==">What's the Time Complexity of Average Regex algorithms? - Stack Overflow</span></p>
</li>
</ul>
</div></details>
<h2 id="tuple"><a class="anchor" href="#tuple">#</a> <code><tuple></code></h2>
<p>元组, <code>std::pair</code> 的推广,支持<strong>多个元素</strong>。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span>tuple<span class="token operator"><</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">float</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">float</span><span class="token operator">></span> tu <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">make_tuple</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">14.f</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">14.f</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre>std<span class="token double-colon punctuation">::</span>tuple<span class="token operator"><</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">float</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">float</span><span class="token operator">></span> <span class="token function">tu</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">14.f</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">14.f</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>使用 <code>std::forward_as_tuple</code> 或 <code>std::tie</code> 构造<strong>引用</strong>值的元组,使用 <code>std::get<n></code> 修改引用指向的值:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> a <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">float</span> b <span class="token operator">=</span> <span class="token number">14.f</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">int</span> c <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token keyword">float</span> d <span class="token operator">=</span> <span class="token number">14.f</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token keyword">auto</span> tu <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">forward_as_tuple</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token keyword">auto</span> tu <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">tie</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">,</span> d<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token comment">// 修改引用指向的值</span></pre></td></tr><tr><td data-num="10"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token generic-function"><span class="token function">get</span><span class="token generic class-name"><span class="token operator"><</span><span class="token number">0</span><span class="token operator">></span></span></span><span class="token punctuation">(</span>tu<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">19</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="11"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token generic-function"><span class="token function">get</span><span class="token generic class-name"><span class="token operator"><</span><span class="token number">1</span><span class="token operator">></span></span></span><span class="token punctuation">(</span>tu<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">1.9f</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token generic-function"><span class="token function">get</span><span class="token generic class-name"><span class="token operator"><</span><span class="token number">2</span><span class="token operator">></span></span></span><span class="token punctuation">(</span>tu<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">8</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="13"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token generic-function"><span class="token function">get</span><span class="token generic class-name"><span class="token operator"><</span><span class="token number">3</span><span class="token operator">></span></span></span><span class="token punctuation">(</span>tu<span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token number">1.0f</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>使用 <code>std::tuple_cat</code> <strong>拼接</strong>多个元组:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>std<span class="token double-colon punctuation">::</span>tuple<span class="token operator"><</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">></span> <span class="token function">a</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">5</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre>std<span class="token double-colon punctuation">::</span>tuple<span class="token operator"><</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">></span> <span class="token function">b</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">4</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre>std<span class="token double-colon punctuation">::</span>tuple<span class="token operator"><</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">></span> <span class="token function">c</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">9</span><span class="token punctuation">,</span> <span class="token number">8</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token keyword">auto</span> d <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">tuple_cat</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> b<span class="token punctuation">,</span> c<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>支持<strong>按字典序比较</strong>。</p>
<details class="info"><summary>参考资料</summary><div>
<ul>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly96aC5jcHByZWZlcmVuY2UuY29tL3cvY3BwL2hlYWRlci90dXBsZQ==">std::tuple - cppreference.com</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly96aHVhbmxhbi56aGlodS5jb20vcC83MTkyOTkyMg==">C++Tuple 元组的详细用法 - 知乎</span></p>
</li>
</ul>
</div></details>
2021-09-13T04:00:00.000Z
https://fidel.js.org/2021/05/22/cloudstudio/
「机房利器」、Coding on iPad? —— 记一次使用 Cloud Studio 云端开发的尝试
<p>曾经,Fidel's Lab 的部署平台在 Github Pages 和 Coding Pages 之间反复横跳。这篇文章所介绍的「Cloud Studio」(原「腾讯云开发者平台」)就是由 Coding 提供的在线 IDE。Cloud Studio <strong>基于 VS Code</strong>,只需要一个<s>现代的</s>浏览器和<s>正常的</s>网络连接即可在线使用。</p>
<span id="more"></span>
<p>早在一年半前,我就对 Coding 当时的「腾讯云开发者平台」有所关注(当时好像不叫这个)。只不过由于极其有限的免费使用额度、需要购买云服务器才能获得良好的体验等门槛,最终并没有采用。经过一年多的升级迭代,现在的 Cloud Studio <a href="https://cloudstudio.net/docs/others/#%E5%B7%A5%E4%BD%9C%E7%A9%BA%E9%97%B4%E6%9C%89%E4%BD%95%E9%99%90%E5%88%B6%EF%BC%9F">「每个用户<strong>每日</strong>可以(免费)使用工作空间共<strong>四小时</strong>」</a>,足以承担<strong>轻度</strong>的开发任务。</p>
<p>经过一段时间的体验,个人认为 Coding Studio 的最佳使用场景之一是 <strong>OIer 们在校内机房短时间上机练习</strong>,由于<strong>只需配置一次环境即可快速启动</strong>,堪称 <strong>「机房利器」</strong>。</p>
<p>这篇文章主要记录我使用 Cloud Studio 进行 OI 练习和编辑维护 Hexo 博客、以及尝试使用移动端(iPad)进行开发的过程。此文章全程在 Cloud Studio 上编辑。</p>
<p><img data-src="https://i.loli.net/2021/05/22/g3GhFjUoOENDS7k.jpg" alt="" /></p>
<p><em><s>Coding 赶紧给我打钱</s></em></p>
<h1 id="前置准备"><a class="anchor" href="#前置准备">#</a> 前置准备</h1>
<p>首先在 <span class="exturl" data-url="aHR0cDovL2NvZGluZy5uZXQ=">coding.net</span> 注册一个 Coding 账户。<s>我相信这一步是个人都会,就不详细描述了。</s></p>
<details class="info"><summary>「Coding」是什么?</summary><div>
<p>你可以理解为是一个<strong>类似于 GitHub</strong>,<strong>在国内体验良好</strong>的代码托管仓库。关于 Coding 主站的功能,这里不详细讲述,有兴趣的 OIer 们可以自行研究。</p>
</div></details>
<p>从左侧菜单栏进入「Cloud Studio」,或者从 <span class="exturl" data-url="aHR0cDovL2Nsb3Vkc3R1ZGlvLm5ldA==">cloudstudio.net</span> 使用 Coding 账号登陆。</p>
<p><img data-src="https://i.loli.net/2021/05/22/xzPoX3vuUb15CKO.jpg" alt="" /></p>
<h1 id="oi-on-cloud-studio"><a class="anchor" href="#oi-on-cloud-studio">#</a> OI on Cloud Studio</h1>
<h2 id="创建工作空间"><a class="anchor" href="#创建工作空间">#</a> 创建工作空间</h2>
<p>现在你进入了你的 Cloud Studio 面板。点击上方 <strong>「新建工作空间」</strong>。</p>
<ul>
<li>
<p>关于 <strong>「运行环境」</strong>:这里我们选择 <strong>「预置环境」</strong>。(有服务器的大佬也可以连接云服务器使用,风险自行承担。)</p>
<p>对于使用 C++ 的 OI 编程,我们选择 <strong>「Ubuntu」</strong>。</p>
<details class="info"><summary>「Ubuntu」是什么?</summary><div>
<p>Linux 的发行版之一。</p>
</div></details>
</li>
<li>
<p>关于 <strong>「代码来源」</strong>:选择 <strong>「空」</strong>。</p>
<p><span class="label info">注意</span> Cloud Studio 自带的仓库同步不稳定。如果需要同步远程仓库代码,建议进入工作空间后使用 Git 手动配置。</p>
</li>
</ul>
<p><img data-src="https://i.loli.net/2021/05/22/YDd8QCXZicgxtqO.jpg" alt="" /></p>
<h2 id="初步探索"><a class="anchor" href="#初步探索">#</a> 初步探索</h2>
<p>进入工作空间,你会发现 Cloud Studio 的界面与 VS Code <s>完全一致</s>高度相似。熟悉 VS Code 的读者可以跳过此部分。</p>
<h3 id="命令面板-commands-panel"><a class="anchor" href="#命令面板-commands-panel">#</a> 命令面板 (Commands Panel)</h3>
<p>按下 <strong> <code>Ctrl</code> + <code>Shift</code> + <code>P</code> </strong> 打开命令面板。</p>
<p><img data-src="https://i.loli.net/2021/05/22/QzgMLV1xwbGeBdp.jpg" alt="" /></p>
<p>在命令面板里可以找到 VS Code 中所有的操作(包括插件)及对应的快捷键。</p>
<h3 id="命令行-终端-terminal"><a class="anchor" href="#命令行-终端-terminal">#</a> 命令行 / 终端 (Terminal)</h3>
<p>Cloud Studio 的本质是一台云服务器,通过 VS Code 控制。如何仅通过一个编辑器控制一个操作系统呢?</p>
<p>接下来介绍 Linux 中最强大的工具:<strong>命令行</strong> (Terminal)。</p>
<p>在 VS Code 中,按下 <strong> <code>Ctrl</code> + <code>`</code></strong> 打开<strong>终端</strong>。</p>
<p><img data-src="https://i.loli.net/2021/05/22/DFua6y4Zv5ISHbE.jpg" alt="" /></p>
<details class="info"><summary>Linux 命令行的基本用法</summary><div>
<p>左侧的 <code>RemoteWorking</code> 表示当前所在的目录。</p>
<ul>
<li>
<p><strong> <code>pwd</code> </strong> 查看完整的目录路径。</p>
</li>
<li>
<p><strong> <code>mkdir <dirname></code> </strong> 在当前目录下<strong>新建</strong>名为 <code><dirname></code> 的<strong>文件夹</strong>。</p>
</li>
<li>
<p><strong> <code>ls</code> </strong> <strong>列出</strong>当前目录下的所有<strong>文件和文件夹</strong>。</p>
</li>
<li>
<p><strong> <code>cd <dirname></code> </strong> <strong>进入</strong>当前目录下名为 <code><dirname></code> 的<strong>文件夹</strong>。</p>
<ul>
<li>
<p><strong> <code>cd ..</code> </strong> 返回<strong>上一级目录</strong>。</p>
</li>
<li>
<p><strong> <code>cd ~</code> </strong> 前往<strong>家目录</strong>(如用户 <code>root</code> 的家目录为 <code>/root</code> )。</p>
</li>
<li>
<p><strong> <code>cd /</code> </strong> 前往<strong>根目录</strong> ( <code>/</code> )。</p>
</li>
</ul>
</li>
<li>
<p><strong> <code>touch <filename></code> </strong> 在当前目录下<strong>创建</strong>名为 <code><filename></code> 的<strong>文件</strong>。</p>
</li>
<li>
<p><strong> <code>rm <filename></code> </strong> <strong>删除</strong>当前目录下名为 <code><filename></code> 的<strong>文件</strong>。</p>
<ul>
<li>
<p><strong> <code>rm -r <dirname></code> </strong> <strong>删除</strong>当前目录下名为 <code><filename></code> 的<strong>文件夹</strong>。</p>
</li>
<li>
<p><strong> <code>rm -r *</code> </strong> <strong>删除</strong>当前目录下的<strong>所有文件和文件夹</strong>。</p>
</li>
<li>
<p>参数 <strong> <code>-f</code> </strong> 不经过确认直接删除。</p>
</li>
</ul>
</li>
</ul>
</div></details>
<h3 id="设置-settings"><a class="anchor" href="#设置-settings">#</a> 设置 (Settings)</h3>
<p>在 VS Code 界面左上角选择 <strong>「文件 - 打开文件夹…」</strong>,可以设置左侧资源管理器的根目录。</p>
<p>按下快捷键 <strong> <code>Ctrl</code> + <code>,</code> </strong> 或在左上角选择 <strong>「文件 - 首选项 - 设置」</strong> 进入<strong>设置界面</strong>。</p>
<blockquote>
<p><strong>值得介绍的 VS Code 设置项</strong></p>
<p>在设置页面搜索左侧的 index 即可转到相应设置。也可以从设置界面右上角打开 Json 文件修改设置。</p>
<p><strong> <code>terminal.integrated.cwd</code> </strong> Terminal 的默认<strong>启动路径</strong>。</p>
<p><strong> <code>editor.fontSize</code> </strong> 编辑器<strong>字体大小</strong>。</p>
<p><strong> <code>editor.fontFamily</code> </strong> 编辑器<strong>字体</strong>。我使用的配置是 <code>Monaco, Consolas, Menlo, 'Courier New', monospace</code> ,在 Windows 和 MacOS 下都有不错的效果。</p>
<p><strong> <code>editor.wordWrap</code> </strong> 启用<strong>长行自动换行</strong>(仅影响显示效果)。</p>
</blockquote>
<p>VS Code 的界面我认为还是非常清晰的,相信大家简单摸索之后就能很快了解。</p>
<h2 id="c-相关组件安装及配置"><a class="anchor" href="#c-相关组件安装及配置">#</a> C++ 相关组件安装及配置</h2>
<h3 id="编译器-llvm-clang"><a class="anchor" href="#编译器-llvm-clang">#</a> 编译器 (LLVM / Clang)</h3>
<p>这里以 LLVM / Clang 的安装举例。GCC 等编译器的安装过程大致相似。</p>
<details class="info"><summary>「Clang」是什么?</summary><div>
<p>与大家熟悉的 GCC (G++) 类似,Clang (Clang++) 是 C (C++) 的编译器之一。相比于 GCC,Clang 有着更快的编译速度、更友好的错误提示等优点。同时,与 Clang 配套的调试器 LLDB(对应 GCC 的 GDB)对 MacOS 更加友好。</p>
</div></details>
<p>Linux 下有极其方便的软件包管理工具:<strong>apt</strong>。</p>
<p>只需要在终端中输入四行指令:</p>
<figure class="highlight bash"><figcaption data-lang="bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">apt</span> update</pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> llvm</pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> clang</pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token function">sudo</span> <span class="token function">apt</span> <span class="token function">install</span> lldb</pre></td></tr></table></figure><p>一切完成。</p>
<p><s>比屑百度出来的大一堆下载源码手动编译的方法方便百倍。</s></p>
<p>Cloud Studio 默认配置了清华镜像源,按理来说下载速度应该很快。</p>
<p><span class="label info">提示</span> 如果下载进度卡了,按下 <code>Ctrl</code> + <code>C</code> 终止并重新执行命令。</p>
<h3 id="插件-extensions"><a class="anchor" href="#插件-extensions">#</a> 插件 (Extensions)</h3>
<p>在 VS Code 左侧工具栏选择最后一项 <strong>「Extensions」图标</strong>进入插件列表。在上方搜索框输入插件名称关键字即可在插件商店中搜索。点击 <strong>「Install」</strong> 即可一键安装。极其方便!</p>
<h4 id="c-c"><a class="anchor" href="#c-c">#</a> C / C++</h4>
<p>微软出品的 C / C++ 配套插件,包括代码高亮、自动补全、调试等功能。</p>
<p>在 Panel 中使用命令 <code>C/C++: 编辑配置 (UI)</code> 打开编辑器,或使用命令 <code>C/C++: 编辑配置 (JSON)</code> 切换到 <code>c_cpp_properties.json</code> 文件进行配置。</p>
<p>可以根据需要修改<strong>编译器参数</strong>、<strong>C / C++ 标准</strong>等设置。</p>
<h4 id="code-runner"><a class="anchor" href="#code-runner">#</a> Code Runner</h4>
<p>代码快捷运行工具,适用多种代码语言。</p>
<p>进入设置界面或 <code>settings.json</code> ,修改 <code>code-runner.executorMap</code> 项,将编译程序从 gcc /g++ 改为 clang /clang++。</p>
<figure class="highlight diff"><figcaption data-lang="diff"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token deleted-sign deleted"><span class="token prefix deleted">-</span> "c": "cd $dir && gcc $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",</pre></td></tr><tr><td data-num="2"></td><td><pre></span><span class="token inserted-sign inserted"><span class="token prefix inserted">+</span> "c": "cd $dir && clang $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",</pre></td></tr><tr><td data-num="3"></td><td><pre></span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token deleted-sign deleted"><span class="token prefix deleted">-</span> "cpp": "cd $dir && g++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",</pre></td></tr><tr><td data-num="5"></td><td><pre></span><span class="token inserted-sign inserted"><span class="token prefix inserted">+</span> "cpp": "cd $dir && clang++ $fileName -o $fileNameWithoutExt && $dir$fileNameWithoutExt",</span></pre></td></tr></table></figure><p><span class="label info">注意</span> 默认通过 Code Runner 运行的代码无法直接从 VS Code 接收键盘输入,所以需要使用<strong>文件读入</strong>。如果需要从键盘输入,可在设置中启用 <code>code-runner.runInTerminal</code> ,代码将在 Terminal 中运行。(感谢 <span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3VzZXIvMTc1NTg2">@Zxc200611</span> 提醒)</p>
<blockquote>
<p>个人建议还是使用文件读写,一是方便 Debug,二是为日后竞赛养成良好习惯。</p>
</blockquote>
<h2 id="compile-and-run"><a class="anchor" href="#compile-and-run">#</a> Compile and Run!</h2>
<p>编写好 C++ 程序后,在编辑器右上角点击 <strong>「运行」图标</strong>或按下快捷键 <strong> <code>Ctrl</code> + <code>Alt</code> + <code>N</code> </strong> 编译并运行代码。</p>
<p><img data-src="https://i.loli.net/2021/05/22/jZvyHLpYz6xATKm.jpg" alt="" /></p>
<p>按下快捷键 <strong> <code>Ctrl</code> + <code>Alt</code> + <code>M</code> </strong> 强制停止运行中的代码。</p>
<h2 id="debug"><a class="anchor" href="#debug">#</a> Debug</h2>
<p>在 VS Code 左侧工具栏选择第三项 <strong>「Run」图标</strong>进入调试菜单。</p>
<p>点击 <strong>「运行和调试 (Run and Debug)」</strong>,选择 <strong>「C++ (GDB/LLDB)」</strong>-<strong>「clang++」</strong>,并保存 <code>launch.json</code> 。</p>
<p>代码打断点,然后点击左上角小三角开始调试。</p>
<p>左侧菜单的各个部分的含义和作用分别为:</p>
<ul>
<li>
<p><strong>变量</strong>:当前代码中的局部变量。</p>
</li>
<li>
<p><strong>监视</strong>:全局 / 局部变量,需要手动添加。</p>
</li>
<li>
<p><strong>调用堆栈 & 断点</strong>:顾名思义。</p>
</li>
</ul>
<p><span class="label info">提示</span> 可以直接对左侧的变量值进行修改。</p>
<p><img data-src="https://i.loli.net/2021/05/22/yW6j1kcxa9nYOIP.jpg" alt="" /></p>
<h2 id="用户代码片段"><a class="anchor" href="#用户代码片段">#</a> 用户代码片段</h2>
<p>以配置 C++ 的用户代码片段为例,点击 <strong>「左下角齿轮图标(管理)- 用户代码片段」</strong>,选择 <strong>「cpp」</strong>。</p>
<p>按照注释中的提示编辑 <code>cpp.json</code> 。</p>
<p>这里以我的 <code>cpp.json</code> 为例:</p>
<figure class="highlight json"><figcaption data-lang="JSON"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token property">"C++ program"</span><span class="token operator">:</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token property">"prefix"</span><span class="token operator">:</span> <span class="token string">"cpp"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token property">"body"</span><span class="token operator">:</span> <span class="token punctuation">[</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token string">"#include <cstdio>"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token string">""</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token string">"inline int read() {"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token string">" int x = 0, c = getchar(), f = 0;"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token string">" while (c < '0' || c > '9') f |= c == '-', c = getchar();"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token string">" while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token string">" return f ? -x : x;"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token string">"}"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token string">""</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token string">"int main() {"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token string">"#ifndef ONLINE_JUDGE"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token string">" freopen(\"test.in\", \"r\", stdin);"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="17"></td><td><pre> <span class="token string">" freopen(\"test.out\", \"w\", stdout);"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="18"></td><td><pre> <span class="token string">"#endif"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="19"></td><td><pre> <span class="token string">""</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="20"></td><td><pre> <span class="token string">" $0"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="21"></td><td><pre> <span class="token string">""</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="22"></td><td><pre> <span class="token string">"#ifndef ONLINE_JUDGE"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="23"></td><td><pre> <span class="token string">" fclose(stdin);"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="24"></td><td><pre> <span class="token string">" fclose(stdout);"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="25"></td><td><pre> <span class="token string">"#endif"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="26"></td><td><pre> <span class="token string">" return 0;"</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="27"></td><td><pre> <span class="token string">"}"</span></pre></td></tr><tr><td data-num="28"></td><td><pre> <span class="token punctuation">]</span></pre></td></tr><tr><td data-num="29"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="30"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>在后缀为 <code>.cpp</code> 的代码文件中,输入 <code>cpp</code> ( <code>prefix</code> ) 并按下 <code>Tab</code> ,将会自动补全为:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdio></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">inline</span> <span class="token keyword">int</span> <span class="token function">read</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">int</span> x <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> c <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> f <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span>c <span class="token operator"><</span> <span class="token char">'0'</span> <span class="token operator">||</span> c <span class="token operator">></span> <span class="token char">'9'</span><span class="token punctuation">)</span> f <span class="token operator">|=</span> c <span class="token operator">==</span> <span class="token char">'-'</span><span class="token punctuation">,</span> c <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span>c <span class="token operator">>=</span> <span class="token char">'0'</span> <span class="token operator">&&</span> c <span class="token operator"><=</span> <span class="token char">'9'</span><span class="token punctuation">)</span> x <span class="token operator">=</span> x <span class="token operator">*</span> <span class="token number">10</span> <span class="token operator">+</span> c <span class="token operator">-</span> <span class="token char">'0'</span><span class="token punctuation">,</span> c <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">return</span> f <span class="token operator">?</span> <span class="token operator">-</span>x <span class="token operator">:</span> x<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifndef</span> <span class="token expression">ONLINE_JUDGE</span></span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token function">freopen</span><span class="token punctuation">(</span><span class="token string">"test.in"</span><span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">,</span> <span class="token constant">stdin</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token function">freopen</span><span class="token punctuation">(</span><span class="token string">"test.out"</span><span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">,</span> <span class="token constant">stdout</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span></pre></td></tr><tr><td data-num="15"></td><td><pre></pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token comment">/* Code */</span></pre></td></tr><tr><td data-num="17"></td><td><pre></pre></td></tr><tr><td data-num="18"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">ifndef</span> <span class="token expression">ONLINE_JUDGE</span></span></pre></td></tr><tr><td data-num="19"></td><td><pre> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token constant">stdin</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="20"></td><td><pre> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token constant">stdout</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="21"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">endif</span></span></pre></td></tr><tr><td data-num="22"></td><td><pre> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="23"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>同时,编辑光标会移到 <code>/* Code */</code> ( <code>$0</code> ) 的位置。</p>
<p><img data-src="https://i.loli.net/2021/05/22/5ESlo98ir1TcZxv.jpg" alt="" /></p>
<blockquote>
<p>利用预编译判断指令 <code>#ifndef ONLINE_JUDGE</code> ,这份模板提交到洛谷时不需要删除文件读写,极其好用。</p>
</blockquote>
<h2 id="代码格式化-clang-format"><a class="anchor" href="#代码格式化-clang-format">#</a> 代码格式化 (clang-format)</h2>
<p><strong>随手对写完的代码 <code>Shift</code> + <code>Alt</code> + <code>F</code> 格式化是一个好习惯。</strong></p>
<p>VS Code 的 C / C++ 插件里,使用的格式化程序是 clang-format。</p>
<p>修改设置中的 <code>C_Cpp.clang_format_fallbackStyle</code> 项配置格式化选项。</p>
<p>我的配置是: <code>{ BasedOnStyle: Google, IndentWidth: 4, UseTab: Never }</code> 。</p>
<p><code>BasedOnStyle: Google</code> 使得<strong>大括号不独占一行</strong>。可以根据个人喜好修改。</p>
<h1 id="hexo-on-cloud-studio"><a class="anchor" href="#hexo-on-cloud-studio">#</a> Hexo on Cloud Studio</h1>
<p>以下内容为 Cloud Studio 的<strong>拓展进阶玩法</strong>,需要你掌握以下前置知识:</p>
<ul>
<li>Hexo 博客的搭建</li>
<li>Git 的使用</li>
</ul>
<p><strong>假设,你已经搭建过你的 Hexo 博客,并已经将源代码上传至代码托管平台。</strong></p>
<p>如果没有,请参阅 <span class="exturl" data-url="aHR0cHM6Ly9oZXhvLmlvL2RvY3Mv">Hexo 文档</span> 直接搭建博客,或将源代码上传至代码托管平台。</p>
<h2 id="创建工作空间-2"><a class="anchor" href="#创建工作空间-2">#</a> 创建工作空间</h2>
<ul>
<li>
<p>「运行环境」:选择 「预置环境 - <strong>Node.js</strong>」。</p>
</li>
<li>
<p>「代码来源」:选择 <strong>「空」</strong>。</p>
<p><span class="label info">注意</span> Cloud Studio 自带的仓库同步不稳定。如果需要同步远程仓库代码,建议进入工作空间后使用 Git 手动配置。</p>
</li>
</ul>
<h2 id="源代码迁移"><a class="anchor" href="#源代码迁移">#</a> 源代码迁移</h2>
<p>使用 <code>git clone</code> 下载源代码至本地。</p>
<p>按照惯例,在主目录下运行 <code>hexo</code> 命令。但是这时候你会发现运行不了的:</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>zsh: command not found: hexo</pre></td></tr></table></figure><p>输入以下命令,在 <code>/usr/local/bin/</code> 目录下创建 <code>hexo</code> 程序的软链接到 <code>RemoteWorking/<dirname>/hexo/node_modules/hexo/bin/hexo</code> 。</p>
<figure class="highlight bash"><figcaption data-lang="bash"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">ln</span> -s ~/RemoteWorking/<span class="token operator"><</span>dirname<span class="token operator">></span>/hexo/node_modules/hexo/bin/hexo /usr/local/bin/hexo</pre></td></tr></table></figure><p>再次运行 <code>hexo</code> 命令,发现可以正常使用了。</p>
<h2 id="运行服务器-网页预览"><a class="anchor" href="#运行服务器-网页预览">#</a> 运行服务器 & 网页预览</h2>
<p>输入 <code>hexo s</code> 启动预览。</p>
<p>得益于 Cloud Studio 的 Browser Preview Lite 插件,你可以非常方便地预览你的 Hexo 博客。</p>
<p><code>Ctrl</code> + <code>Shift</code> + <code>P</code> 打开 Panel,输入 <code>preview</code> ,在命令列表中点击 <strong> <code>Preview: Open Preview Tab</code> </strong>,输入<strong>端口号 <code>4000</code> </strong>,即可打开预览。</p>
<p>或者你也可以通过配置 <code>preview.yml</code> ,一键启动服务器并打开预览。</p>
<p>打开 Panel,输入 <code>preview</code> ,在命令列表中点击 <strong> <code>Preview: Generate Preview Config File</code> </strong>,编辑配置文件。</p>
<p>这是我的配置:</p>
<figure class="highlight yml"><figcaption data-lang="YAML"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment"># .vscode/preview.yml</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token key atrule">autoOpen</span><span class="token punctuation">:</span> <span class="token boolean important">false</span> <span class="token comment"># 打开工作空间时是否自动开启所有应用的预览</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token key atrule">apps</span><span class="token punctuation">:</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token punctuation">-</span> <span class="token key atrule">port</span><span class="token punctuation">:</span> <span class="token number">4000</span> <span class="token comment"># 应用的端口</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token key atrule">run</span><span class="token punctuation">:</span> hexo s <span class="token punctuation">-</span>p 4000 <span class="token comment"># 应用的启动命令</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token key atrule">root</span><span class="token punctuation">:</span> hexo <span class="token comment"># 应用的启动目录</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token key atrule">name</span><span class="token punctuation">:</span> Hexo <span class="token comment"># 应用名称</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token key atrule">description</span><span class="token punctuation">:</span> hexo s <span class="token comment"># 应用描述</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token key atrule">autoOpen</span><span class="token punctuation">:</span> <span class="token boolean important">false</span> <span class="token comment"># 打开工作空间时是否自动开启预览(优先级高于根级 autoOpen)</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token punctuation">-</span> <span class="token key atrule">port</span><span class="token punctuation">:</span> <span class="token number">4001</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token key atrule">run</span><span class="token punctuation">:</span> hexo s <span class="token punctuation">-</span><span class="token punctuation">-</span>drafts <span class="token punctuation">-</span>p 4001</pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token key atrule">root</span><span class="token punctuation">:</span> hexo</pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token key atrule">name</span><span class="token punctuation">:</span> Hexo (Show Drafts)</pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token key atrule">description</span><span class="token punctuation">:</span> hexo s <span class="token punctuation">-</span><span class="token punctuation">-</span>drafts</pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token key atrule">autoOpen</span><span class="token punctuation">:</span> <span class="token boolean important">false</span></pre></td></tr></table></figure><p><span class="label info">注意</span> 由于 Browser Preview Lite 以 <code>port</code> 作为索引关键字,<strong> <code>port</code> 必须是唯一的</strong>。可以使用参数 <code>-p</code> 指定端口号。</p>
<p>配置完毕后,打开 Panel,输入 <code>preview</code> ,在命令列表中点击 <strong> <code>Preview: Open Preview Tab</code> </strong>,即可快速选择预览选项。</p>
<p><img data-src="https://i.loli.net/2021/05/22/GjmLsgXa17TYUFz.jpg" alt="" /></p>
<h2 id="vs-code-配置"><a class="anchor" href="#vs-code-配置">#</a> VS Code 配置</h2>
<p><strong>Terminal 的初始路径</strong>可以通过 <code>terminal.integrated.cwd</code> 修改。</p>
<h2 id="额外组件安装及配置"><a class="anchor" href="#额外组件安装及配置">#</a> 额外组件安装及配置</h2>
<h3 id="markdown-preview-enhanced"><a class="anchor" href="#markdown-preview-enhanced">#</a> Markdown Preview Enhanced</h3>
<p>强大的 Markdown 预览插件。</p>
<h3 id="markdownlint"><a class="anchor" href="#markdownlint">#</a> markdownlint</h3>
<p>强大的 Markdown 格式检查工具,<s>强迫症福音</s>。</p>
<p>我的配置 ( <code>.markdownlint.json</code> ):</p>
<figure class="highlight json"><figcaption data-lang="JSON"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token property">"single-title"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token property">"ol-prefix"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token property">"line-length"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token property">"no-alt-text"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token property">"no-emphasis-as-heading"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token property">"no-blanks-blockquote"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token property">"no-trailing-punctuation"</span><span class="token operator">:</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token property">"punctuation"</span><span class="token operator">:</span> <span class="token string">".,;:。,;:"</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token punctuation">}</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token property">"no-inline-html"</span><span class="token operator">:</span> <span class="token boolean">false</span><span class="token punctuation">,</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token property">"no-duplicate-header"</span><span class="token operator">:</span> <span class="token boolean">false</span></pre></td></tr><tr><td data-num="13"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>对着 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQW5zb24vbWFya2Rvd25saW50L2Jsb2IvbWFpbi9kb2MvUnVsZXMubWQ=">markdownlint's Rules.md file</span> 自行研究吧。</p>
<h3 id="pangu-markdown"><a class="anchor" href="#pangu-markdown">#</a> Pangu-Markdown</h3>
<p><strong>在中文与英文、数字与符号之间加入空格是个好习惯。</strong></p>
<p>在 Panel 中输入 <code>Pangu Format</code> ,可以自动添加空格。</p>
<blockquote>
<p>汉学家称这个空白字元为「盘古之白」,因为它劈开了全角符和半角符之间的混沌。另有研究显示,打字的时候不喜欢在中文和英文之间加空格的人,感情路都走得很辛苦,有七成的比例会在 34 岁的时候跟自己不爱的人结婚,而其余三成的人最后只能把遗产留给自己的猫。毕竟爱情跟书写都需要适时地留白。</p>
<p>摘自:<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3ZpbnRhL3Bhbmd1Lmpz">https://github.com/vinta/pangu.js</span></p>
</blockquote>
<h3 id="markdown-table-format"><a class="anchor" href="#markdown-table-format">#</a> MarkDown Table Format</h3>
<p><code>Shift</code> + <code>Alt</code> + <code>F</code> 对<strong>表格</strong>进行格式化。</p>
<hr />
<blockquote>
<p>至于不少人推荐的 Markdown All in One:我觉得不好用。真的一点也不好用。试着输入一下<strong>多行引用块</strong>就知道了。</p>
</blockquote>
<h1 id="coding-on-ipad"><a class="anchor" href="#coding-on-ipad">#</a> Coding on iPad?</h1>
<p>抱着「你的下一台电脑何必是电脑」的想法,我尝试着在 iPad 上使用 Cloud Studio 写代码。毕竟,只要带一台 iPad 而不用背着<s>重如砖块的</s>电脑到处跑可太香了。</p>
<p>测试平台:iPad 8 (iPadOS 14.5),Microsoft Edge 浏览器。</p>
<p>Cloud Studio(或者说网页版的 VS Code)对于触控的优化还是不错的。滑动、点击、长按调出右键菜单等操作都可以顺利完成。</p>
<p>然而输入的体验就不那么好了。写代码就别<s>手戳玻璃</s>敲虚拟键盘了,老老实实用蓝牙键盘吧。</p>
<p>受限于设备性能和网络,输入时略有延迟,不太跟手。</p>
<p>最大的问题,来源于 <strong>Cloud Studio 自行实现了一套与 iPadOS 系统级别不同的输入逻辑</strong>。</p>
<p>由于 Cloud Studio 自行实现了输入光标,在切换窗口后,内部的输入光标有时不能聚焦到正确的位置,反映为 iPadOS 系统级别的输入光标聚焦在编辑器上,而 Cloud Studio 内部的输入光标还在别的位置,无法通过键盘输入,需要点击其他位置再聚焦到编辑器才能正常输入。</p>
<p>Cloud Studio 的剪切板与 iPadOS 系统剪切板是独立的,且由于适配问题不能互通,<strong>只能在 Cloud Studio 内部复制粘贴</strong>。这使我差点因为代码复制不出去而交不了作业,最终通过 <code>cat</code> 指令将文件在 Terminal 中 print 出来,才能复制出去。</p>
<p>总体来说,Cloud Studio 在 iPad 上的使用体验还<strong>远远达不到能顺畅使用的级别</strong>。<s>你的下一台电脑还得是电脑。</s></p>
<h1 id="彩蛋"><a class="anchor" href="#彩蛋">#</a> 彩蛋</h1>
<p>在 Terminal 中,输入 <code>lscpu</code> 可查看 CPU 信息。</p>
<p><img data-src="https://i.loli.net/2021/05/22/imtWhM4ECYgXBDo.jpg" alt="" /></p>
<p><strong>Intel(R) Xeon(R) Gold 6148 CPU @ 2.40GHz!</strong></p>
<p>输入 <code>free -m</code> 查看内存信息(单位 MiB)。</p>
<p><img data-src="https://i.loli.net/2021/05/22/b5769AYFfMXPIsB.jpg" alt="" /></p>
<p><strong>2 GiB 内存!</strong></p>
<p>输入 <code>df -h</code> 查看硬盘分区信息。</p>
<p><img data-src="https://i.loli.net/2021/05/22/Wmb21nsUux6vFDk.jpg" alt="" /></p>
<p>唔……</p>
<h1 id="references"><a class="anchor" href="#references">#</a> References</h1>
<ol>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly9jbG91ZHN0dWRpby5uZXQvZG9jcw==">Cloud Studio 文档</span></p>
</li>
<li>
<p><span class="exturl" data-url="aHR0cHM6Ly93d3cucnVub29iLmNvbS9saW51eC9saW51eC1jb21tYW5kLW1hbnVhbC5odG1s">Linux 命令大全</span></p>
</li>
</ol>
2021-05-22T04:00:00.000Z
https://fidel.js.org/2021/02/14/cpp-optimization/
【转载】还能这样玩——关于一些 OI 的黑 (sao) 科 (cao) 技 (zuo) 优化
<blockquote>
<p>编者注:虽然标题中提到了 OI,但个人认为本文对追求极限的代码调优的价值远大于对 OI 的价值。</p>
</blockquote>
<div class="note info">
<p>转载修改内容:</p>
<ol>
<li>修复了原文滥用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>LaTeX</mtext></mrow><annotation encoding="application/x-tex">\LaTeX</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.89883em;vertical-align:-0.2155em;"></span><span class="mord text"><span class="mord textrm">L</span><span class="mspace" style="margin-right:-0.36em;"></span><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.68333em;"><span style="top:-2.904999em;"><span class="pstrut" style="height:2.7em;"></span><span class="mord"><span class="mord textrm mtight sizing reset-size6 size3">A</span></span></span></span></span></span><span class="mspace" style="margin-right:-0.15em;"></span><span class="mord text"><span class="mord textrm">T</span><span class="mspace" style="margin-right:-0.1667em;"></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.46782999999999997em;"><span style="top:-2.7845em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord textrm">E</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2155em;"><span></span></span></span></span><span class="mspace" style="margin-right:-0.125em;"></span><span class="mord textrm">X</span></span></span></span></span></span> 问题。</li>
<li>对代码进行了格式化。</li>
<li>修改了原文汇编代码的错误注释。(汇编的注释符号是 <code>;</code> 而不是 <code>//</code> !)</li>
<li>修改原文符号的不规范使用。</li>
<li>删除或修改了存在争议或错误的内容。</li>
</ol>
</div>
<span id="more"></span>
<hr />
<h1 id="免责声明"><a class="anchor" href="#免责声明">#</a> 免责声明</h1>
<blockquote>
<p>本文仅供参考,由读者引发的一切后果,任何责任由读者自行承担。后果包括但不限于:</p>
<ol>
<li>优化后程序变慢。</li>
<li>某些 OJ/OI 上导致的编译错误。</li>
<li>文章中的某些错误引起的争论。</li>
</ol>
</blockquote>
<h1 id="gcc-系列"><a class="anchor" href="#gcc-系列">#</a> GCC 系列</h1>
<p>关于 GCC 的黑科技想必大家也就知道这几句吧:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">GCC <span class="token function">optimize</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">GCC <span class="token function">optimize</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">pragma</span> <span class="token expression">GCC <span class="token function">optimize</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span></span></span></pre></td></tr></table></figure><p>俗称 “吸氧”。</p>
<p>在这里小编就简单地讲一下 <code>-O1</code> , <code>-O2</code> , <code>-O3</code> , <code>-Os</code> (怎么还有个 <code>-Os</code> )。</p>
<h2 id="o-系列"><a class="anchor" href="#o-系列">#</a> O 系列</h2>
<h3 id="-o1"><a class="anchor" href="#-o1">#</a> <code>-O1</code></h3>
<p>包含下列选项:</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-fauto-inc-dec</pre></td></tr><tr><td data-num="2"></td><td><pre>-fcprop-registers</pre></td></tr><tr><td data-num="3"></td><td><pre>-fdce</pre></td></tr><tr><td data-num="4"></td><td><pre>-fdefer-pop</pre></td></tr><tr><td data-num="5"></td><td><pre>-fdelayed-branch</pre></td></tr><tr><td data-num="6"></td><td><pre>-fdse</pre></td></tr><tr><td data-num="7"></td><td><pre>-fguess-branch-probability</pre></td></tr><tr><td data-num="8"></td><td><pre>-fif-conversion2</pre></td></tr><tr><td data-num="9"></td><td><pre>-fif-conversion</pre></td></tr><tr><td data-num="10"></td><td><pre>-finline-small-functions</pre></td></tr><tr><td data-num="11"></td><td><pre>-fipa-pure-const</pre></td></tr><tr><td data-num="12"></td><td><pre>-fipa-reference</pre></td></tr><tr><td data-num="13"></td><td><pre>-fmerge-constants -fsplit-wide-types</pre></td></tr><tr><td data-num="14"></td><td><pre>-ftree-builtin-call-dce</pre></td></tr><tr><td data-num="15"></td><td><pre>-ftree-ccp</pre></td></tr><tr><td data-num="16"></td><td><pre>-ftree-ch</pre></td></tr><tr><td data-num="17"></td><td><pre>-ftree-copyrename</pre></td></tr><tr><td data-num="18"></td><td><pre>-ftree-dce</pre></td></tr><tr><td data-num="19"></td><td><pre>-ftree-dominator-opts</pre></td></tr><tr><td data-num="20"></td><td><pre>-ftree-dse</pre></td></tr><tr><td data-num="21"></td><td><pre>-ftree-fre</pre></td></tr><tr><td data-num="22"></td><td><pre>-ftree-sra</pre></td></tr><tr><td data-num="23"></td><td><pre>-ftree-ter</pre></td></tr><tr><td data-num="24"></td><td><pre>-funit-at-a-time</pre></td></tr><tr><td data-num="25"></td><td><pre>-fomit-frame-pointer</pre></td></tr></table></figure><h3 id="-o2"><a class="anchor" href="#-o2">#</a> <code>-O2</code></h3>
<p>除了加载 <code>-O1</code> 的选项外,还加载:</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-fthread-jumps</pre></td></tr><tr><td data-num="2"></td><td><pre>-falign-functions -falign-jumps</pre></td></tr><tr><td data-num="3"></td><td><pre>-falign-loops -falign-labels</pre></td></tr><tr><td data-num="4"></td><td><pre>-fcaller-saves</pre></td></tr><tr><td data-num="5"></td><td><pre>-fcr-Ossjumping</pre></td></tr><tr><td data-num="6"></td><td><pre>-fcse-follow-jumps -fcse-skip-blocks</pre></td></tr><tr><td data-num="7"></td><td><pre>-fdelete-null-pointer-checks</pre></td></tr><tr><td data-num="8"></td><td><pre>-fexpensive-optimizations</pre></td></tr><tr><td data-num="9"></td><td><pre>-fgcse -fgcse-lm</pre></td></tr><tr><td data-num="10"></td><td><pre>-findirect-inlining</pre></td></tr><tr><td data-num="11"></td><td><pre>-foptimize-sibling-calls</pre></td></tr><tr><td data-num="12"></td><td><pre>-fpeephole2</pre></td></tr><tr><td data-num="13"></td><td><pre>-fregmove</pre></td></tr><tr><td data-num="14"></td><td><pre>-freorder-blocks -freorder-functions</pre></td></tr><tr><td data-num="15"></td><td><pre>-frerun-cse-after-loop</pre></td></tr><tr><td data-num="16"></td><td><pre>-fsched-interblock -fsched-spec</pre></td></tr><tr><td data-num="17"></td><td><pre>-fschedule-insns -fschedule-insns2</pre></td></tr><tr><td data-num="18"></td><td><pre>-fstrict-aliasing -fstrict-overflow</pre></td></tr><tr><td data-num="19"></td><td><pre>-ftree-switch-conversion</pre></td></tr><tr><td data-num="20"></td><td><pre>-ftree-pre</pre></td></tr><tr><td data-num="21"></td><td><pre>-ftree-vrp</pre></td></tr></table></figure><h3 id="-o3"><a class="anchor" href="#-o3">#</a> <code>-O3</code></h3>
<p>除了加载 <code>-O2</code> 外,还加载:</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-finline-functions</pre></td></tr><tr><td data-num="2"></td><td><pre>-funswitch-loops</pre></td></tr><tr><td data-num="3"></td><td><pre>-fpredictive-commoning</pre></td></tr><tr><td data-num="4"></td><td><pre>-fgcse-after-reload</pre></td></tr><tr><td data-num="5"></td><td><pre>-ftree-vectorize</pre></td></tr></table></figure><h3 id="-os"><a class="anchor" href="#-os">#</a> <code>-Os</code></h3>
<p>在研究编译驱动的 makefile 的时候,发现 GCC 的命令行里面有一个 <code>-Os</code> 的优化选项。</p>
<p>遍查 GCC 文档,发现了 <code>-O0</code> , <code>-O1</code> , <code>-O2</code> , <code>-O3</code> ,就是没有发现 <code>-Os</code> 。</p>
<p>祭出 GOOGLE,搜了一下,终于发现这篇文章说明了 <code>-Os</code> 的作用:</p>
<p><span class="exturl" data-url="aHR0cDovL3d3dy5saW51eGpvdXJuYWwuY29tL2FydGljbGUvNzI2OQ==">http://www.linuxjournal.com/article/7269</span></p>
<p>原来 <code>-Os</code> 相当于 "-O2.5"。是使用了所有 <code>-O2</code> 的优化选项,但又不缩减代码尺寸的方法。<br />
除了包含 <code>-O2</code> 的开关外, <code>-Os</code> 还会使得下列开关禁用。</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-falign-functions </pre></td></tr><tr><td data-num="2"></td><td><pre>-falign-jumps </pre></td></tr><tr><td data-num="3"></td><td><pre>-falign-loops</pre></td></tr><tr><td data-num="4"></td><td><pre>-falign-labels </pre></td></tr><tr><td data-num="5"></td><td><pre>-freorder-blocks </pre></td></tr><tr><td data-num="6"></td><td><pre>-freorder-blocks-and-partition</pre></td></tr><tr><td data-num="7"></td><td><pre>-fprefetch-loop-arrays </pre></td></tr><tr><td data-num="8"></td><td><pre>-ftree-vect-loop-version</pre></td></tr></table></figure><p>另外,对于多个 -O 选项的情形,最后一个加载的为有效。比如 <code>gcc -O1 -Os -O3 –o test test.c</code> ,有效的优化开关为 <code>-O3</code> 。</p>
<p>一般来说,用的最多的是 <code>-O3</code> 和 <code>-Os</code> ,如果遇到程序运行不正常的问题,请降低优化级别,如把 <code>-O3</code> 改为 <code>-O2</code> (情况很少见)。</p>
<h2 id="针对目标机器"><a class="anchor" href="#针对目标机器">#</a> 针对目标机器</h2>
<h3 id="-marchcpu-type"><a class="anchor" href="#-marchcpu-type">#</a> <code>-march=cpu-type</code></h3>
<p>为 cpu-type 所针对的机器开启需要的指令集。</p>
<p>cpu-type 可以为 pentium4、core2、athlon-4 等(具体参见文档),比如 <code>-march=core2</code> 时,则会开启 core2 所支持的 <code>MMX、SSE、SSE2、SSE3、SSSE3</code> 指令集。</p>
<p>另外还支持 <code>native</code> 类型,为编译器所在目前的 CPU 类型优化指令集,指定 <code>-march=native</code> 。</p>
<h3 id="-mfpmathunit"><a class="anchor" href="#-mfpmathunit">#</a> <code>-mfpmath=unit</code></h3>
<p>选择浮点运算单元。</p>
<p><code>unit</code> 可以为 <code>387</code> 和 <code>sse</code> 。</p>
<p><code>387</code> 为 x86 系列的默认值,使用标准的 387 浮点协处理器。</p>
<p><code>sse</code> 为 x64 的默认值,使用 <code>sse</code> 指令集。</p>
<p>一般你的程序如果有大量的浮点运算的话,在 P4 和 K8 以上级别的处理器上推荐开启 <code>-mfpmath=sse</code> 。</p>
<h3 id="加载指定指令集"><a class="anchor" href="#加载指定指令集">#</a> 加载指定指令集</h3>
<p>可以使用 <code>-msse2</code> 或 <code>-msse4.1</code> 加载指定的指令集。</p>
<h2 id="其他比较有效的选项"><a class="anchor" href="#其他比较有效的选项">#</a> 其他比较有效的选项</h2>
<h3 id="-ftracer"><a class="anchor" href="#-ftracer">#</a> <code>-ftracer</code></h3>
<p>执行尾部复制以扩大超级块的尺寸,它简化了函数控制流,从而允许其它的优化措施做的更好。单独使用没啥意义,和其他优化选项一起使用很有效。</p>
<h3 id="-ffast-math"><a class="anchor" href="#-ffast-math">#</a> <code>-ffast-math</code></h3>
<p>违反 IEEE/ANSI 标准以提高浮点数计算速度,是个危险的选项,仅在编译不需要严格遵守 IEEE 规范且浮点计算密集的程序考虑采用。不考虑精度时使用这个选项速度会加快。</p>
<h3 id="-fivopts"><a class="anchor" href="#-fivopts">#</a> <code>-fivopts</code></h3>
<p>在 trees 上执行归纳变量优化。</p>
<h3 id="-ftree-parallelize-loopsn"><a class="anchor" href="#-ftree-parallelize-loopsn">#</a> <code>-ftree-parallelize-loops=n</code></h3>
<p>使循环并行化。只当循环无数据依赖时使用,在多核 CPU 上时使用才会有利。</p>
<h3 id="-ftree-loop-linear"><a class="anchor" href="#-ftree-loop-linear">#</a> <code>-ftree-loop-linear</code></h3>
<p>在 trees 上进行线型循环转换。它能够改进缓冲性能并且允许进行更进一步的循环优化。</p>
<h3 id="-fforce-addr"><a class="anchor" href="#-fforce-addr">#</a> <code>-fforce-addr</code></h3>
<p>必须将地址复制到寄存器中才能对他们进行运算。由于所需地址通常在前面已经加载到寄存器中了,所以这个选项可以改进代码。</p>
<h3 id="-floop-interchange"><a class="anchor" href="#-floop-interchange">#</a> <code>-floop-interchange</code></h3>
<p>交换循环变量。</p>
<p>例如:</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>DO J = 1, M</pre></td></tr><tr><td data-num="2"></td><td><pre> DO I = 1, N</pre></td></tr><tr><td data-num="3"></td><td><pre> A(J, I) = A(J, I) * C</pre></td></tr><tr><td data-num="4"></td><td><pre> ENDDO</pre></td></tr><tr><td data-num="5"></td><td><pre>ENDDO</pre></td></tr></table></figure><p>会改变为:</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>DO I = 1, N</pre></td></tr><tr><td data-num="2"></td><td><pre> DO J = 1, M</pre></td></tr><tr><td data-num="3"></td><td><pre> A(J, I) = A(J, I) * C</pre></td></tr><tr><td data-num="4"></td><td><pre> ENDDO</pre></td></tr><tr><td data-num="5"></td><td><pre>ENDDO</pre></td></tr></table></figure><p>改变后,如果 N 比缓冲区大的话,会更有效率。这是因为 Fortran 里数组是以列主元为排列方式的。当然这个选项并不仅仅用于 Fortran,gcc 家族的编译器都有效。</p>
<h3 id="-fvisibilityhidden"><a class="anchor" href="#-fvisibilityhidden">#</a> <code>-fvisibility=hidden</code></h3>
<p>设置默认的 ELF 镜像中符号的可见性为隐藏。使用这个特性可以非常充分的提高连接和加载共享库的性能,生成更加优化的代码,提供近乎完美的 API 输出和防止符号碰撞。我们强烈建议你在编译任何共享库(Dll)的时候使用该选项。</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-fvisibility-inlines-hidden</pre></td></tr></table></figure><p>默认隐藏所有内联函数,从而减小导出符号表的大小,既能缩减文件的大小,还能提高运行性能,强烈建议你在编译任何共享库的时候使用该选项。</p>
<h3 id="-minline-all-stringops"><a class="anchor" href="#-minline-all-stringops">#</a> <code>-minline-all-stringops</code></h3>
<p>默认时 GCC 只将确定目的地会被对齐在至少 4 字节边界的字符串操作内联进程序代码。该选项启用更多的内联并且增加二进制文件的体积,但是可以提升依赖于高速 <code>memcpy</code> , <code>strlen</code> , <code>memset</code> 操作的程序的性能。</p>
<h3 id="-m64"><a class="anchor" href="#-m64">#</a> <code>-m64</code></h3>
<p>生成专门运行于 64 位环境的代码,不能运行于 32 位环境,仅用于 x86_64 [含 EMT64] 环境。</p>
<h3 id="-fprefetch-loop-arrays"><a class="anchor" href="#-fprefetch-loop-arrays">#</a> <code>-fprefetch-loop-arrays</code></h3>
<p>生成数组预读取指令,对于使用巨大数组的程序可以加快代码执行速度,适合数据库相关的大型软件等。具体效果如何取决于代码。不能和 <code>-Os</code> 一起使用。</p>
<h3 id="-pipe"><a class="anchor" href="#-pipe">#</a> <code>-pipe</code></h3>
<p>在编译过程的不同阶段之间使用管道而非临时文件进行通信,可以加快编译速度。建议使用。</p>
<h2 id="推荐选项开关"><a class="anchor" href="#推荐选项开关">#</a> 推荐选项开关</h2>
<p>综上,比较<strong>安全</strong>的<strong>开关</strong>为</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-pipe</pre></td></tr><tr><td data-num="2"></td><td><pre>-O3 (-Os)</pre></td></tr><tr><td data-num="3"></td><td><pre>-march=native</pre></td></tr><tr><td data-num="4"></td><td><pre>-mfpmath=sse</pre></td></tr><tr><td data-num="5"></td><td><pre>-msse2</pre></td></tr><tr><td data-num="6"></td><td><pre>-ftracer</pre></td></tr><tr><td data-num="7"></td><td><pre>-fivopts</pre></td></tr><tr><td data-num="8"></td><td><pre>-ftree-loop-linear</pre></td></tr><tr><td data-num="9"></td><td><pre>-fforce-addr</pre></td></tr></table></figure><p>如果不需要多高的精度,比如 GUI 框架之类,加入:</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-ffast-math</pre></td></tr></table></figure><p>如果是编译的是共享库( <code>.dll</code> , <code>.a</code> )加入</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-fvisibility=hidden</pre></td></tr><tr><td data-num="2"></td><td><pre>-fvisibility-inlines-hidden</pre></td></tr></table></figure><p><strong>注意某些比赛不能使用 <code>-O1</code> , <code>-O2</code> , <code>-O3</code> , <code>-Os</code> .</strong></p>
<h1 id="底层优化坑"><a class="anchor" href="#底层优化坑">#</a> 底层优化(坑)</h1>
<h2 id="io-优化"><a class="anchor" href="#io-优化">#</a> I/O 优化</h2>
<p>I/O 优化是卡常中最常用的技巧,当数据较大的时候,读入输出占用了很多时间。</p>
<h3 id="读入优化"><a class="anchor" href="#读入优化">#</a> 读入优化</h3>
<p>流输入方式很方便,不需要记忆占位符,但每次读入时,它都要检测是否和 <code>stdin</code> 的同步(是否被 <code>freopen</code> 改变 / 是否被 <code>scanf</code> 读取),因此它是可以和 <code>scanf</code> 混用的。但也导致了它每次都要从数据开始位置跳转到当前读入的位置,浪费了大量时间,可以用 <code>std::ios::sync_with_stdio(false);</code> 关闭两者的同步以加快速度,这样做之后会比 <code>scanf</code> 还快!但必须注意,调用后不能再用 <code>freopen</code> ,但是还可以用 <code>fstream</code> 。</p>
<p>当然,更好的方法是用 <code>getchar</code> 自己写读入函数。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token function">read</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">&</span>sum<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">char</span> ch <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">int</span> tf <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre> sum <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>ch <span class="token operator"><</span> <span class="token char">'0'</span> <span class="token operator">||</span> ch <span class="token operator">></span> <span class="token char">'9'</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token punctuation">(</span>ch <span class="token operator">!=</span> <span class="token char">'-'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> ch <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> tf <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>ch <span class="token operator">==</span> <span class="token char">'-'</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token punctuation">(</span>ch <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span>ch <span class="token operator">>=</span> <span class="token char">'0'</span> <span class="token operator">&&</span> ch <span class="token operator"><=</span> <span class="token char">'9'</span><span class="token punctuation">)</span> sum <span class="token operator">=</span> sum <span class="token operator">*</span> <span class="token number">10</span> <span class="token operator">+</span> <span class="token punctuation">(</span>ch <span class="token operator">-</span> <span class="token number">48</span><span class="token punctuation">)</span><span class="token punctuation">,</span> ch <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token punctuation">(</span>tf<span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token punctuation">(</span>sum <span class="token operator">=</span> <span class="token operator">-</span>sum<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><div class="note primary">
<p>编者注:</p>
<p>补充一份我自己使用的快读:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">inline</span> <span class="token keyword">int</span> <span class="token function">read</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">int</span> x <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> c <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> f <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span>c <span class="token operator"><</span> <span class="token char">'0'</span> <span class="token operator">||</span> c <span class="token operator">></span> <span class="token char">'9'</span><span class="token punctuation">)</span> f <span class="token operator">|=</span> c <span class="token operator">==</span> <span class="token char">'-'</span><span class="token punctuation">,</span> c <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span>c <span class="token operator">>=</span> <span class="token char">'0'</span> <span class="token operator">&&</span> c <span class="token operator"><=</span> <span class="token char">'9'</span><span class="token punctuation">)</span> x <span class="token operator">=</span> x <span class="token operator">*</span> <span class="token number">10</span> <span class="token operator">+</span> c <span class="token operator">-</span> <span class="token char">'0'</span><span class="token punctuation">,</span> c <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">return</span> f <span class="token operator">?</span> <span class="token operator">-</span>x <span class="token operator">:</span> x<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>优势:更短,且不会因为代码格式化而展开。</p>
</div>
<p>这样效率有了很大的提升,而且可以和 <code>scanf</code> 混用(字符串等),第 7 行和第 10 行的代码后面会说。</p>
<p>我们知道, <code>getchar</code> 是逐字符读取的,在 <code>stdio.h</code> 中,有一个 <code>fread</code> 函数,能整段读取,比 <code>getchar</code> 还快,并且支持 <code>freopen</code> (完美兼容)和 <code>fopen</code> (需要把下面的所有 <code>stdin</code> 改成你的文件指针)。</p>
<p>函数原型: <code>size_t fread(void *buffer, size_t size, size_t count, FILE *stream);</code></p>
<p>作用:从 <code>stream</code> 中读取 <code>count</code> 个大小为 <code>size</code> 个字节的数据,放到数组 <code>buffer</code> 中,返回成功了多少个大小为 size 个字节的数据。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">inline</span> <span class="token keyword">char</span> <span class="token function">nc</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">static</span> <span class="token keyword">char</span> buf<span class="token punctuation">[</span><span class="token number">1000000</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token operator">*</span>p1 <span class="token operator">=</span> buf<span class="token punctuation">,</span> <span class="token operator">*</span>p2 <span class="token operator">=</span> buf<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">return</span> p1 <span class="token operator">==</span> p2 <span class="token operator">&&</span> <span class="token punctuation">(</span>p2 <span class="token operator">=</span> <span class="token punctuation">(</span>p1 <span class="token operator">=</span> buf<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token function">fread</span><span class="token punctuation">(</span>buf<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">1000000</span><span class="token punctuation">,</span> <span class="token constant">stdin</span><span class="token punctuation">)</span><span class="token punctuation">,</span> p1 <span class="token operator">==</span> p2<span class="token punctuation">)</span> <span class="token operator">?</span> <span class="token constant">EOF</span> <span class="token operator">:</span> <span class="token operator">*</span>p1<span class="token operator">++</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment">//#define nc getchar</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token function">read</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">&</span>sum<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">char</span> ch <span class="token operator">=</span> <span class="token function">nc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">int</span> tf <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="9"></td><td><pre> sum <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>ch <span class="token operator"><</span> <span class="token char">'0'</span> <span class="token operator">||</span> ch <span class="token operator">></span> <span class="token char">'9'</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token punctuation">(</span>ch <span class="token operator">!=</span> <span class="token char">'-'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> ch <span class="token operator">=</span> <span class="token function">nc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="11"></td><td><pre> tf <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>ch <span class="token operator">==</span> <span class="token char">'-'</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token punctuation">(</span>ch <span class="token operator">=</span> <span class="token function">nc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span>ch <span class="token operator">>=</span> <span class="token char">'0'</span> <span class="token operator">&&</span> ch <span class="token operator"><=</span> <span class="token char">'9'</span><span class="token punctuation">)</span> sum <span class="token operator">=</span> sum <span class="token operator">*</span> <span class="token number">10</span> <span class="token operator">+</span> <span class="token punctuation">(</span>ch <span class="token operator">-</span> <span class="token number">48</span><span class="token punctuation">)</span><span class="token punctuation">,</span> ch <span class="token operator">=</span> <span class="token function">nc</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token punctuation">(</span>tf<span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token punctuation">(</span>sum <span class="token operator">=</span> <span class="token operator">-</span>sum<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>但要注意,由于这种方法是整段读取的,这也造就了它两个巨大的缺陷:</p>
<ol>
<li><strong>不能用键盘输入。数据还没输入,程序怎么整段读取。如果你需要在电脑上用键盘输入调试,请把第 6 行的注释取消。</strong></li>
<li><strong>不能和 <code>scanf</code> , <code>getchar</code> 等其他读入方法混合使用。因为 fread 是整段读取的,也就是说所有数据都被读取了,其他函数根本读取不到任何东西(只能从你的读取大小后面开始读),因此,所有类型的变量读入都必须自己写,上面的 <code>read</code> 函数只支持 <code>int</code> 类型。</strong></li>
</ol>
<p>下面是测试,摘自 LibreOJ,单位为毫秒(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>3</mn><mo>×</mo><mn>1</mn><msup><mn>0</mn><mn>6</mn></msup></mrow><annotation encoding="application/x-tex">n=3 \times 10^6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">6</span></span></span></span></span></span></span></span></span></span></span>)。</p>
<table>
<thead>
<tr>
<th>读入方法</th>
<th>编译器</th>
<th><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">,</mo><msup><mn>2</mn><mn>1</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[0,2^1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></th>
<th><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">,</mo><msup><mn>2</mn><mn>3</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[0,2^3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></th>
<th><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">,</mo><msup><mn>2</mn><mn>15</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[0,2^{15})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span><span class="mord mtight">5</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></th>
<th><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">,</mo><msup><mn>2</mn><mn>31</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[0,2^{31})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></th>
<th><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">[</mo><mn>0</mn><mo separator="true">,</mo><msup><mn>2</mn><mn>63</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[0,2^{63})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.064108em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>fread</code></td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>13</td>
<td>13</td>
<td>39</td>
<td>70</td>
<td>111</td>
</tr>
<tr>
<td><code>getchar</code></td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>58</td>
<td>73</td>
<td>137</td>
<td>243</td>
<td>423</td>
</tr>
<tr>
<td><code>cin</code> (关闭同步)</td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>161</td>
<td>147</td>
<td>205</td>
<td>270</td>
<td>394</td>
</tr>
<tr>
<td><code>scanf</code></td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>182</td>
<td>175</td>
<td>256</td>
<td>368</td>
<td>574</td>
</tr>
<tr>
<td><code>cin</code></td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>442</td>
<td>429</td>
<td>706</td>
<td>1039</td>
<td>1683</td>
</tr>
</tbody>
</table>
<p>没错,你没有看错, <code>fread</code> 以压倒性的优势碾压了其他所有方法,而关闭同步的 <code>cin</code> 比 <code>scanf</code> 快,并且读 <code>long long</code> 的时候比 <code>getchar</code> 还要快。</p>
<hr />
<p><strong>下面的内容某些 OI 比赛不支持。慎用!</strong></p>
<p>其实还可以更快, <code>Linux</code> 下 <code>sys/mman.h</code> 中存在函数 <code>mmap</code> , <code>scanf</code> 底层实现时调用的就是 <code>mmap</code> 函数,其作用是把文件映射进内存,这里仅仅给出代码,有兴趣的同学可以自行查阅有关资料。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><sys/mman.h></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">namespace</span> Inputs <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">char</span><span class="token operator">*</span> s<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">24</span><span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token function">io</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="6"></td><td><pre> s <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token keyword">char</span><span class="token operator">*</span><span class="token punctuation">)</span><span class="token function">mmap</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">,</span> <span class="token number">1</span> <span class="token operator"><<</span> <span class="token number">26</span><span class="token punctuation">,</span> PROT_READ<span class="token punctuation">,</span> MAP_PRIVATE<span class="token punctuation">,</span> <span class="token function">fileno</span><span class="token punctuation">(</span><span class="token constant">stdin</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">void</span> <span class="token function">scan</span><span class="token punctuation">(</span><span class="token keyword">char</span><span class="token operator">*</span> u<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">*</span>s <span class="token operator"><</span> <span class="token number">48</span><span class="token punctuation">)</span> <span class="token operator">++</span>s<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">*</span>s <span class="token operator">></span> <span class="token number">32</span><span class="token punctuation">)</span> <span class="token operator">*</span>u<span class="token operator">++</span> <span class="token operator">=</span> <span class="token operator">*</span>s<span class="token operator">++</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token operator">*</span>u <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token keyword">int</span> <span class="token function">scan</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token keyword">int</span> Hibiki <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> v <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">*</span>s <span class="token operator"><</span> <span class="token number">48</span><span class="token punctuation">)</span> v <span class="token operator">=</span> <span class="token operator">*</span>s<span class="token operator">++</span> <span class="token operator">^</span> <span class="token number">45</span> <span class="token operator">?</span> <span class="token number">1</span> <span class="token operator">:</span> <span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span><span class="token operator">*</span>s <span class="token operator">></span> <span class="token number">32</span><span class="token punctuation">)</span> Hibiki <span class="token operator">=</span> Hibiki <span class="token operator">*</span> <span class="token number">10</span> <span class="token operator">+</span> <span class="token operator">*</span>s<span class="token operator">++</span> <span class="token operator">-</span> <span class="token number">48</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="17"></td><td><pre> <span class="token keyword">return</span> Hibiki <span class="token operator">*</span> v<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="18"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="19"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><hr />
<p>有人喜欢用 <code>isdigit</code> 宏,但这个宏在本机测试上的确更慢了,这个宏的效率还有待研究。</p>
<h3 id="输出优化"><a class="anchor" href="#输出优化">#</a> 输出优化</h3>
<p>输出优化并不是十分常用,因为很少有题目要求大量输出,这里仍然给出代码。(第 4 行以后再说)</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">void</span> <span class="token function">write</span><span class="token punctuation">(</span><span class="token keyword">int</span> x<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span><span class="token function">putchar</span><span class="token punctuation">(</span><span class="token char">'0'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token punctuation">(</span>x <span class="token operator"><</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token punctuation">(</span><span class="token function">putchar</span><span class="token punctuation">(</span><span class="token char">'-'</span><span class="token punctuation">)</span><span class="token punctuation">,</span> x <span class="token operator">=</span> <span class="token operator">-</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">static</span> <span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">26</span><span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">int</span> tp <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">while</span> <span class="token punctuation">(</span>x <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="7"></td><td><pre> a<span class="token punctuation">[</span><span class="token operator">++</span>tp<span class="token punctuation">]</span> <span class="token operator">=</span> x <span class="token operator">%</span> <span class="token number">10</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre> x <span class="token operator">/=</span> <span class="token number">10</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> tp<span class="token punctuation">;</span> i <span class="token operator">></span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token function">putchar</span><span class="token punctuation">(</span>a<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token char">'0'</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>如果你按照上面的代码打,那只能说明你的想象力不够, <code>fwrite</code> 扑进 <code>fread</code> 的怀里失声痛哭。 <code>fwrite</code> 的优势被你完美地抛弃了,取而代之的是逐字符输出的 <code>putchar</code> 。</p>
<p>函数原形:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>size_t <span class="token function">fwrite</span><span class="token punctuation">(</span><span class="token keyword">const</span> <span class="token keyword">void</span> <span class="token operator">*</span>buffer<span class="token punctuation">,</span> size_t size<span class="token punctuation">,</span> size_t count<span class="token punctuation">,</span> FILE <span class="token operator">*</span>stream<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>作用:把 <code>buffer</code> 中的数据拆成大小为 <code>size</code> 个字节的数据,输出前 <code>count</code> 个到 <code>stream</code> 中,实际成功写入的大小为 <code>size</code> 的数据块数目。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">namespace</span> Ostream <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">static</span> <span class="token keyword">const</span> <span class="token keyword">int</span> BUF <span class="token operator">=</span> <span class="token number">50000000</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">char</span> buf<span class="token punctuation">[</span>BUF<span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token operator">*</span>h <span class="token operator">=</span> buf<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token function">put</span><span class="token punctuation">(</span><span class="token keyword">char</span> ch<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="5"></td><td><pre> h <span class="token operator">==</span> buf <span class="token operator">+</span> BUF <span class="token operator">?</span> <span class="token punctuation">(</span><span class="token function">fwrite</span><span class="token punctuation">(</span>buf<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> BUF<span class="token punctuation">,</span> <span class="token constant">stdout</span><span class="token punctuation">)</span><span class="token punctuation">,</span> h <span class="token operator">=</span> buf<span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token operator">*</span>h<span class="token operator">++</span> <span class="token operator">=</span> ch<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token function">putint</span><span class="token punctuation">(</span><span class="token keyword">int</span> num<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token keyword">static</span> <span class="token keyword">char</span> _buf<span class="token punctuation">[</span><span class="token number">30</span><span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token function">sprintf</span><span class="token punctuation">(</span>_buf<span class="token punctuation">,</span> <span class="token string">"%d"</span><span class="token punctuation">,</span> num<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//(*)</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">char</span> <span class="token operator">*</span>s <span class="token operator">=</span> _buf<span class="token punctuation">;</span> <span class="token operator">*</span>s<span class="token punctuation">;</span> s<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token function">put</span><span class="token punctuation">(</span><span class="token operator">*</span>s<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token function">finish</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">fwrite</span><span class="token punctuation">(</span>buf<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">,</span> h <span class="token operator">-</span> buf<span class="token punctuation">,</span> <span class="token constant">stdout</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token punctuation">}</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>有人也许会说,上面的代码的 (*) 处还可以优化,但这个优化的意义并不大,当然,也可以优化。</p>
<p>下面是测试:</p>
<p>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>5</mn><mo>×</mo><mn>1</mn><msup><mn>0</mn><mn>6</mn></msup></mrow><annotation encoding="application/x-tex">n = 5 \times 10^6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">6</span></span></span></span></span></span></span></span></span></span></span> , rand)</p>
<p>Clock Rate: 3.70 GHz</p>
<p>RAM: 4 GB</p>
<table>
<thead>
<tr>
<th>方法</th>
<th>编译器</th>
<th>时间 (ms)</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>printf</code></td>
<td>G++ 5.4.0</td>
<td>21278</td>
</tr>
<tr>
<td><code>sprintf</code> + <code>puts</code></td>
<td>G++ 5.4.0</td>
<td>21426</td>
</tr>
<tr>
<td>纯 <code>sprintf</code> 不输出</td>
<td>G++ 5.4.0</td>
<td>540</td>
</tr>
<tr>
<td><code>fprintf(stdin)</code></td>
<td>G++ 5.4.0</td>
<td>26037</td>
</tr>
<tr>
<td><code>putchar</code></td>
<td>G++ 5.4.0</td>
<td>98556</td>
</tr>
<tr>
<td><code>sprintf</code> + <code>fwrite</code></td>
<td>G++ 5.4.0</td>
<td>607</td>
</tr>
</tbody>
</table>
<p>由上表得, <code>sprintf</code> 的复杂度并不高, <code>fwrite</code> 也没有给 <code>fread</code> 丢脸。而 <code>fprintf</code> 的表现却让人大跌眼镜。 <code>getchar</code> 的结果很可能具有偶然性,反正上面的数据是在小编的机器上用同一组随机数测的。</p>
<h2 id="位运算"><a class="anchor" href="#位运算">#</a> 位运算</h2>
<p>在很多时候,我们会听到很多有关位运算的追捧,像 “位运算的常数很小,比加减法还要快”。这是真的吗?</p>
<h3 id="左移和右移的天上地下"><a class="anchor" href="#左移和右移的天上地下">#</a> 左移和右移的天上地下</h3>
<p>下面有两段代码:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdio></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">int</span> x <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> x <span class="token operator"><<=</span> <span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdio></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">int</span> x <span class="token operator">=</span> <span class="token number">5</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">void</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> x <span class="token operator">*=</span> <span class="token number">2</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>它们理论上是等价的,但 g++ 翻译成汇编后呢?</p>
<p>两段代码的汇编代码是一样的!下面是 <code>x<<=1</code> 和 <code>x*=2</code> 被翻译后的代码。</p>
<pre><code class="language-assembly">addl %eax, %eax
</code></pre>
<p>它等价于 <code>a=a+a</code> 。是不是被打脸了,响不响,痛不痛,红不红,痒不痒…… 好吧,从上面的例子可以看出,某些时候自作聪明的优化并没有任何用。</p>
<p>那乘以 4 呢?翻译后的代码还是一样的:</p>
<pre><code class="language-assembly">sall $2, %eax
</code></pre>
<p>上面的代码等价于 <code>x<<=2</code> 。现在死心了吧。</p>
<p>或许你还执着于 <code>x*=10</code> 。这次翻译后的汇编代码终于不一样了,下面是 <code>x*=10</code> 的汇编代码( <code>-O2</code> 优化):</p>
<pre><code class="language-assembly">leal (%eax,%eax,4), %eax
addl %eax, %eax
</code></pre>
<p>只有两条指令:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>x<span class="token operator">=</span>x<span class="token operator">+</span>x<span class="token operator">*</span><span class="token number">4</span> <span class="token comment">// 别看是加法和乘法,却是一条指令完成</span></pre></td></tr><tr><td data-num="2"></td><td><pre>x<span class="token operator">=</span>x<span class="token operator">+</span>x <span class="token comment">// 加法还不容易吗</span></pre></td></tr></table></figure><p>那些喜欢用 <code>x=(x<<3)+(x<<1)</code> 的人请自重。</p>
<p>那是不是说位运算一无所用呢?并不是,在除法方面有不少用处。</p>
<p>右移的汇编代码:</p>
<pre><code class="language-assembly"> movl _x, %eax
sarl %eax
movl %eax, _x
movl _x, %eax
</code></pre>
<p>除以 2 的代码:</p>
<pre><code class="language-assembly"> movl _x, %eax
movl %eax, %edx ;(del)
shrl $31, %edx ;(del)
addl %edx, %eax ;(del)
sarl %eax
movl %eax, _x
movl _x, %eax
</code></pre>
<p>整整多了三行。</p>
<p>但这种情况仅限于有符号的整数,因为有符号的整数的右移和除法不是同一个东西,编译器还需要修正一下。<br />
如果用的是 <code>unsigned</code> 类型,那汇编代码又一样了。</p>
<h3 id="mod-和-and-的战争"><a class="anchor" href="#mod-和-and-的战争">#</a> Mod 和 And 的战争</h3>
<p>下面是 <code>x%2</code> 的代码( <code>-O2</code> ):</p>
<pre><code class="language-assembly"> movl _x, %eax
movl $LC0, (%esp)
movl %eax, %edx ;(del)
shrl $31, %edx ;(del)
addl %edx, %eax ;(del)
andl $1, %eax
subl %edx, %eax ;(del)
movl %eax, 4(%esp)
movl %eax, _x
</code></pre>
<p>那 <code>x&1</code> 呢?少了 4 条语句( <code>-O2</code> ):</p>
<pre><code class="language-assembly"> movl _x, %eax
movl $LC0, (%esp)
andl $1, %eax
movl %eax, 4(%esp)
movl %eax, _x
</code></pre>
<h3 id="xor-和-temp-的故事"><a class="anchor" href="#xor-和-temp-的故事">#</a> Xor 和 temp 的故事</h3>
<p>相信大家在学交换两个变量的值的时候一定会先学习所谓的 “三变量交换法”,然后就被异或取代了。</p>
<p>下面是异或( <code>a^=b^=a^=b</code> )的汇编:</p>
<pre><code class="language-assembly"> movl _b, %edx
movl _a, %eax
xorl %edx, %eax
xorl %eax, %edx
xorl %edx, %eax
movl %eax, _a
xorl %eax, %eax
movl %edx, _b
</code></pre>
<p>有 <code>movl</code> 指令和 <code>xorl</code> 指令各 4 条。<br />
那三变量交换法( <code>int t=a; a=b, b=t;</code> )呢?</p>
<pre><code class="language-assembly"> movl _a, %eax
movl _b, %edx
movl %eax, _b
xorl %eax, %eax
movl %edx, _a
</code></pre>
<p>从此,有 temp 再没有异或。</p>
<h3 id="神奇的位运算技巧"><a class="anchor" href="#神奇的位运算技巧">#</a> 神奇的 “位运算技巧”</h3>
<p>网上有很多奇奇怪怪的方法,例如取绝对值 <code>(n^(n>>31))-(n>>31)</code> ,取两个数的最大值 <code>b&((a-b)>>31)|a&(~(a-b)>>31)</code> ,取两个数的最小值 <code>a&((a-b)>>31)|b&(~(a-b)>>31)</code> 。</p>
<p>喜欢用上面代码的人难道没有自己亲自数一数上面有多少条位运算的指令吗?</p>
<p>但凡事没有绝对,还是有一些优秀的例子的:</p>
<p>取<strong>二进制下</strong>最后一个 <code>1</code> 和后面的 <code>0</code> :</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">lowbit</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token operator">=</span><span class="token punctuation">(</span>x<span class="token operator">&</span><span class="token punctuation">(</span><span class="token operator">-</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span></pre></td></tr></table></figure><p>判断一个数是不是 2 的幂:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>n<span class="token operator">></span><span class="token number">0</span><span class="token operator">?</span><span class="token punctuation">(</span>n<span class="token operator">&</span><span class="token punctuation">(</span>n<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token operator">==</span><span class="token number">0</span><span class="token operator">:</span><span class="token boolean">false</span></pre></td></tr></table></figure><h3 id="xor-和网络流的故事"><a class="anchor" href="#xor-和网络流的故事">#</a> Xor 和网络流的故事</h3>
<p>还记得网络流的反向弧?通常某些人喜欢在结构体中新建一个变量来表示这条边的反向弧编号。但这样不免有些浪费,因为在插入新边的时候,我们一般会把两条互为反向弧的边相邻插入,有一个有趣的性质可以完美地解决这个问题:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token punctuation">)</span><span class="token operator">^</span><span class="token number">1</span><span class="token operator">=</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token operator">+</span><span class="token number">1</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token punctuation">(</span><span class="token number">2</span><span class="token operator">*</span>x<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">^</span><span class="token number">1</span><span class="token operator">=</span><span class="token number">2</span><span class="token operator">*</span>x</pre></td></tr></table></figure><p>也就是说,我们可以用异或节省下一个空间。</p>
<p>那在汇编中呢?异或本来就是逻辑运算,一条指令 <code>xorl $1, _x</code> 搞定,但如果用另一个变量呢?编译器需要对变量进行初始化,还多了一条指令。</p>
<h2 id="条件语句"><a class="anchor" href="#条件语句">#</a> 条件语句</h2>
<p>相信条件语句会在程序中经常出现,而且也是不可避免的,谁知道,这么死板的事情还可以再优化。</p>
<h3 id="if-和-的故事"><a class="anchor" href="#if-和-的故事">#</a> <code>if</code> 和 <code>?:</code> 的故事</h3>
<div class="note warning">
<p>编者注:<strong>原文内容存在错误,已删除。</strong></p>
</div>
<blockquote>
<p><strong>if-else 与 <code>?:</code> 运算符本质上相同,大多数情况下所产生的汇编代码完全相同。</strong></p>
<blockquote>
<p>对于下面的两段代码:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">else</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"2"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>x <span class="token operator">==</span> <span class="token number">1</span> <span class="token operator">?</span> <span class="token function">printf</span> <span class="token punctuation">(</span><span class="token string">"1"</span><span class="token punctuation">)</span> <span class="token operator">:</span> <span class="token function">printf</span> <span class="token punctuation">(</span><span class="token string">"2"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>网上有人说,三目运算符比 <code>if</code> 语句快,所以第二段代码就比第一段代码快。</p>
<p>实际上汇编代码是一模一样的,所以运行时间也是一样的。</p>
<p><strong>摘自:<span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Jsb2cvemhhb2ppbnhpL29wdGltaXpl">浅谈底层常数优化及编译器优化 - zhaojinxi 的博客 - 洛谷博客</span></strong></p>
</blockquote>
<p><strong> <code>?:</code> 运算符并不会消除分支预测。</strong></p>
<p>分支预测的原理,是在 if 括号内部的判断语句未执行完成时,<strong>在另一线程中</strong>预测一条分支执行接下来的语句。当判断语句执行完毕时,若执行结果与预测相同,则继续执行该分支语句;若执行结果与预测不同,则重新执行另一分支语句。<strong>分支预测可以充分发挥 CPU 的多线程性能</strong>,避免多余的等待。</p>
<p>分支预测的效率取决于 CPU 的设计。<strong>在大部分情况下,分支预测能加快运算速度</strong>,除非分支预测的准确度极低。毕竟 CPU 的设计者也不是傻子。</p>
<p>分享一篇不错的关于分支预测的文章:<span class="exturl" data-url="aHR0cHM6Ly93d3cuemhpaHUuY29tL3F1ZXN0aW9uLzMwMDk3NTg2NC9hbnN3ZXIvMTgwNTU1ODAyMA==">为什么很多程序员不用 switch,而是大量的 if...else if ...? - 是 Yes 呀的回答 - 知乎</span></p>
</blockquote>
<hr />
<p>下面的内容某些 OI 比赛不支持。<strong>慎用</strong>!</p>
<p>gcc 存在内置函数: <code>__builtin_expect(!!(x), tf)</code></p>
<p>当 <code>tf</code> 为 <code>true</code> 时表示 <code>x</code> 非常可能为 <code>true</code> ,反之同理。</p>
<p>用法: <code>if(__builtin_expect(!!(x), tf))</code></p>
<blockquote>
<p>编者附:</p>
<p>而 <code>GCC</code> 提供了一个内建函数 <code>__builtin_expect</code> ,通过分支预测提高效率,将接下来运行的可能性较大的代码放在靠前的位置,减少指令跳转,这样保证了空间局部性,可以减少 cache miss。但经过测试后发现, <code>__builtin_expect</code> 仅在开启 <code>-O2</code> 优化下有效。</p>
<p>例如下面的代码:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdio></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdlib></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token function">srand</span><span class="token punctuation">(</span><span class="token number">2333</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">int</span> cnt1 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> cnt2 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">1000000000</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">int</span> t <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>t <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token operator">++</span>cnt1<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token operator">++</span>cnt2<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d %d\n"</span><span class="token punctuation">,</span> cnt1<span class="token punctuation">,</span> cnt2<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr></table></figure><figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdio></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdlib></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token function">srand</span><span class="token punctuation">(</span><span class="token number">2333</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">int</span> cnt1 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">,</span> cnt2 <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">1000000000</span><span class="token punctuation">;</span> <span class="token operator">++</span>i<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">int</span> t <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">__builtin_expect</span><span class="token punctuation">(</span>t <span class="token operator"><</span> <span class="token number">10</span><span class="token punctuation">,</span> <span class="token boolean">false</span><span class="token punctuation">)</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token operator">++</span>cnt1<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">else</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token operator">++</span>cnt2<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d %d\n"</span><span class="token punctuation">,</span> cnt1<span class="token punctuation">,</span> cnt2<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr></table></figure><p>使用 <code>__builtin_expect (t < 10, false)</code> 后,编译器把 <code>else</code> 后的语句放到了紧跟着前面的语句的位置,而当 <code>t < 10</code> 为 <code>true</code> 时才进行跳转。</p>
<p><strong>摘自:<span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Jsb2cvemhhb2ppbnhpL29wdGltaXpl">浅谈底层常数优化及编译器优化 - zhaojinxi 的博客 - 洛谷博客</span></strong></p>
</blockquote>
<hr />
<h3 id="switch-和-if-else-的故事"><a class="anchor" href="#switch-和-if-else-的故事">#</a> <code>switch</code> 和 <code>if-else</code> 的故事</h3>
<p>下面有两段代码,你觉得那段更快呢?</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="2"></td><td><pre> x<span class="token operator">++</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token number">2</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="4"></td><td><pre> x <span class="token operator">*=</span> <span class="token number">2</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="6"></td><td><pre> x <span class="token operator">/=</span> <span class="token number">3</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token number">4</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="8"></td><td><pre> x <span class="token operator">>>=</span> <span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>x <span class="token operator">==</span> <span class="token number">5</span><span class="token punctuation">)</span></pre></td></tr><tr><td data-num="10"></td><td><pre> x <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr></table></figure><figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">switch</span> <span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">case</span> <span class="token number">1</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="3"></td><td><pre> x<span class="token operator">++</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">case</span> <span class="token number">2</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="6"></td><td><pre> x <span class="token operator">*=</span> <span class="token number">2</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token keyword">case</span> <span class="token number">3</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="9"></td><td><pre> x <span class="token operator">/=</span> <span class="token number">3</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token keyword">case</span> <span class="token number">4</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="12"></td><td><pre> x <span class="token operator">>>=</span> <span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token keyword">break</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token keyword">case</span> <span class="token number">5</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="15"></td><td><pre> x <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="16"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>显然地,下面的代码更快,因为上面的代码需要逐条判断,而下面的代码直接跳转。</p>
<p>那是不是所有 <code>switch</code> 都比 <code>if</code> 快呢?凡事没有绝对,当 <code>switch</code> 遇到 <code>default</code> 的时候,整个程序的效率就会大打折扣,因为它又回到了 <code>if</code> 的无脑判断模式。再比如,当 <code>if</code> 用来判断区间的时候就比 <code>switch</code> 快, <code>if</code> 只需要做三次逻辑运算(两条判断,一条逻辑与),而 <code>switch</code> 呢?我就呵呵一笑。</p>
<h3 id="短路的故事"><a class="anchor" href="#短路的故事">#</a> 短路的故事</h3>
<p>此短路非彼短路,它指的是一种运算符的特性。</p>
<p>我们常用的逻辑运算符,例如 <code>&&</code> 和 <code>||</code> 都是短路运算符。什么意思呢?比如在运算 <code>A && B</code> 时,如果发现 A 已经为 <code>false</code> ,就不会再计算 B。</p>
<p>现在你能解释第一章中留下的问题了吗?</p>
<p><code>(tf)&&(sum=-sum);</code> 当 <code>tf</code> 为 <code>true</code> 的时候,会执行后面的 <code>sum=-sum</code> ,如果 <code>tf</code> 为 <code>false</code> ,则不会执行后面的 <code>sum=-sum</code> 。</p>
<p>等价于如下语句:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>tf<span class="token punctuation">)</span> sum <span class="token operator">=</span> <span class="token operator">-</span>sum<span class="token punctuation">;</span></pre></td></tr></table></figure><hr />
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>tf <span class="token operator">=</span> <span class="token punctuation">(</span><span class="token punctuation">(</span>ch <span class="token operator">==</span> <span class="token char">'-'</span><span class="token punctuation">)</span> <span class="token operator">&&</span> <span class="token punctuation">(</span>ch <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>当 <code>ch='-'</code> 时,会执行后面的 <code>ch=getchar()</code> ,因为 <code>getchar</code> 一般不会等于 <code>0</code> (如果不放心可以写成 <code>tf=((ch=='-')&&((ch=getchar()),true))</code> ),因此 <code>tf</code> 的结果等于 <code>true</code> 。</p>
<p>当 <code>ch!='-'</code> 时,不会执行后面的 <code>ch=getchar()</code> , <code>tf</code> 的值为 <code>false</code> 。</p>
<p>等价于如下语句:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>ch <span class="token operator">==</span> <span class="token char">'-'</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> tf <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> ch <span class="token operator">=</span> <span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>总结一下:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">if</span><span class="token punctuation">(</span>A<span class="token punctuation">)</span> B<span class="token punctuation">;</span> ⇔ <span class="token punctuation">(</span>A<span class="token punctuation">)</span><span class="token operator">&&</span><span class="token punctuation">(</span>B<span class="token punctuation">)</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">if</span><span class="token punctuation">(</span>A<span class="token punctuation">)</span> B<span class="token punctuation">;</span> <span class="token keyword">else</span> C<span class="token punctuation">;</span> ⇔ A<span class="token operator">&&</span><span class="token punctuation">(</span>B<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token operator">||</span>C</pre></td></tr></table></figure><p>为什么?详情参见下一小节。</p>
<p>如果短路运算符只能改写 <code>if</code> 语句,那这里就不会浪费这么多篇幅来介绍这个东西。事实上,这个东西比我们想象得有用得多。看下面两段代码:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">double</span> t <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>t <span class="token operator">/</span> RAND_MAX <span class="token operator"><</span> <span class="token number">0.2</span> <span class="token operator">&&</span> t <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">double</span> t <span class="token operator">=</span> <span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>t <span class="token operator">!=</span> <span class="token number">0</span> <span class="token operator">&&</span> t <span class="token operator">/</span> RAND_MAX <span class="token operator"><</span> <span class="token number">0.2</span><span class="token punctuation">)</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> t<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>你认为哪一份代码会更快?</p>
<p>好像没什么区别对吧。但对于 CPU 来说很有区别。第一段代码中的 <code>t / RAND_MAX < 0.2</code> 为 <code>true</code> 的概率约为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>20</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">20\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">2</span><span class="mord">0</span><span class="mord">%</span></span></span></span>,但 <code>t!=0</code> 为 <code>true</code> 的概率约为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn>1</mn><mrow><mi>R</mi><mi>A</mi><mi>N</mi><mi>D</mi><mi mathvariant="normal">_</mi><mi>M</mi><mi>A</mi><mi>X</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{RAND\_MAX}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.407108em;vertical-align:-0.5619999999999999em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.845108em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.00773em;">R</span><span class="mord mathnormal mtight">A</span><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span><span class="mord mtight" style="margin-right:0.02778em;">_</span><span class="mord mathnormal mtight" style="margin-right:0.10903em;">M</span><span class="mord mathnormal mtight">A</span><span class="mord mathnormal mtight" style="margin-right:0.07847em;">X</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.5619999999999999em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>,明显小于 20%。<br />
因此,如果把计算一个不含逻辑运算符布尔表达式的计算次数设为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 次,设计算了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 次,则对于第一段代码,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 的数学期望为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>65</mn></mrow><annotation encoding="application/x-tex">65</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">6</span><span class="mord">5</span></span></span></span>,但对于第二段代码,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>X</mi></mrow><annotation encoding="application/x-tex">X</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span></span></span></span> 的数学期望为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mrow><mn>2</mn><mo>×</mo><mo stretchy="false">(</mo><mi>R</mi><mi>A</mi><mi>N</mi><mi>D</mi><mi mathvariant="normal">_</mi><mi>M</mi><mi>A</mi><mi>X</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><mrow><mi>R</mi><mi>A</mi><mi>N</mi><mi>D</mi><mi mathvariant="normal">_</mi><mi>M</mi><mi>A</mi><mi>X</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac{2\times (RAND\_MAX-1)}{RAND\_MAX}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.6139999999999999em;vertical-align:-0.5619999999999999em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0519999999999998em;"><span style="top:-2.6550000000000002em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.00773em;">R</span><span class="mord mathnormal mtight">A</span><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span><span class="mord mtight" style="margin-right:0.02778em;">_</span><span class="mord mathnormal mtight" style="margin-right:0.10903em;">M</span><span class="mord mathnormal mtight">A</span><span class="mord mathnormal mtight" style="margin-right:0.07847em;">X</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.527em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="mbin mtight">×</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.00773em;">R</span><span class="mord mathnormal mtight">A</span><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span><span class="mord mathnormal mtight" style="margin-right:0.02778em;">D</span><span class="mord mtight" style="margin-right:0.02778em;">_</span><span class="mord mathnormal mtight" style="margin-right:0.10903em;">M</span><span class="mord mathnormal mtight">A</span><span class="mord mathnormal mtight" style="margin-right:0.07847em;">X</span><span class="mbin mtight">−</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.5619999999999999em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>,远远大于第一段代码。</p>
<p>总结一下,</p>
<ul>
<li>遇到 <code>A&&B</code> 时,优先把可能为 <code>false</code> 的表达式放在前面。</li>
<li>遇到 <code>A||B</code> 时,优先把可能为 <code>true</code> 的表达式放在前面。</li>
</ul>
<h3 id="布尔表达式和逗号运算符的故事"><a class="anchor" href="#布尔表达式和逗号运算符的故事">#</a> 布尔表达式和逗号运算符的故事</h3>
<p>为什么要专门设置这么一小节呢?<br />
因为很多人喜欢用 <code>if(x==true)</code> ,直接用 <code>if(x)</code> 就好了。还有 <code>x==false</code> 和 <code>!x</code> ,它们也是等价的。</p>
<p>现在,请另一位大佬隆重登场:逗号运算符。</p>
<p>若干条语句可以通过逗号运算符合并成一条语句。<br />
例如 <code>t=a;a=b;b=t;</code> 可以写成 <code>t=a,a=b,b=t;</code> 有什么用吗?它的返回值。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> x<span class="token operator">=</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">6</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">9</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>猜一猜,上面的语句执行完后 <code>x</code> 的值是多少?</p>
<p>答案是 9。没错,逗号运算符的返回值就是最后一个的值。</p>
<p>现在可以解释上一小节留下总结了吧。</p>
<p><code>A&&(B,1)||C</code> :当 <code>A</code> 为 <code>true</code> 时会执行 <code>(B,1)</code> ,返回值为 <code>true</code> ,因此 <code>A&&(B,1)</code> 的返回值为 <code>true</code> ,因此不会执行 <code>C</code> ,当 <code>A</code> 为 <code>false</code> 时,不会执行 <code>(B,1)</code> ,且 <code>A&&(B,1)</code> 的值为 <code>false</code> ,因此会执行 <code>C</code> 。</p>
<h2 id="standard-template-library"><a class="anchor" href="#standard-template-library">#</a> Standard Template Library</h2>
<p>如果能熟练使用 STL,则可以大大减小代码复杂度,提高对于部分人的可读性(前提是那个人也会 STL)。但在很多 OI 比赛中,STL 会成为性能瓶颈(不仅仅是常数瓶颈),而且要明白:对于 STL 来说, <code>-O2</code> 的开与否带来的不仅仅是几毫秒的差,而是一种蜕变!</p>
<h3 id="容器"><a class="anchor" href="#容器">#</a> 容器</h3>
<h4 id="完全连续容器"><a class="anchor" href="#完全连续容器">#</a> 完全连续容器</h4>
<p>在 STL 中,唯一的真正意义上的完全连续容器应该只有 <code>vector</code> 和 <code>bitset</code> 了,其中, <code>vector</code> 中的所有元素都是连续的,但它是怎么做到的?在某些编译器中,它实现内存分配的方法是当前的容量不足时,申请一块当前容量 2 倍的新内存空间,然后将所有的老元素全部拷贝到新内存中,添加大量元素的时候的花费的惊人的大。和 <code>allocator</code> 的时间复杂度一样。</p>
<p>函数原型: <code>extern void *realloc(void *memory, unsigned int newsize);</code></p>
<p>作用:把 <code>memory</code> 开头的指针所占用的空间修改成 <code>newsize</code> 个字节大小。</p>
<p>内部是怎么实现的?在内存中寻找一片足够大的连续空间,然后把原来地方的数据拷到新空间中。</p>
<p>听着就觉慢,因此在 <code>vector</code> 需要存储大量数据的时候,尽量不要用 <code>push_back</code> ,直接用 <code>resize(size_type size)</code> 函数改变大小,或者先用 <code>reserve(size_type size)</code> 函数预留空间,然后再用 <code>push_back</code> 方法,这样能尽可能地降低其弊端。</p>
<p>但由于其是完全连续容器,因此在查找的时候效率和普通数组没有太大区别。</p>
<p>邻接表有两种实用的方法,一种是前向星(有人也叫向前星,这里以百度百科为准),另一种就是用 <code>vector</code> 。</p>
<p>尽管 <code>vector</code> 修改大小的时候会很浪费时间,但要知道, <code>vector</code> 可是一个完全连续容器,相比前向星好了不知道多少(从一个数组里跳来跳去)。</p>
<p>在某些需要频繁访问边(例如网络流和最短路),遇到很稠密的图的时候, <code>vector</code> 完全连续的作用就被发挥到了最大,而动态开辟空间的消耗也已被降到了最低最低,尤其是在开了 <code>-O2</code> 优化的时候。</p>
<p>下面分别是 <code>vector</code> 和前向星跑网络流(ISap)的用时。(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>=</mo><mn>50</mn><mi>n</mi></mrow><annotation encoding="application/x-tex">m=50n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">5</span><span class="mord">0</span><span class="mord mathnormal">n</span></span></span></span>)</p>
<table>
<thead>
<tr>
<th>存图方法</th>
<th>编译器</th>
<th><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>1</mn><msup><mn>0</mn><mn>4</mn></msup></mrow><annotation encoding="application/x-tex">n=10^4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span></span></span></span></th>
<th><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>1</mn><msup><mn>0</mn><mn>5</mn></msup></mrow><annotation encoding="application/x-tex">n=10^5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span></span></span></span></span></span></span></span></th>
<th><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>=</mo><mn>5</mn><mo>×</mo><mn>1</mn><msup><mn>0</mn><mn>5</mn></msup></mrow><annotation encoding="application/x-tex">n=5 \times 10^5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span></span></span></span></span></span></span></span></th>
</tr>
</thead>
<tbody>
<tr>
<td><code>vector</code></td>
<td>G++ 5.4.0</td>
<td>501ms</td>
<td>1108ms</td>
<td>5103ms</td>
</tr>
<tr>
<td><code>vector</code></td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>365ms</td>
<td>794ms</td>
<td>3855ms</td>
</tr>
<tr>
<td>前向星</td>
<td>G++ 5.4.0</td>
<td>478ms</td>
<td>1025ms</td>
<td>5111ms</td>
</tr>
<tr>
<td>前向星</td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>477ms</td>
<td>1017ms</td>
<td>5109ms</td>
</tr>
</tbody>
</table>
<p>十分明显地,开了 <code>-O2</code> 优化的 <code>vector</code> 跑得飞快,而随着数据大小的上升,vector 的速度也越来越快。</p>
<p><code>bitset</code> 的大小是在编译时就被固定了,因此不会出现和 <code>vector</code> 一样浪费时间的情况。它的最大作用是节约空间。那里节约空间了?要知道,C++ 的任何类型都至少占用一个字节,包括 <code>bool</code> 。因此, <code>bool</code> 会浪费七个字节的空间。但其实 <code>bitset</code> 也是可以自己实现的。</p>
<div class="note warning">
<p>编者注:<strong>原文内容存在争议,已删除。<strong>通常情况下,</strong> <code>int</code> 运算速度比 <code>long long</code> 快不少</strong>。</p>
</div>
<h4 id="部分连续容器"><a class="anchor" href="#部分连续容器">#</a> 部分连续容器</h4>
<p>如果你认为 <code>queue</code> (一种容器适配器)和 <code>deque</code> 应该在上一章出现,那你就错了。事实上,它们并不是完全连续容器。它们内部的实现有点诡谲。为什么这样说呢?因为它们在内存中是部分连续的,也就是说,当内存不够的时候,它们就会再申请一段,然后再连接过去,因此在内存中,它们是不完全连续的,是多个内存块组成的,每个块中存放的元素连续内存,而内存块又像链表一样连接起来。</p>
<p>因为有了这种方法,它们不需要每次申请空间时,都像 <code>vector</code> 一样复制原来的元素。而是可以在常数时间内完成这个操作。因为它们在内存中是不完全连续的,因此速度不会太低。也可以很好地避免循环队列大小估计错误的可能。</p>
<p>但要注意是否会出现对空队列取队首或出队的操作,而且由于每次都会申请一大段的连续空间,因此需要注意空间的开销。</p>
<p>当我做完测试后却大吃一惊。</p>
<table>
<thead>
<tr>
<th>实现方法</th>
<th>编译器</th>
<th>时间</th>
</tr>
</thead>
<tbody>
<tr>
<td>arr: <code>queue</code></td>
<td>G++ 5.4.0</td>
<td>25 ms</td>
</tr>
<tr>
<td>arr: <code>queue</code></td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>15 ms</td>
</tr>
<tr>
<td>stl: <code>queue</code></td>
<td>G++ 5.4.0</td>
<td>433 ms</td>
</tr>
<tr>
<td>stl: <code>queue</code></td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>31ms</td>
</tr>
<tr>
<td>arr: <code>deque</code></td>
<td>G++ 5.4.0</td>
<td>16 ms</td>
</tr>
<tr>
<td>arr: <code>deque</code></td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>4 ms</td>
</tr>
<tr>
<td>stl: <code>deque</code></td>
<td>G++ 5.4.0</td>
<td>850 ms</td>
</tr>
<tr>
<td>stl: <code>deque</code></td>
<td>G++ 5.4.0 ( <code>-O2</code> )</td>
<td>58 ms</td>
</tr>
</tbody>
</table>
<p>为什么会出现这种情况?</p>
<p>其实 <code>queue</code> 默认实现方法是封装 <code>deque</code> ,通过更改模板参数可以使用 <code>vector</code> 和 <code>list</code> 实现。而 <code>deque</code> 呢?由于其内存不完全连续,因此导致了过多的内存跳转,浪费了大量时间,由此可得,部分连续容器和完全连续容器的效率差极大。</p>
<p>因此,在能使用连续空间的情况下,尽可能地使用完全连续容器。</p>
<h4 id="节点容器"><a class="anchor" href="#节点容器">#</a> 节点容器</h4>
<p>节点容器就比较多了。常见的 <code>map</code> , <code>set</code> 和 <code>list</code> 都属于它的范畴。</p>
<p>其中, <code>list</code> 有点像 <code>deque</code> ,和其原理差不多,只是内存块的大小恒为 1,插入和删除都可以在常数时间内完成。唯一的缺点是不支持二分查找和随机访问。而且由于 <code>list</code> 是不连续容器,因此它的查询会导致内存频繁地跳转,因此只有在经常需要增加或删除的时候才会考虑使用 <code>list</code> 。</p>
<p><code>set</code> 和 <code>map</code> 属于关联容器,关联容器支持高效的关键字查找和访问,内部是以一种叫做红黑树的 BST 实现的,但它太复杂了,它的插入有 5 种情况,删除有 6 种情况,是 “当今信息界中平均速度最快的 BST”,比我们在 OI 比赛中有能力在时间内手动实现的 BST 快得多。</p>
<p>因此, <code>set</code> 和 <code>map</code> 的查询时间和红黑树的时间复杂度一致,基本上所有操作都是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>log</mi><mo></mo><mi>s</mi><mi>i</mi><mi>z</mi><mi>e</mi></mrow><annotation encoding="application/x-tex">\log size</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">s</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span><span class="mord mathnormal">e</span></span></span></span> 级别的,包括迭代器的 <code>++</code> 和 <code>—</code> 操作,它们在 BST 中相当于求前驱和后继。而且由于它们是节点容器,因此在内存中是断续的,反复地跳转可能导致更多的开销。</p>
<p>但当需要自己实现部分(不包括一些特别的功能,例如求排名)平衡树的功能时,用 <code>set</code> 和 <code>map</code> 一般会比手写更优。</p>
<p>如果遇到了不能用 <code>set</code> 和 <code>map</code> 的情况,并不推荐用 Splay,因为它的常数太大了,这里推荐一种极好的 BST: <span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMTU1MDk3L2FydGljbGUvZGV0YWlscy84MzM3ODE2Ng==">替罪羊树 (Scapegoat Tree)</span>,它的思想非常简单:当且仅当某棵子树的不平衡度超过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.0037em;">α</span></span></span></span> 时,暴力重构整棵子树,从而避免了旋转的操作。</p>
<hr />
<div class="note info">
<p>本文转载自:<span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMTU1MDk3L2FydGljbGUvZGV0YWlscy84MzA4MzA1MQ==">https://blog.csdn.net/qq_40155097/article/details/83083051</span></p>
<p>原作者:<span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMTU1MDk3">Victor Miller</span></p>
<p>版权声明:本文为 <span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMTU1MDk3">Victor Miller</span> 原创文章,遵循 <span class="exturl" data-url="aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLw==">CC 4.0 BY-SA</span> 版权协议,转载请附上原文出处链接和本声明。</p>
</div>
<p>推荐阅读:</p>
<p><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Jsb2cvZW5jb3JlL2lvLXlvdS1odWEtbmVpLXN1by1zaGk=">浅谈 C++ IO 优化 —— 读优输优方法集锦 - encore 的博客 - 洛谷博客</span></p>
<p><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Jsb2cvemhhb2ppbnhpL29wdGltaXpl">浅谈底层常数优化及编译器优化 - zhaojinxi 的博客 - 洛谷博客</span></p>
2021-02-14T05:00:00.000Z
https://fidel.js.org/2020/11/15/2020-CSPS-NOIP/
CSP-S 2020 游记 & NOIP 2020 爆零记
<blockquote>
<p><s>不会真有人现在才写游记吧(</s></p>
</blockquote>
<span id="more"></span>
<h1 id="csp-s1"><a class="anchor" href="#csp-s1">#</a> CSP-S1</h1>
<p><s>没啥好说的,莫名其妙就 72.5 分了。</s></p>
<p>居然用高考答题卡考 CSP,<s>不愧是 €€£</s>。</p>
<p>阅读程序出现了史无前例的 99 行程序,<s>就差破个百了</s>。</p>
<p>C++:终于想起我是门面向对象语言了?</p>
<p>考后打了张 Excel 算了下分,居然发现最后 5 分钟蒙对了两道 4 分题,总计 8 分!<s>(虽然说就算没蒙对也能过分数线)</s></p>
<h1 id="csp-s2"><a class="anchor" href="#csp-s2">#</a> CSP-S2</h1>
<p>考场:广东大学附属中学(大学城校区)</p>
<h2 id="开局出师不利"><a class="anchor" href="#开局出师不利">#</a> 开局:出师不利</h2>
<p><s>某位同学高兴地一路狂奔…… 然后扑街了。(开幕雷击)</s></p>
<p>我也没好哪去,跟着人群走,走到 4 楼才发现走错楼了……</p>
<p>开考前 15 分钟,才发现没打印疫情须知,还好监考老师有,<s>差点当场退役</s>。</p>
<p>匆匆忙忙填完须知,监考老师在名单上看了又看,我才意识到走到隔壁考场去了……</p>
<p>这次考场不能带水进去,可能是怕由于打翻水壶而引发的 “机房惨案”。</p>
<p>考试机器居然装的是 Windows 10(神州网信版)!AMD 6-Core CPU! 8 GiB Memory!</p>
<p>先习惯性在机子里到处翻翻,在 C 盘发现一个神秘文件夹,文件夹里有一压缩包,压缩包里又有一压缩包(迷惑),里面居然有 Sublime Text 3 的安装包!<s>可把我激动坏了。</s></p>
<p>考试机默认装了 Dev C++ 5.9,然而在刚刚的压缩包里找找就会找到一个 Dev C++ 5.11 的安装包(迷惑 x2)。(即便如此也不能阻止我 NOIP 上由于 <strong>Dev C++ 过于智能而导致函数没写返回类型也不会报错</strong>的 CE 爆零惨案。)</p>
<p>以及,与以往不同的是,<s>难得良心的</s> CCF 居然给了一个检查选手目录正确性的 EXE 程序,<s>再也不用担心因建错目录而爆零了(事实证明,该爆的零总是逃不掉的)</s>。</p>
<p>桌面名为的 NOI 文件夹里还真有 NOI Linux 的虚拟机,然而并没有时间玩。</p>
<p>居然没有扫雷,CSP 上玩扫雷的愿望破灭了(((</p>
<h2 id="开赛逐渐暴躁"><a class="anchor" href="#开赛逐渐暴躁">#</a> 开赛:逐渐暴躁</h2>
<p>T1 儒略日转公制日。上来一道大模拟,跳了。</p>
<p>T3 看起来比较简单,打个大暴力。</p>
<p>回头想了想 T1,没啥思路。</p>
<p>(上厕所以获取灵感)</p>
<p>上完厕所回来还是没思路,开始打 T2。T2 二进制状态压缩,看起来似乎挺简单的,<strong>结果遇到玄学 bug,调半天调不出来,傻了。</strong></p>
<p>然后回头搞 T1,打了个一直 <code>NextDay</code> 的暴力,最后一个小时分段打表,然而表的大小没打对,大样例也没过。</p>
<p>最后 15 分钟给 T2 和 T4 输出个样例和随机数。好像 4 个小时也没干啥就结束了。</p>
<h2 id="赛后直呼凉凉"><a class="anchor" href="#赛后直呼凉凉">#</a> 赛后:直呼凉凉</h2>
<p>考完试出来居然天已经黑了。</p>
<p>路上听到有人只做出 T1,T2 输出了个 0(</p>
<p>听到旁边座位的初中大佬居然做出 300 分!(我太蒻了)</p>
<p><strong>由于 T2 玄学 bug 没调出来,考完直呼凉凉。</strong></p>
<p><s>好像学了一个多月的提高组内容,除了快读和分段打表,其余正经的一个没用上(((</s></p>
<p>(广州停车位是真的难找)</p>
<h2 id="后续我又活炸了"><a class="anchor" href="#后续我又活炸了">#</a> 后续:我又活(炸)了</h2>
<p>第二天洛谷出民间数据,靠着记忆把考场上 T1 的代码打完才想起有 "公开选手代码" 这回事(去年我好像都没见过 "选手代码" 这玩意)。</p>
<p>拿选手代码在洛谷的民间数据上一测:</p>
<table>
<thead>
<tr>
<th>T1</th>
<th>T2</th>
<th>T3</th>
<th>T4</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr>
<td>30 pts</td>
<td><strong>85 pts (WTF?!)</strong></td>
<td>10 pts</td>
<td>0 pts</td>
<td>125 pts</td>
</tr>
</tbody>
</table>
<p><s>我可真是谢谢您老 Dev C++ 嘞。</s></p>
<p>T3 暴力以为用不着 <code>long long</code> (考前看别人博客说 <code>int</code> 比 <code>long long</code> 快不少),于是就没开 <code>long long</code> ,结果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>35</mn><mi>p</mi><mi>t</mi><mi>s</mi><mo>→</mo><mn>10</mn><mi>p</mi><mi>t</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">35 pts \to 10 pts</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">3</span><span class="mord">5</span><span class="mord mathnormal">p</span><span class="mord mathnormal">t</span><span class="mord mathnormal">s</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord mathnormal">p</span><span class="mord mathnormal">t</span><span class="mord mathnormal">s</span></span></span></span> ……</p>
<p>最终成绩:</p>
<table>
<thead>
<tr>
<th>T1</th>
<th>T2</th>
<th>T3</th>
<th>T4</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr>
<td>30 pts</td>
<td>95 pts(针不戳)</td>
<td>10 pts</td>
<td>0 pts</td>
<td><strong>135 pts</strong></td>
</tr>
</tbody>
</table>
<p><strong>GD 一等分数线 150 pts</strong>,我的一等啊…… 我的蓝勾……</p>
<p><strong>总结:不开 <code>long long</code> 见祖宗。</strong></p>
<h1 id="noip"><a class="anchor" href="#noip">#</a> NOIP</h1>
<h2 id="before-赛前"><a class="anchor" href="#before-赛前">#</a> Before 赛前</h2>
<p>开考前一天跟 HY 的大佬们打了一场<s>被巨佬称为 “便秘比赛” 的</s>模拟水题赛,极其欢乐。</p>
<p><img data-src="https://i.loli.net/2020/12/26/LgvsD6GhC4MVlB5.png" alt="" /></p>
<p><img data-src="https://i.loli.net/2020/12/26/OhWycjZG4dzxteJ.png" alt="" /></p>
<p>根据约定,我们这些 <s>AKIOI 的</s>高中学长们不能抢首 A,于是……</p>
<p><img data-src="https://i.loli.net/2020/12/26/evyiWEMnVCYahFq.png" alt="" /></p>
<p><img data-src="https://i.loli.net/2020/12/26/WsMfmUHBi5JGrx9.png" alt="" /></p>
<h2 id="赛前"><a class="anchor" href="#赛前">#</a> 赛前</h2>
<p>加一条命!</p>
<p>来得挺早,见到了 HY <s>比我小然而比我强</s>的大佬们,还有以前的 OI 老师。</p>
<p>同一个考场,同一个考室,<s>同样的倒霉运气</s>。</p>
<p>有了上次的经验,一顿基本操作,解压,装 Sublime Text 3、Dev C++ 5.11,看题。</p>
<p>T1 图论,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>≤</mo><mn>10</mn></mrow><annotation encoding="application/x-tex">m \leq 10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span></span></span></span>,好像暴力能过?吸取教训,开 <code>long long</code> ,大样例全文比对,手造极限数据(我太蒻了不会对拍),<s>然而还是逃脱不了爆零的命运</s>。</p>
<p>T2 字符串,考前一星期刚好看到 KMP(我太蒻了),想着估计不会考就没往下看……</p>
<p>T3 SPJ! NOIP 历史上第一次 <strong>Special Judge</strong>!(插播新闻:<span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Rpc2N1c3Mvc2hvdy8yODQ4ODU=">SPJ 惨遭 Hack</span>)</p>
<p>T4 看起来很可做,上暴力。</p>
<p>最后 1h 纠结做 T2 还是 T3,决定打 T2 部分分,结果暴力没调出来……</p>
<p>最后 2 分钟开了 NOI Linux 虚拟机玩玩,结果不知道密码(不会有人现在还不知道 <strong>NOI Linux 的密码是 <code>123456</code> </strong> 吧),溜了。</p>
<h2 id="赛后"><a class="anchor" href="#赛后">#</a> 赛后</h2>
<p>针不戳!我觉得我 T1 能 AC!</p>
<p>啥?T1 入度为 0 的点不一定是接收口?</p>
<p><img data-src="https://i.loli.net/2020/12/26/1mS5lxzq2cGsO9P.png" alt="" /></p>
<p>CCF 说没坑,那没事了。</p>
<p><img data-src="https://i.loli.net/2020/12/26/2yFtOMqYzixIoHh.png" alt="" /></p>
<p>啥?T1 要打高精?</p>
<p><img data-src="https://i.loli.net/2020/12/26/wf4DHhImV2oBeLK.png" alt="" /></p>
<p>哦,就 10 分,那没事了。</p>
<p><img data-src="https://i.loli.net/2020/12/26/I4afmrOxN3SiBRh.png" alt="" /></p>
<p>啥?我 T1 <strong>函数没写返回值</strong>?</p>
<p>哦,<strong>CE</strong> 了,那没事了。</p>
<p><img data-src="https://i.loli.net/2020/12/26/RzxL3efmYhKyuqa.png" alt="" /></p>
<p>结局:<span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Rpc2N1c3Mvc2hvdy8yODQ2ODk=">T1 惨遭爆零</span>。</p>
<p>最终成绩:</p>
<table>
<thead>
<tr>
<th>T1</th>
<th>T2</th>
<th>T3</th>
<th>T4</th>
<th>Total</th>
</tr>
</thead>
<tbody>
<tr>
<td>0 pts</td>
<td>0 pts</td>
<td>0 pts</td>
<td>35 pts</td>
<td>35 pts</td>
</tr>
</tbody>
</table>
<p><strong>总结:没事别用 <code>inline</code> ,多用用 NOI Linux。</strong></p>
<hr />
<p>2020 CSP-S 游记 & NOIP 2020 爆零记,完。</p>
2020-11-15T05:00:00.000Z
https://fidel.js.org/2020/10/07/the-new-guide-of-cheating-in-oi/
【转载】蒟蒻的宝书 - 新版骗分导论
<blockquote>
<p>一年前打 CSP-J 时,学校的信息学老师给了我这篇《蒟蒻的宝书》。正是因为如此,最后我通过骗来的 15 分过了一等线。</p>
<p>由于原帖及目前网络上的转载贴排版普遍都很难看,因此在此转载并重新排版。</p>
<p>夹带私货:<span class="exturl" data-url="aHR0cDovL3d3dy5kb2Npbi5jb20vcC01MDA4MTExMDAuaHRtbA==">宝 藏</span></p>
</blockquote>
<span id="more"></span>
<div class="note primary">
<p>2020-12-30 更新:所有数学公式已使用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>LaTeX</mtext></mrow><annotation encoding="application/x-tex">\LaTeX</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.89883em;vertical-align:-0.2155em;"></span><span class="mord text"><span class="mord textrm">L</span><span class="mspace" style="margin-right:-0.36em;"></span><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.68333em;"><span style="top:-2.904999em;"><span class="pstrut" style="height:2.7em;"></span><span class="mord"><span class="mord textrm mtight sizing reset-size6 size3">A</span></span></span></span></span></span><span class="mspace" style="margin-right:-0.15em;"></span><span class="mord text"><span class="mord textrm">T</span><span class="mspace" style="margin-right:-0.1667em;"></span><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.46782999999999997em;"><span style="top:-2.7845em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord textrm">E</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.2155em;"><span></span></span></span></span><span class="mspace" style="margin-right:-0.125em;"></span><span class="mord textrm">X</span></span></span></span></span></span> 重写,全文已根据排版标准进行优化。</p>
</div>
<p><strong>新 版 骗 分 导 论</strong></p>
<p><strong>THE NEW GUIDE OF CHEATING IN INFORMATICS OLYMPIAD</strong></p>
<p><strong>蒟 蒻 的 宝 书</strong></p>
<hr />
<p><strong>全网排版最优的《骗分导论》</strong></p>
<p><strong>转载 & 排版 By Fidel</strong></p>
<hr />
<h1 id="目录"><a class="anchor" href="#目录">#</a> 目录</h1>
<ul>
<li><a href="#%E7%9B%AE%E5%BD%95">目录</a></li>
<li><a href="#%E7%AC%AC-1-%E7%AB%A0-%E7%BB%AA%E8%AE%BA">第 1 章 绪论</a></li>
<li><a href="#%E7%AC%AC-2-%E7%AB%A0-%E4%BB%8E%E6%97%A0%E8%A7%A3%E5%87%BA%E5%8F%91">第 2 章 从无解出发</a>
<ul>
<li><a href="#21-%E6%97%A0%E8%A7%A3%E6%83%85%E5%86%B5">2.1 无解情况</a></li>
<li><a href="#22-%E6%A0%B7%E4%BE%8B%E7%99%BD%E9%80%81%E7%9A%84%E5%88%86%E6%95%B0">2.2 样例 —— 白送的分数</a></li>
</ul>
</li>
<li><a href="#%E7%AC%AC-3-%E7%AB%A0-%E8%89%B0%E8%8B%A6%E6%9C%B4%E7%B4%A0%E6%B0%B8%E4%B8%8D%E5%BF%98">第 3 章 “艰苦朴素永不忘”</a>
<ul>
<li><a href="#31-%E6%A8%A1%E6%8B%9F">3.1 模拟</a></li>
<li><a href="#32-%E4%B8%87%E8%83%BD%E9%92%A5%E5%8C%99dfs">3.2 万能钥匙 ——DFS</a></li>
</ul>
</li>
<li><a href="#%E7%AC%AC-4-%E7%AB%A0-%E9%AA%97%E5%88%86%E7%9A%84%E5%85%B3%E9%94%AE%E7%8C%9C%E6%83%B3">第 4 章 骗分的关键 —— 猜想</a>
<ul>
<li><a href="#41-%E5%90%AC%E5%A4%A9%E7%94%B1%E5%91%BD">4.1 听天由命</a></li>
<li><a href="#42-%E7%8C%9C%E6%B5%8B%E7%AD%94%E6%A1%88">4.2 猜测答案</a></li>
<li><a href="#43-%E5%AF%BB%E6%89%BE%E8%A7%84%E5%BE%8B">4.3 寻找规律</a></li>
<li><a href="#44-%E5%B0%8F%E6%95%B0%E6%8D%AE%E6%9D%80%E6%89%8B%E6%89%93%E8%A1%A8">4.4 小数据杀手 —— 打表</a></li>
</ul>
</li>
<li><a href="#%E7%AC%AC-5-%E7%AB%A0-%E5%81%9A%E8%B4%AA%E5%BF%83%E7%9A%84%E4%BA%BA">第 5 章 做贪心的人</a>
<ul>
<li><a href="#51-%E8%B4%AA%E5%BF%83%E7%9A%84%E7%AE%97%E6%B3%95">5.1 贪心的算法</a></li>
<li><a href="#52-%E8%B4%AA%E5%BF%83%E5%9C%B0%E5%BE%97%E5%88%86">5.2 贪心地得分</a></li>
</ul>
</li>
<li><a href="#%E7%AC%AC-6-%E7%AB%A0-c%E7%9A%84%E7%A6%8F%E5%88%A9">第 6 章 C++ 的福利</a>
<ul>
<li><a href="#61-%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F">6.1 快速排序</a></li>
<li><a href="#62-%E5%A6%82%E6%84%8F%E9%87%91%E7%AE%8D%E6%A3%92">6.2 “如意金箍棒”</a></li>
</ul>
</li>
<li><a href="#%E7%AC%AC-7-%E7%AB%A0-%E5%AE%81%E4%B8%BA%E7%8E%89%E7%A2%8E%E4%B8%8D%E4%B8%BA%E7%93%A6%E5%85%A8">第 7 章 “宁为玉碎,不为瓦全”</a></li>
<li><a href="#%E7%AC%AC-8-%E7%AB%A0-%E5%AE%9E%E6%88%98%E6%BC%94%E7%BB%83">第 8 章 实战演练</a></li>
<li><a href="#%E7%AC%AC-9-%E7%AB%A0-%E7%BB%93%E8%AF%AD">第 9 章 结语</a></li>
</ul>
<h1 id="第-1-章-绪论"><a class="anchor" href="#第-1-章-绪论">#</a> 第 1 章 绪论</h1>
<p>在 OIer 中,有一句话广为流传:</p>
<p>任何蒟蒻必须经过大量的刷题练习才能成为大牛乃至于神牛。</p>
<p>这就是著名的 lzn 定理。然而,我们这些蒟蒻们,没有经过那么多历练,却要和大牛们同场竞技,我们该怎么以弱胜强呢?</p>
<p>答案就是:</p>
<p><strong>骗分</strong></p>
<p>那么,骗分是什么呢?骗分就是用简单的程序(比标准算法简单很多,保证蒟蒻能轻松搞定的程序),尽可能多得骗取分数。</p>
<p>让我们走进这本《新版骗分导论》,来学习骗分的技巧,来挑战神牛吧!</p>
<h1 id="第-2-章-从无解出发"><a class="anchor" href="#第-2-章-从无解出发">#</a> 第 2 章 从无解出发</h1>
<h2 id="21-无解情况"><a class="anchor" href="#21-无解情况">#</a> 2.1 无解情况</h2>
<p>在很多题目中都有这句话:“若无解,请输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span>.”</p>
<p>看到这句话时,骗分的蒟蒻们就欣喜若狂,因为 —— 数据中必定会有无解的情况!那么,只要打出下面这个程序:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"-1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>就能得到 10 分,甚至 20 分,30 分!</p>
<p>举个例子:</p>
<blockquote>
<p><strong><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3Byb2JsZW0vUDEwNzg=">文化之旅</span>(NOIP 2012 普及组 第 4 题)</strong></p>
<p><strong>题目描述</strong></p>
<p>有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。</p>
<p>现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。</p>
<p><strong>输入格式</strong></p>
<p>第一行为五个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo separator="true">,</mo><mi>K</mi><mo separator="true">,</mo><mi>M</mi><mo separator="true">,</mo><mi>S</mi><mo separator="true">,</mo><mi>T</mi></mrow><annotation encoding="application/x-tex">N,K,M,S,T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span>,每两个整数之间用一个空格隔开,依次代表国家个数(国家编号为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>),文化种数(文化编号为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span>),道路的条数,以及起点和终点的编号(保证 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 不等于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span>);</p>
<p>第二行为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span> 个整数,每两个整数之间用一个空格隔开,其中第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">i</span></span></span></span> 个数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>,表示国家 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">i</span></span></span></span> 的文化为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</p>
<p>接下来的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span> 行,每行 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span> 个整数,每两个整数之间用一个空格隔开,记第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">i</span></span></span></span> 行的第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 个数为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">a_{ij}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">a_{ij}=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 表示文化 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">i</span></span></span></span> 排斥外来文化 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">i</span></span></span></span> 等于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 时表示排斥相同文化的外来人),<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">a_{ij}= 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.311664em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span></span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.286108em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span> 表示不排斥(注意 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">i</span></span></span></span> 排斥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 并不保证 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>j</mi></mrow><annotation encoding="application/x-tex">j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.05724em;">j</span></span></span></span> 一定也排斥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">i</span></span></span></span>)。</p>
<p>接下来的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 行,每行三个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi><mo separator="true">,</mo><mi>v</mi><mo separator="true">,</mo><mi>d</mi></mrow><annotation encoding="application/x-tex">u,v,d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">d</span></span></span></span>,每两个整数之间用一个空格隔开,表示国家 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi></mrow><annotation encoding="application/x-tex">u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">u</span></span></span></span> 与国家 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span> 有一条距离为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>d</mi></mrow><annotation encoding="application/x-tex">d</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathnormal">d</span></span></span></span> 的可双向通行的道路(保证 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi></mrow><annotation encoding="application/x-tex">u</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">u</span></span></span></span> 不等于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>v</mi></mrow><annotation encoding="application/x-tex">v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span></span></span></span>,两个国家之间可能有多条道路)。</p>
<p><strong>输出格式</strong></p>
<p>一个整数,表示使者从起点国家到达终点国家最少需要走的距离数(如果无解则输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span>)。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>2 2 1 1 2</pre></td></tr><tr><td data-num="2"></td><td><pre>1 2</pre></td></tr><tr><td data-num="3"></td><td><pre>0 1</pre></td></tr><tr><td data-num="4"></td><td><pre>1 0</pre></td></tr><tr><td data-num="5"></td><td><pre>1 2 10</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-1</pre></td></tr></table></figure><p>输入 #2</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>2 2 1 1 2</pre></td></tr><tr><td data-num="2"></td><td><pre>1 2</pre></td></tr><tr><td data-num="3"></td><td><pre>0 1</pre></td></tr><tr><td data-num="4"></td><td><pre>0 0</pre></td></tr><tr><td data-num="5"></td><td><pre>1 2 10</pre></td></tr></table></figure><p>输出 #2</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>10</pre></td></tr></table></figure><p><strong>数据范围及提示</strong></p>
<p>【输入输出样例 1 说明】</p>
<p>由于到国家 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span> 必须要经过国家 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>,而国家 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span> 的文明却排斥国家 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 的文明,所以不可能到达国家 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span>。</p>
<p>【输入输出样例 2 说明】</p>
<p>路线为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>→</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">1 \to 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span>。</p>
<p>【数据范围】</p>
<p>对于 20% 的数据,有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mo>≤</mo><mi>N</mi><mo>≤</mo><mn>8</mn></mrow><annotation encoding="application/x-tex">2≤N≤8</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">8</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi><mo>≤</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">K≤5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">5</span></span></span></span>;</p>
<p>对于 30% 的数据,有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mo>≤</mo><mi>N</mi><mo>≤</mo><mn>10</mn></mrow><annotation encoding="application/x-tex">2≤N≤10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi><mo>≤</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">K≤5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">5</span></span></span></span>;</p>
<p>对于 50% 的数据,有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mo>≤</mo><mi>N</mi><mo>≤</mo><mn>20</mn></mrow><annotation encoding="application/x-tex">2≤N≤20</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi><mo>≤</mo><mn>8</mn></mrow><annotation encoding="application/x-tex">K≤8</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">8</span></span></span></span>;</p>
<p>对于 70% 的数据,有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mo>≤</mo><mi>N</mi><mo>≤</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">2≤N≤100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi><mo>≤</mo><mn>10</mn></mrow><annotation encoding="application/x-tex">K≤10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span></span></span></span>;</p>
<p>对于 100% 的数据,有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mo>≤</mo><mi>N</mi><mo>≤</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">2≤N≤100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>K</mi><mo>≤</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">1≤K≤100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>M</mi><mo>≤</mo><msup><mi>N</mi><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">1≤M≤N^2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><msub><mi>k</mi><mi>i</mi></msub><mo>≤</mo><mi>K</mi></mrow><annotation encoding="application/x-tex">1≤k_i≤K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.84444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em;">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.03148em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">K</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>u</mi><mo separator="true">,</mo><mi>v</mi><mo>≤</mo><mi>N</mi></mrow><annotation encoding="application/x-tex">1≤u,v≤N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">v</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>d</mi><mo>≤</mo><mn>1000</mn></mrow><annotation encoding="application/x-tex">1≤d≤1000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83041em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mo mathvariant="normal">≠</mo><mi>T</mi></mrow><annotation encoding="application/x-tex">S≠T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="inner"><span class="mrel"></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>S</mi><mo separator="true">,</mo><mi>T</mi><mo>≤</mo><mi>N</mi></mrow><annotation encoding="application/x-tex">1≤S, T≤N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>。</p>
</blockquote>
<p>这道题看起来很复杂,但其中有振奋人心的一句话 “输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span>”,我考试时就高兴坏了(当时我才初一,水平太烂),随手打了个 <code>printf("-1");</code> ,得 10 分。</p>
<h2 id="22-样例白送的分数"><a class="anchor" href="#22-样例白送的分数">#</a> 2.2 样例 —— 白送的分数</h2>
<p>每道题目的后面,都有一组 “样例输入” 和 “样例输出”。它们的价值极大,不仅能初步帮你检验程序的对错 **(特别坑的样例除外)**,而且,如果你不会做这道题(这种情况蒟蒻们已经司空见惯了),你就可以直接输出样例!</p>
<div class="note info">
<p>编者注:现在 NOIP 的样例大部分都很坑。<s>(用心造数据,用脚造样例)</s></p>
</div>
<p>例如美国的 USACO,它的题目有一个规则,就是第一组数据必须是样例。那么,只要你输出所有的样例,你就能得到 100 分(满分 1000)!这是相当可观的分数了。</p>
<p>现在,你已经掌握了最基础的骗分技巧。只要你会基本的输入输出语句,你就能实现这些骗分方法。那么,如果你有一定的基础,请看下一章 —— 我将教你怎样用简单方法骗取部分分数。</p>
<h1 id="第-3-章-艰苦朴素永不忘"><a class="anchor" href="#第-3-章-艰苦朴素永不忘">#</a> 第 3 章 “艰苦朴素永不忘”</h1>
<p>本章的标题来源于《学习雷锋好榜样》的一句歌词,但我不是想教导你们学习雷锋精神,而是学习骗分!</p>
<p>看到 “朴素” 两个字了吗?它们代表了一类算法,主要有模拟和 DFS 。下面我就来介绍它们在骗分中的应用。</p>
<h2 id="31-模拟"><a class="anchor" href="#31-模拟">#</a> 3.1 模拟</h2>
<p>所谓模拟,就是用计算机程序来模拟实际的事件。例如 NOIP 2012 的 “寻宝”,就是写一个程序来模拟小明上藏宝塔的动作。</p>
<p>较繁的模拟就不叫骗分了,我这里也不讨论这个问题。</p>
<p>模拟主要可以应用在骗高级数据结构题上的分,例如线段树。下面举一个例子来说明一下。</p>
<blockquote>
<p><strong><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3Byb2JsZW0vUDI4ODA=">排队</span> (USACO 2007 January Silver)</strong></p>
<p><strong>题目描述</strong></p>
<p>每天,农夫约翰的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>N</mi><mo>≤</mo><mn>50000</mn></mrow><annotation encoding="application/x-tex">1≤N≤50000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">5</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>)头奶牛总是按同一顺序排好队,有一天,约翰决定让一些牛玩一场飞盘游戏(Ultimate Frisbee),他决定在队列里选择一群位置连续的奶牛进行比赛,为了避免比赛结果过于悬殊,要求挑出的奶牛身高不要相差太大。</p>
<p>约翰准备了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span></span></span></span>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>Q</mi><mo>≤</mo><mn>180000</mn></mrow><annotation encoding="application/x-tex">1≤Q≤180000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">8</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>)组奶牛选择,并告诉你所有奶牛的身高 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>H</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">H_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.08125em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><msub><mi>H</mi><mi>i</mi></msub><mo>≤</mo><mn>1</mn><msup><mn>0</mn><mn>6</mn></msup></mrow><annotation encoding="application/x-tex">1≤ H_i ≤10^6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.08125em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">6</span></span></span></span></span></span></span></span></span></span></span>)。他想知道每组里最高的奶牛和最矮的奶牛身高差是多少。</p>
<div class="note info">
<p>编者注:修正了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span></span></span></span> 的数据范围,原文为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>Q</mi><mo>≤</mo><mn>200000</mn></mrow><annotation encoding="application/x-tex">1≤Q≤200000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>。</p>
</div>
<p>注意:在最大的数据上,输入输出将占据大部分时间。</p>
<p><strong>输入格式</strong></p>
<p>第一行,两个用空格隔开的整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span></span></span></span>。</p>
<p>第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span> 到第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">N+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 行,每行一个整数,第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.74285em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 行表示第 i 头奶牛的身高 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>H</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">H_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em;">H</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.08125em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p>
<p>第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>+</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">N+2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span> 到第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>+</mo><mi>Q</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">N+Q+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 行,每行两个用空格隔开的整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal">A</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span>,表示选择从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi></mrow><annotation encoding="application/x-tex">A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal">A</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi></mrow><annotation encoding="application/x-tex">B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span> 的所有牛(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>A</mi><mo>≤</mo><mi>B</mi><mo>≤</mo><mi>N</mi></mrow><annotation encoding="application/x-tex">1 ≤ A ≤ B ≤ N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span>)</p>
<p><strong>输出格式</strong></p>
<p>共 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span></span></span></span> 行,每行一个整数,代表每个询问的答案。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>6 3</pre></td></tr><tr><td data-num="2"></td><td><pre>1</pre></td></tr><tr><td data-num="3"></td><td><pre>7</pre></td></tr><tr><td data-num="4"></td><td><pre>3</pre></td></tr><tr><td data-num="5"></td><td><pre>4</pre></td></tr><tr><td data-num="6"></td><td><pre>2</pre></td></tr><tr><td data-num="7"></td><td><pre>5</pre></td></tr><tr><td data-num="8"></td><td><pre>1 5</pre></td></tr><tr><td data-num="9"></td><td><pre>4 6</pre></td></tr><tr><td data-num="10"></td><td><pre>2 2</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>6</pre></td></tr><tr><td data-num="2"></td><td><pre>3</pre></td></tr><tr><td data-num="3"></td><td><pre>0</pre></td></tr></table></figure></blockquote>
<p>对于这个例子,大牛们可以写个线段树,而我们蒟蒻,就模拟吧。</p>
<p>附模拟程序:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator"><=</span> q<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">,</span> <span class="token operator">&</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">int</span> min <span class="token operator">=</span> INT_MAX<span class="token punctuation">,</span> max <span class="token operator">=</span> INT_MIN<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> a<span class="token punctuation">;</span> i <span class="token operator"><=</span> b<span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator"><</span> min<span class="token punctuation">)</span> min <span class="token operator">=</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>h<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">></span> max<span class="token punctuation">)</span> max <span class="token operator">=</span> h<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d\n"</span><span class="token punctuation">,</span> max<span class="token operator">-</span>min<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="9"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>程序简洁明了,并且能高效骗分。本程序得 50 分。</p>
<h2 id="32-万能钥匙dfs"><a class="anchor" href="#32-万能钥匙dfs">#</a> 3.2 万能钥匙 ——DFS</h2>
<p>DFS 是图论中的重要算法,但我们看来,图论神马的都是浮云,关键就是如何骗分。下面引出本书的第 2 条定理:</p>
<p><strong>DFS 是万能的。</strong></p>
<p>这对于你的骗分是至关重要的。比如说,一些动态规划题,可以 DFS;数学题,可以 DFS;剪枝的题,更能 DFS。下面以一道省选题为例,解释一下 DFS 骗分。</p>
<blockquote>
<p><strong><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3Byb2JsZW0vUDEwNDg=">采药</span> (NOIP 2005 普及组 第 3 题)</strong></p>
<div class="note info">
<p>编者注:修正了题目来源,原文为 “NOIP2003”</p>
</div>
<p><strong>题目描述</strong></p>
<p>辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”</p>
<p>如果你是辰辰,你能完成这个任务吗?</p>
<p><strong>输入格式</strong></p>
<p>输入第一行有两个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>T</mi><mo>≤</mo><mn>1000</mn></mrow><annotation encoding="application/x-tex">1 \leq T \leq 1000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>)和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>M</mi><mo>≤</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">1 \leq M \leq 100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>),用一个空格隔开,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi></mrow><annotation encoding="application/x-tex">T</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span></span></span></span> 代表总共能够用来采药的时间,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 代表山洞里的草药的数目。接下来的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 行每行包括两个在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>100</mn></mrow><annotation encoding="application/x-tex">100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span> 之间(包括 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>100</mn></mrow><annotation encoding="application/x-tex">100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>)的整数,分别表示采摘某株草药的时间和这株草药的价值。</p>
<p><strong>输出格式</strong></p>
<p>输出包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>70 3</pre></td></tr><tr><td data-num="2"></td><td><pre>71 100</pre></td></tr><tr><td data-num="3"></td><td><pre>69 1</pre></td></tr><tr><td data-num="4"></td><td><pre>1 2</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>3</pre></td></tr></table></figure><p><strong>数据范围及提示</strong></p>
<p>对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>30</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">30\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">3</span><span class="mord">0</span><span class="mord">%</span></span></span></span> 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>≤</mo><mn>10</mn></mrow><annotation encoding="application/x-tex">M \leq 10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span></span></span></span>;<br />
对于全部的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>≤</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">M \leq 100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>。</p>
</blockquote>
<p>这题的方法很简单。我们瞄准 20% 的数据来做,可以用 DFS 枚举方案,然后模拟计算出最优解。附一个大致的代码:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">void</span> <span class="token function">DFS</span><span class="token punctuation">(</span><span class="token keyword">int</span> d<span class="token punctuation">,</span><span class="token keyword">int</span> c<span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">if</span> <span class="token punctuation">(</span>d <span class="token operator">==</span> n<span class="token punctuation">)</span> <span class="token punctuation">{</span><span class="token keyword">if</span> <span class="token punctuation">(</span>c <span class="token operator">></span> ans<span class="token punctuation">)</span> ans <span class="token operator">=</span> c<span class="token punctuation">;</span> <span class="token keyword">return</span><span class="token punctuation">;</span><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token function">DFS</span><span class="token punctuation">(</span>d <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> c <span class="token operator">+</span> w<span class="token punctuation">[</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token function">DFS</span><span class="token punctuation">(</span>d <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> c<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><h1 id="第-4-章-骗分的关键猜想"><a class="anchor" href="#第-4-章-骗分的关键猜想">#</a> 第 4 章 骗分的关键 —— 猜想</h1>
<h2 id="41-听天由命"><a class="anchor" href="#41-听天由命">#</a> 4.1 听天由命</h2>
<p>如果你觉得你的人品很好,可以试试这一招 —— 输出随机数。</p>
<p>先看一下代码:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string"><stdlib.h></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string"><time.h></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment">// 以上两个头文件必须加</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token function">srand</span><span class="token punctuation">(</span><span class="token function">time</span><span class="token punctuation">(</span><span class="token constant">NULL</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token comment">// 输出随机数前执行此语句</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span><span class="token function">rand</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">%</span>X<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token comment">// 输出一个 0~X-1 的随机整数。</span></pre></td></tr></table></figure><p>这种方法适用于输出一个整数(或判断是否)的题目中,答案的范围越小越好。让老天决定你的得分吧。</p>
<p>据说,在 NOIP 2013 中,有人最后一题不会,愤然打了个随机数,结果得了 70 分啊!!</p>
<h2 id="42-猜测答案"><a class="anchor" href="#42-猜测答案">#</a> 4.2 猜测答案</h2>
<p>有些时候,问题的答案可能很有特点:对于大多数情况,答案是一样的。这时,骗分就该出手了。你需要做的,就是发掘出这个答案,然后直接输出。</p>
<p>有时,你需要运用第 3 章中学到的知识,先写出朴素算法,然后造一些数据,可能就会发现规律。</p>
<p>例如,本班月赛中有一道题:</p>
<blockquote>
<p><strong>炸毁计划</strong></p>
<p><strong>问题描述</strong></p>
<p>皇军侵占了通往招远的黄金要道。为了保护渤海通道的安全,使得黄金能够顺利地运送到敌后战略总指挥地延安,从而购买战需武器,所以我们要通过你的程序确定这条战略走廊是否安全。</p>
<p>已知我们有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span></span></span> 座小岛,只有使得每一个小岛都能与其他任意一个小岛联通才能保证走廊的安全。每个小岛之间只能通过若干双向联通的桥保持联系,已知有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 座桥,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>A</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>B</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A_i,B_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 表示第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">i</span></span></span></span> 座桥连接了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">A_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">B_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 这两座城市。</p>
<p>现在,敌人的炸药只能炸毁其中一座桥,请问在仅仅炸毁这一座桥的情况下,能否保证所有岛屿安全,都能联通起来。</p>
<p>现在给出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span></span></span></span> 个询问 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>,其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 表示桥梁编号,桥梁的编号按照输入顺序编号。每个询问表示在仅仅炸毁第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 座桥的情况下能否保证所有岛屿安全。如果可以,在输出文件当中,对应输入顺序输出 <code>yes</code> ,否则输出 <code>no</code> (输出为半角英文单词,区分大小写,默认为小写,不含任何小写符号,每行输出一个空格,忽略文末空格)。</p>
<p><strong>输入格式</strong></p>
<p>第一行 三个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo separator="true">,</mo><mi>M</mi><mo separator="true">,</mo><mi>Q</mi></mrow><annotation encoding="application/x-tex">N,M,Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">Q</span></span></span></span>,分别表示岛屿的个数,桥梁的个数和询问的个数。</p>
<p>第二行到第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">M+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 行 每行两个整数。第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.74285em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 行有两个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">A_i,B_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.05017em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 表示这个桥梁的属性。</p>
<p>第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>+</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">M+2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span> 行 有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span></span></span></span> 个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.83333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:-0.07153em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 表示查询。</p>
<p><strong>输出格式</strong></p>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">Q</span></span></span></span> 行,表示查询结果。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>2 1 1</pre></td></tr><tr><td data-num="2"></td><td><pre>1 2</pre></td></tr><tr><td data-num="3"></td><td><pre>1</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>no</pre></td></tr></table></figure><p><strong>数据范围</strong></p>
<p>对于 80% 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>≤</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">N≤100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>。<br />
对于 100% 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo>≤</mo><mn>1000</mn></mrow><annotation encoding="application/x-tex">N≤1000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi><mo separator="true">,</mo><mi>Q</mi><mo>≤</mo><mi>M</mi><mo>≤</mo><mn>2000</mn></mrow><annotation encoding="application/x-tex">N,Q≤M≤2000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8777699999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">N</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>。</p>
</blockquote>
<p>你发现问题了吗?那么多座桥,炸一座就破坏岛屿的联系,可能性微乎其微(除非特别设计数据)。那么,我们的骗分策略就出来了:对于所有询问,输出 <code>yes</code> . 果然,此算法效果不错,得 80 分。</p>
<p>现在知道猜测答案的厉害了吧?</p>
<h2 id="43-寻找规律"><a class="anchor" href="#43-寻找规律">#</a> 4.3 寻找规律</h2>
<p>首先声明:本节讲的规律不是正当的算法规律,而是数据的特点。</p>
<p>某些题目会给你很多样例,你就可以观察他们的特点了。有时,数据中的某一个(或几个)数,能通过简单的关系直接算出答案。</p>
<p>只要你找到了规律,在很多情况下你都能得到可观的分数。</p>
<p>这样的题目大多出现在 NOI 或更高等级的比赛中,本人蒟蒻一个,就不举例了。传说某人去省选时专门琢磨数据的规律,结果有一题得了 30 分。</p>
<h2 id="44-小数据杀手打表"><a class="anchor" href="#44-小数据杀手打表">#</a> 4.4 小数据杀手 —— 打表</h2>
<p>我认识一个人,他在某老师家上 C 语言家教,老师每讲一题,他都喊一句:“打表行吗?”</p>
<p>他真的是打表的忠实粉丝。表虽然不能乱打,但还是很有用的。</p>
<p>先看一个例子:</p>
<blockquote>
<p><strong><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3Byb2JsZW0vUDEwNDQ=">栈</span> (NOIP 2003 普及组 第 3 题)</strong></p>
<p><strong>题目背景</strong></p>
<p>栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。</p>
<p>栈有两种最重要的操作,即 pop(从栈顶弹出一个元素)和 push(将一个元素进栈)。</p>
<p>栈的重要性不言自明,任何一门数据结构的课程都会介绍栈。宁宁同学在复习栈的基本概念时,想到了一个书上没有讲过的问题,而他自己无法给出答案,所以需要你的帮忙。</p>
<p><strong>题目描述</strong></p>
<p><img data-src="https://i.loli.net/2021/01/17/LoVJ3mANdsjkqzM.gif" alt="" /></p>
<p>宁宁考虑的是这样一个问题:一个操作数序列,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">1, 2, \dots, n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">n</span></span></span></span>(图示为 1 到 3 的情况),栈 A 的深度大于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span>。</p>
<p>现在可以进行两种操作,</p>
<ol>
<li>将一个数,从操作数序列的头端移到栈的头端(对应数据结构栈的 push 操作)</li>
<li>将一个数,从栈的头端移到输出序列的尾端(对应数据结构栈的 pop 操作)</li>
</ol>
<p>使用这两种操作,由一个操作数序列就可以得到一系列的输出序列,下图所示为由 <code>1 2 3</code> 生成序列 <code>2 3 1</code> 的过程。</p>
<p><img data-src="https://i.loli.net/2021/01/17/D7wx2SuIL34Zbel.gif" alt="" /></p>
<p>(原始状态如上图所示)</p>
<p>你的程序将对给定的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span>,计算并输出由操作数序列 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">1, 2, \dots, n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">n</span></span></span></span> 经过操作可能得到的输出序列的总数。</p>
<p><strong>输入格式</strong></p>
<p>输入文件只含一个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>n</mi><mo>≤</mo><mn>18</mn></mrow><annotation encoding="application/x-tex">1≤n≤18</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">8</span></span></span></span>)。</p>
<p><strong>输出格式</strong></p>
<p>输出文件只有一行,即可能输出序列的总数目。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>3</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>5</pre></td></tr></table></figure></blockquote>
<p>这题看似复杂,但数据范围太小,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≤</mo><mn>18</mn></mrow><annotation encoding="application/x-tex">n \leq 18</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">8</span></span></span></span>。所以,骗分程序就好写了:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">18</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">5</span><span class="token punctuation">,</span><span class="token number">14</span><span class="token punctuation">,</span><span class="token number">42</span><span class="token punctuation">,</span><span class="token number">132</span><span class="token punctuation">,</span><span class="token number">429</span><span class="token punctuation">,</span><span class="token number">1430</span><span class="token punctuation">,</span><span class="token number">4862</span><span class="token punctuation">,</span><span class="token number">16796</span><span class="token punctuation">,</span><span class="token number">58786</span><span class="token punctuation">,</span><span class="token number">208012</span><span class="token punctuation">,</span><span class="token number">742900</span><span class="token punctuation">,</span><span class="token number">2674440</span><span class="token punctuation">,</span><span class="token number">9694845</span><span class="token punctuation">,</span><span class="token number">35357670</span><span class="token punctuation">,</span><span class="token number">129644790</span><span class="token punctuation">,</span><span class="token number">477638700</span><span class="token punctuation">}</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> <span class="token operator">&</span>n<span class="token punctuation">)</span><span class="token operator">:</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> ans<span class="token punctuation">[</span>n<span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>测试结果不言而喻,AC 了。</p>
<p>学完这一章,你已基本掌握了骗分技巧。下面的内容涉及一点算法知识,难度有所增加。蒟蒻中的蒟蒻可以止步于此了。</p>
<div class="note info">
<p>编者注:在某些 OI 中,提交的代码长度会有限制。当打的表过大时,可以试试 <span class="exturl" data-url="aHR0cHM6Ly9vaS13aWtpLm9yZy9tYXRoL2RpY3Rpb25hcnkv">分段打表</span> 和状压打表。</p>
</div>
<h1 id="第-5-章-做贪心的人"><a class="anchor" href="#第-5-章-做贪心的人">#</a> 第 5 章 做贪心的人</h1>
<h2 id="51-贪心的算法"><a class="anchor" href="#51-贪心的算法">#</a> 5.1 贪心的算法</h2>
<p>给你一堆纸币,让你挑一张,相信你一定会挑面值最大的。其实,这就是贪心算法。</p>
<p>贪心算法是个复杂的问题,但你不用管那么多。我们只关心骗分。给你一个问题,让你从一些东西中选出一些,你就可以使用贪心的方法,尽量挑好的。</p>
<p>举个例子:这是我们的市队选拔的一道题。</p>
<blockquote>
<p><strong>有趣的问题</strong></p>
<p><strong>问题描述</strong></p>
<p>2013 年的 NOIP 结束后, Smart 发现自己又被题目碾压了,心里非常地不爽,于是暗下决心疯狂地刷数学题目,做到天昏地暗、废寝忘食,准备在今年的中考中大展身手。</p>
<p>有一天,他在做题时发现了一个有趣的问题:</p>
<p>给定 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个二元组 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>a</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>b</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(a_i, b_i)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>,记函数:</p>
<p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>y</mi><mo>=</mo><mn>100</mn><mfrac><mrow><mi>σ</mi><mo stretchy="false">(</mo><msub><mi>a</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><mrow><mi>σ</mi><mo stretchy="false">(</mo><msub><mi>b</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">y=100 \frac{\sigma(a_i)}{\sigma(b_i)}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:2.363em;vertical-align:-0.936em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">σ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p>
<p>将函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 的值四舍五入取整。</p>
<p>现将 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个二元组去掉其中的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span> 个计算一个新的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 值(也四舍五入取整),均能满足:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>≤</mo><mi>z</mi></mrow><annotation encoding="application/x-tex">y \leq z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span> ,求出最小的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span> 值。</p>
<p>Smart 想让你帮他一起找出最小的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span> 值。</p>
<p><strong>输入格式</strong></p>
<p>输入包含多组测试数据。</p>
<p>每组测试数据第一行两个整数:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span>;</p>
<p>第二行为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个数:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>a</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>a</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">a_1, a_2, \dots, a_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>;</p>
<p>第三行为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个数:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>b</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>b</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>b</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">b_1, b_2, \dots, b_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.30110799999999993em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.151392em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</p>
<p>输入数据当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo separator="true">,</mo><mi>k</mi></mrow><annotation encoding="application/x-tex">n,k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span> 均为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span> 时结束。</p>
<p><strong>输出格式</strong></p>
<p>对于每组测试数据输出一行,即找出的最小的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>z</mi></mrow><annotation encoding="application/x-tex">z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.04398em;">z</span></span></span></span> 值。</p>
<p>注意:为避免精度四舍五入出现误差,测试点保证每个函数值与最终结果的差值至少为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0.001</mn></mrow><annotation encoding="application/x-tex">0.001</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mord">.</span><span class="mord">0</span><span class="mord">0</span><span class="mord">1</span></span></span></span>。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>3 1</pre></td></tr><tr><td data-num="2"></td><td><pre>5 0 1</pre></td></tr><tr><td data-num="3"></td><td><pre>5 1 6</pre></td></tr><tr><td data-num="4"></td><td><pre>4 2</pre></td></tr><tr><td data-num="5"></td><td><pre>1 2 7 9</pre></td></tr><tr><td data-num="6"></td><td><pre>5 6 7 9</pre></td></tr><tr><td data-num="7"></td><td><pre>0 0</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>83</pre></td></tr><tr><td data-num="2"></td><td><pre>100</pre></td></tr></table></figure><p><strong>数据范围</strong></p>
<p>对于 40% 的数据:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≤</mo><mn>20</mn></mrow><annotation encoding="application/x-tex">n≤20</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">0</span></span></span></span>;</p>
<p>对于 70% 的数据:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≤</mo><mn>1000</mn></mrow><annotation encoding="application/x-tex">n≤1000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>;</p>
<p>对于 100% 的数据:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>≤</mo><mn>10000</mn></mrow><annotation encoding="application/x-tex">n≤10000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>b</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">a_i,b_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 都在 <code>int</code> 范围内。</p>
</blockquote>
<p>这题让人望而生畏,但我们有贪心的手段。每个二元组的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">a</span></span></span></span> 值是乘到答案中的,所以 a 越大越好,那么只要选择出最小的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>k</mi></mrow><annotation encoding="application/x-tex">k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.03148em;">k</span></span></span></span> 个去掉即可。代码就不写了,因为这个涉及到下一章的内容:排序。</p>
<p>此代码得 20 分。</p>
<h2 id="52-贪心地得分"><a class="anchor" href="#52-贪心地得分">#</a> 5.2 贪心地得分</h2>
<p>我们已经学了很多骗分方法,但他们中的大多效率并不高,一般能骗 10~20 分。这不能满足我们的贪心。</p>
<p>然而,我们可以合成骗分的程序。举个最简单的例子,有些含有无解情况的题目,它们同样有样例。我们可以写这个程序</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">if</span> <span class="token punctuation">(</span>是样例<span class="token punctuation">)</span> <span class="token function">printf</span><span class="token punctuation">(</span>样例<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">else</span> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"-1"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>这样也许能变 10 分为 20 分,甚至更多。</p>
<p>当然,合并骗分方法时要注意,不要重复骗同一种情况,或漏考虑一些情况。</p>
<p>大量能骗分的问题都能用此法,大家可以试试用新方法骗 2.1 中的例子 “文化之旅”。</p>
<h1 id="第-6-章-c的福利"><a class="anchor" href="#第-6-章-c的福利">#</a> 第 6 章 C++ 的福利</h1>
<p><strong>(请 P 党们跳过本章,这不是你们的福利)</strong></p>
<p>在 C++ 中,有一个好东西,名唤 STL,被万千 OIer 们所崇拜,所喜爱。下面让我们走进 STL。</p>
<h2 id="61-快速排序"><a class="anchor" href="#61-快速排序">#</a> 6.1 快速排序</h2>
<p>快速排序是一个经典算法,也是 C++ 党的经典福利。他们有这样的代码:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string"><algorithm></span> <span class="token comment">// 这是必须的</span></span></pre></td></tr><tr><td data-num="2"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token function">sort</span><span class="token punctuation">(</span>A<span class="token punctuation">,</span>A<span class="token operator">+</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 对一个下标从 0 开始存储,长度为 n 的数组升序排序</span></pre></td></tr></table></figure><div class="note info">
<p>编者注:需要声明 <code>std</code> 命名空间。 <code>std::sort(int , int )</code> 函数传入的第二个参数为<ins>待排序数组的最后一个元素的<strong>后一个元素</strong>的地址</ins>。</p>
</div>
<p>就这么简单,完成了 P 党一大堆代码干的事情。</p>
<h2 id="62-如意金箍棒"><a class="anchor" href="#62-如意金箍棒">#</a> 6.2 “如意金箍棒”</h2>
<p>C++ 里有一种东西,叫 <code>vector</code> 容器。它好比如意金箍棒,可以随着元素的数量而改变大小。它其实就是数组,却比数组强得多。</p>
<p>下面看看它的几种操作:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string"><vector></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> V<span class="token punctuation">;</span> <span class="token comment">// 定义</span></pre></td></tr><tr><td data-num="5"></td><td><pre>V<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 末尾增加一个元素 x</span></pre></td></tr><tr><td data-num="6"></td><td><pre>V<span class="token punctuation">.</span><span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 末尾删除一个元素</span></pre></td></tr><tr><td data-num="7"></td><td><pre>V<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 返回容器中的元素个数</span></pre></td></tr></table></figure><div class="note info">
<p>编者注:需要使用 <code>vector</code> 头文件和 <code>std</code> 命名空间,上述代码中添加了相应内容。</p>
</div>
<p>它同样可以使用下标访问。(从 0 开始)</p>
<div class="note info">
<p>编者注:添加了以下示例代码。</p>
</div>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre>V<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d"</span><span class="token punctuation">,</span> V<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><h1 id="第-7-章-宁为玉碎不为瓦全"><a class="anchor" href="#第-7-章-宁为玉碎不为瓦全">#</a> 第 7 章 “宁为玉碎,不为瓦全”</h1>
<p>至此,我已介绍完了我所知的骗分方法。如果上面的方法都不奏效,我也无能为力。但是,我还有最后一招 ——</p>
<p>有句古话说:“宁为玉碎,不为瓦全”。我们蒟蒻也应有这样的精神。骗不到分,就报复一下,卡评测以泄愤吧!</p>
<p>卡评测主要有两种方法:一是死循环,故意超时;二是进入终端,卡住编译器。</p>
<p>先介绍下第一种。代码很简单,请看:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">while</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>就是这短短一句话,就能卡住评测机长达 10s,20s,甚至更多!对于测试点多、时限长的题目,这是个不错的方法。</p>
<p>第二种方法也很简单,但危害性较大,建议不要在重要比赛中使用,否则可能让你追悔莫及。它就是:</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string"><con></span> <span class="token comment">//(windows 系统中使用)</span></span></pre></td></tr></table></figure><p>或</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string"></dev/console></span> <span class="token comment">//(Linux 系统中使用)</span></span></pre></td></tr></table></figure><p>它非常强大,可以卡住评测系统,使其永远停止不了编译你的程序。唯一的解除方法是,工作人员强行关机,重启,重测。<strong>当然,我不保证他们不会气愤地把你的成绩变成 0 分。请慎用此方法。</strong></p>
<h1 id="第-8-章-实战演练"><a class="anchor" href="#第-8-章-实战演练">#</a> 第 8 章 实战演练</h1>
<p>下面我们来做一些习题,练习骗分技巧。</p>
<p>我们来一起分析一下 NOIP 2013 普及组的试题吧。</p>
<blockquote>
<p><strong><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3Byb2JsZW0vUDE5ODA=">记数问题</span>(NOIP 普及组 2013 第 1 题)</strong></p>
<div class="note info">
<p>编者注:洛谷题目名称似乎错了。</p>
</div>
<p><strong>题目描述</strong></p>
<p>试计算在区间 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 的所有整数中。数字 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo stretchy="false">(</mo><mn>0</mn><mo>≤</mo><mi>x</mi><mo>≤</mo><mn>9</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x(0 ≤ x ≤ 9)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">x</span><span class="mopen">(</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">9</span><span class="mclose">)</span></span></span></span> 共出现了多少次?例如,在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>11</mn></mrow><annotation encoding="application/x-tex">11</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">1</span></span></span></span> 中,即在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>6</mn><mo separator="true">,</mo><mn>7</mn><mo separator="true">,</mo><mn>8</mn><mo separator="true">,</mo><mn>9</mn><mo separator="true">,</mo><mn>10</mn><mo separator="true">,</mo><mn>11</mn></mrow><annotation encoding="application/x-tex">1,2,3,4,5,6,7,8,9,10,11</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">6</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">7</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">8</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">9</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mord">1</span></span></span></span> 中。数字 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 出现了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">4</span></span></span></span> 次。</p>
<p><strong>输入格式</strong></p>
<p>输入共 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 行,包含 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span> 个整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo separator="true">,</mo><mi>x</mi></mrow><annotation encoding="application/x-tex">n,x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">x</span></span></span></span>,之间用一个空格隔开。</p>
<p><strong>输出格式</strong></p>
<p>输出共 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 行,包含一个整数,表示 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">x</span></span></span></span> 出现的次数。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>11 1</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>4</pre></td></tr></table></figure><p><strong>数据范围</strong></p>
<p>对于 100% 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>n</mi><mo>≤</mo><mn>1</mn><mo separator="true">,</mo><mn>000</mn><mo separator="true">,</mo><mn>000</mn></mrow><annotation encoding="application/x-tex">1≤ n ≤ 1,000,000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>≤</mo><mi>x</mi><mo>≤</mo><mn>9</mn></mrow><annotation encoding="application/x-tex">0 ≤ x ≤ 9</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">9</span></span></span></span>。</p>
</blockquote>
<blockquote>
<p><strong><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3Byb2JsZW0vUDE5ODE=">表达式求值</span>(NOIP 2013 普及组 第 2 题)</strong></p>
<p><strong>题目描述</strong></p>
<p>给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值。</p>
<p><strong>输入格式</strong></p>
<p>输入仅有一行,为需要你计算的表达式,表达式中只包含数字、加法运算符 “<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo></mrow><annotation encoding="application/x-tex">+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">+</span></span></span></span>” 和乘法运算符 “<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">\times</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">×</span></span></span></span>” ,且没有括号,所有参与运算的数字均为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>31</mn></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2^{31} - 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.897438em;vertical-align:-0.08333em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">3</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 之间的整数。</p>
<p>输入数据保证这一行只有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>∼</mo><mn>9</mn></mrow><annotation encoding="application/x-tex">0 \sim 9</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">∼</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">9</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo></mrow><annotation encoding="application/x-tex">+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">+</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo></mrow><annotation encoding="application/x-tex">×</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.66666em;vertical-align:-0.08333em;"></span><span class="mord">×</span></span></span></span> 这 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>12</mn></mrow><annotation encoding="application/x-tex">12</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">2</span></span></span></span> 种字符。</p>
<p><strong>输出格式</strong></p>
<p>输出只有一行,包含一个整数,表示这个表达式的值。</p>
<p>注意:当答案长度多于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">4</span></span></span></span> 位时,请只输出最后 4 位,前导 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">0</span></span></span></span> 不输出。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>1+1*3+4</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>8</pre></td></tr></table></figure><p>输入 #2</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>1+1234567890*1</pre></td></tr></table></figure><p>输出 #2</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>7891</pre></td></tr></table></figure><p>输入 #3</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>1+1000000003*1</pre></td></tr></table></figure><p>输出 #3</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>4</pre></td></tr></table></figure><p>【输入输出样例说明】</p>
<p>样例 1 计算的结果为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>8</mn></mrow><annotation encoding="application/x-tex">8</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">8</span></span></span></span>,直接输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>8</mn></mrow><annotation encoding="application/x-tex">8</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">8</span></span></span></span>。</p>
<p>样例 2 计算的结果为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1234567891</mn></mrow><annotation encoding="application/x-tex">1234567891</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">2</span><span class="mord">3</span><span class="mord">4</span><span class="mord">5</span><span class="mord">6</span><span class="mord">7</span><span class="mord">8</span><span class="mord">9</span><span class="mord">1</span></span></span></span>,输出后 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">4</span></span></span></span> 位,即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>7891</mn></mrow><annotation encoding="application/x-tex">7891</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">7</span><span class="mord">8</span><span class="mord">9</span><span class="mord">1</span></span></span></span>。</p>
<p>样例 3 计算的结果为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1000000004</mn></mrow><annotation encoding="application/x-tex">1000000004</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">4</span></span></span></span>,输出后 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">4</span></span></span></span> 位,即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">4</span></span></span></span>。</p>
<p><strong>数据范围</strong></p>
<p>对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>30</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">30\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">3</span><span class="mord">0</span><span class="mord">%</span></span></span></span> 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>≤</mo><mtext>表达式中加法运算符和乘法运算符的总数</mtext><mo>≤</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">0≤ \text{表达式中加法运算符和乘法运算符的总数} ≤100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord text"><span class="mord cjk_fallback">表达式中加法运算符和乘法运算符的总数</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>;</p>
<p>对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>80</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">80\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">8</span><span class="mord">0</span><span class="mord">%</span></span></span></span> 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>≤</mo><mtext>表达式中加法运算符和乘法运算符的总数</mtext><mo>≤</mo><mn>1000</mn></mrow><annotation encoding="application/x-tex">0≤ \text{表达式中加法运算符和乘法运算符的总数} ≤1000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord text"><span class="mord cjk_fallback">表达式中加法运算符和乘法运算符的总数</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>;</p>
<p>对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>100</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">100\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">%</span></span></span></span> 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn><mo>≤</mo><mtext>表达式中加法运算符和乘法运算符的总数</mtext><mo>≤</mo><mn>100000</mn></mrow><annotation encoding="application/x-tex">0≤ \text{表达式中加法运算符和乘法运算符的总数} ≤100000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8193em;vertical-align:-0.13597em;"></span><span class="mord text"><span class="mord cjk_fallback">表达式中加法运算符和乘法运算符的总数</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>。</p>
</blockquote>
<blockquote>
<p><strong><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3Byb2JsZW0vUDE5ODI=">小朋友的数字</span>(NOIP 2013 普及组 第 3 题)</strong></p>
<p><strong>题目描述</strong></p>
<p>有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个小朋友排成一列。每个小朋友手上都有一个数字,这个数字可正可负。规定每个小朋友的特征值等于排在他前面(包括他本人)的小朋友中连续若干个(最少有一个)小朋友手上的数字之和的最大值。</p>
<p>作为这些小朋友的老师,你需要给每个小朋友一个分数,分数是这样规定的:第一个小朋友的分数是他的特征值,其它小朋友的分数为排在他前面的所有小朋友中(不包括他本人),小朋友分数加上其特征值的最大值。</p>
<p>请计算所有小朋友分数的最大值,输出时保持最大值的符号,将其绝对值对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">p</span></span></span></span> 取模后输出。</p>
<p><strong>输入格式</strong></p>
<p>第一行包含两个正整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo separator="true">,</mo><mi>p</mi></mrow><annotation encoding="application/x-tex">n,p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">p</span></span></span></span>,之间用一个空格隔开。</p>
<p>第二行包含 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个数,每两个整数之间用一个空格隔开,表示每个小朋友手上的数字。</p>
<p><strong>输出格式</strong></p>
<p>输出只有一行,包含一个整数,表示最大分数对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">p</span></span></span></span> 取模的结果。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>5 997</pre></td></tr><tr><td data-num="2"></td><td><pre>1 2 3 4 5</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>21</pre></td></tr></table></figure><p>【输入输出样例 1 说明】</p>
<p>小朋友的特征值分别为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>6</mn><mo separator="true">,</mo><mn>10</mn><mo separator="true">,</mo><mn>15</mn></mrow><annotation encoding="application/x-tex">1,3,6,10,15</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">6</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mord">5</span></span></span></span>,分数分别为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>11</mn><mo separator="true">,</mo><mn>21</mn></mrow><annotation encoding="application/x-tex">1,2,5,11,21</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">1</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mord">1</span></span></span></span>,最大值 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>21</mn></mrow><annotation encoding="application/x-tex">21</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">1</span></span></span></span> 对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>997</mn></mrow><annotation encoding="application/x-tex">997</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">9</span><span class="mord">9</span><span class="mord">7</span></span></span></span> 的模是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>21</mn></mrow><annotation encoding="application/x-tex">21</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord">1</span></span></span></span>。</p>
<p>输入 #2</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>5 7</pre></td></tr><tr><td data-num="2"></td><td><pre>-1 -1 -1 -1 -1</pre></td></tr></table></figure><p>输出 #2</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>-1</pre></td></tr></table></figure><p>【输入输出样例 2 说明】</p>
<p>小朋友的特征值分别为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn><mo separator="true">,</mo><mo>−</mo><mn>1</mn><mo separator="true">,</mo><mo>−</mo><mn>1</mn><mo separator="true">,</mo><mo>−</mo><mn>1</mn><mo separator="true">,</mo><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1,-1,-1,-1,-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span>,分数分别为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn><mo separator="true">,</mo><mo>−</mo><mn>2</mn><mo separator="true">,</mo><mo>−</mo><mn>2</mn><mo separator="true">,</mo><mo>−</mo><mn>2</mn><mo separator="true">,</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">-1,-2,-2,-2,-2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">−</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span>,最大值 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span> 对 7 的模为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span>,输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.72777em;vertical-align:-0.08333em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span>。</p>
<p><strong>数据范围</strong></p>
<p>对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>50</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">50\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">5</span><span class="mord">0</span><span class="mord">%</span></span></span></span> 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>n</mi><mo>≤</mo><mn>1</mn><mo separator="true">,</mo><mn>000</mn></mrow><annotation encoding="application/x-tex">1 ≤ n ≤ 1,000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>p</mi><mo>≤</mo><mn>1</mn><mo separator="true">,</mo><mn>000</mn></mrow><annotation encoding="application/x-tex">1 ≤ p ≤ 1,000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span> 所有数字的绝对值不超过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1000</mn></mrow><annotation encoding="application/x-tex">1000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>;<br />
对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>100</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">100\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">%</span></span></span></span> 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>n</mi><mo>≤</mo><mn>1</mn><mo separator="true">,</mo><mn>000</mn><mo separator="true">,</mo><mn>000</mn></mrow><annotation encoding="application/x-tex">1 ≤ n ≤ 1,000,000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7719400000000001em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>p</mi><mo>≤</mo><mn>1</mn><msup><mn>0</mn><mn>9</mn></msup></mrow><annotation encoding="application/x-tex">1≤ p ≤ 10^9</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8141079999999999em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141079999999999em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">9</span></span></span></span></span></span></span></span></span></span></span>,其他数字的绝对值均不超过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>10</mn></mrow><annotation encoding="application/x-tex">10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span></span></span></span>。</p>
</blockquote>
<blockquote>
<p><strong><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3Byb2JsZW0vUDE5ODM=">车站分级</span>(NOIP 2013 普及组 第 4 题)</strong></p>
<p><strong>题目描述</strong></p>
<p>一条单向的铁路线上,依次有编号为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">1, 2, \dots, n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8388800000000001em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">n</span></span></span></span> 的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个火车站。每个火车站都有一个级别,最低为 1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">x</span></span></span></span>,则始发站、终点站之间所有级别大于等于火车站 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">x</span></span></span></span> 的都必须停靠。</p>
<p>(注意:起始站和终点站自然也算作事先已知需要停靠的站点)</p>
<p>例如,下表是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>5</mn></mrow><annotation encoding="application/x-tex">5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">5</span></span></span></span> 趟车次的运行情况。其中,前 4 趟车次均满足要求,而第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>5</mn></mrow><annotation encoding="application/x-tex">5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">5</span></span></span></span> 趟车次由于停靠了 3 号火车站(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span> 级)却未停靠途经的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>6</mn></mrow><annotation encoding="application/x-tex">6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">6</span></span></span></span> 号火车站(亦为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span> 级)而不满足要求。</p>
<p><img data-src="https://i.loli.net/2021/01/17/c5IZgPnbsujR3mX.jpg" alt="" /></p>
<p>现有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">m</span></span></span></span> 趟车次的运行情况(全部满足要求) ,试推算这 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个火车站至少分为几个不同的级别。</p>
<p><strong>输入格式</strong></p>
<p>第一行包含 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span> 个正整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo separator="true">,</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">n, m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">m</span></span></span></span>,用一个空格隔开。</p>
<p>第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">i + 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.74285em;vertical-align:-0.08333em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span> 行(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>i</mi><mo>≤</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">1 ≤ i ≤ m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.79549em;vertical-align:-0.13597em;"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">m</span></span></span></span>)中,首先是一个正整数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>s</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">s_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mo>≤</mo><msub><mi>s</mi><mi>i</mi></msub><mo>≤</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">2 ≤ s_i ≤ n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.7859700000000001em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span>),表示第 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.65952em;vertical-align:0em;"></span><span class="mord mathnormal">i</span></span></span></span> 趟车次有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>s</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">s_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 个停靠站;接下来有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>s</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">s_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.31166399999999994em;"><span style="top:-2.5500000000000003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s"></span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。</p>
<p><strong>输出格式</strong></p>
<p>输出只有一行,包含一个正整数,即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.43056em;vertical-align:0em;"></span><span class="mord mathnormal">n</span></span></span></span> 个火车站最少划分的级别数。</p>
<p><strong>输入输出样例</strong></p>
<p>输入 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>9 2 </pre></td></tr><tr><td data-num="2"></td><td><pre>4 1 3 5 6 </pre></td></tr><tr><td data-num="3"></td><td><pre>3 3 5 6</pre></td></tr></table></figure><p>输出 #1</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>2</pre></td></tr></table></figure><p>输入 #2</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>9 3 </pre></td></tr><tr><td data-num="2"></td><td><pre>4 1 3 5 6 </pre></td></tr><tr><td data-num="3"></td><td><pre>3 3 5 6 </pre></td></tr><tr><td data-num="4"></td><td><pre>3 1 5 9</pre></td></tr></table></figure><p>输出 #2</p>
<figure class="highlight plain"><figcaption data-lang="plain"></figcaption><table><tr><td data-num="1"></td><td><pre>3</pre></td></tr></table></figure><p><strong>数据范围</strong></p>
<p>对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>20</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">20\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">2</span><span class="mord">0</span><span class="mord">%</span></span></span></span> 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>n</mi><mo separator="true">,</mo><mi>m</mi><mo>≤</mo><mn>10</mn></mrow><annotation encoding="application/x-tex">1 ≤ n, m ≤ 10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span></span></span></span>;</p>
<p>对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>50</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">50\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">5</span><span class="mord">0</span><span class="mord">%</span></span></span></span> 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>n</mi><mo separator="true">,</mo><mi>m</mi><mo>≤</mo><mn>100</mn></mrow><annotation encoding="application/x-tex">1 ≤ n, m ≤ 100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span></span></span></span>;</p>
<p>对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>100</mn><mi mathvariant="normal">%</mi></mrow><annotation encoding="application/x-tex">100\%</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.80556em;vertical-align:-0.05556em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">%</span></span></span></span> 的数据,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>≤</mo><mi>n</mi><mo separator="true">,</mo><mi>m</mi><mo>≤</mo><mn>1000</mn></mrow><annotation encoding="application/x-tex">1 ≤ n, m ≤ 1000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78041em;vertical-align:-0.13597em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathnormal">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.64444em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span>。</p>
</blockquote>
<p>第 1 题,太弱了,不用骗,得 100 分。</p>
<p>第 2 题,数据很大,但是可以直接输入一个数,输出它 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext> </mtext><mo lspace="0.22em" rspace="0.22em"><mrow><mi mathvariant="normal">m</mi><mi mathvariant="normal">o</mi><mi mathvariant="normal">d</mi></mrow></mo><mtext> </mtext><mn>10000</mn></mrow><annotation encoding="application/x-tex">\bmod 10000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mspace" style="margin-right:0.05555555555555555em;"></span><span class="mord"><span class="mord"><span class="mord mathrm">m</span><span class="mord mathrm">o</span><span class="mord mathrm">d</span></span></span><span class="mspace" style="margin-right:0.05555555555555555em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span></span></span></span> 的值。得 10 分。</p>
<p>第 3 题,是一道非常基础的 DP,但对于不知 DP 为何物的蒟蒻来说,就使用暴力算法(即 DFS)。得 20 分。</p>
<p>第 4 题,我们可以寻找一下数据的规律,你会发现,在所有样例中,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 值即为答案。所以直接输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.68333em;vertical-align:0em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span>,得 10 分。</p>
<p>这样下来,一共得 140 分,比一等分数线还高 20 分!你的信心一定会得到鼓舞的。这就是骗分的神奇。</p>
<div class="note info">
<p>编者注:应该是弱省的分数线。</p>
</div>
<h1 id="第-9-章-结语"><a class="anchor" href="#第-9-章-结语">#</a> 第 9 章 结语</h1>
<p>骗分是蒟蒻的有力武器,可以在比赛中骗得大量分数。相信大家在这本书中收获了很多,希望本书能帮助你多得一些分。</p>
<p>但是,最后我还是要说一句:</p>
<p><strong>不骗分,是骗分的最高境界。</strong></p>
<hr />
<p>本文转载自:<span class="exturl" data-url="aHR0cHM6Ly92aWpvcy5vcmcvZGlzY3Vzcy81MzQzZWI2YzQ4YzVmYzg2NDY4YjQ1N2Q=">https://vijos.org/discuss/5343eb6c48c5fc86468b457d</span></p>
<p>为了更好的排版效果,部分题目参考了 <span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNu">洛谷</span> 进行了修改。</p>
<p>以下为原作者信息:</p>
<div class="note info">
<p>作者:大神 cyd</p>
<p>QQ:724612372</p>
</div>
<hr />
<p>考前推荐阅读:</p>
<p><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Jsb2cvdXNlcjMyOTYvb2ktemhvbmctamlhbi1kYW4tZGktY2hhbmctc2h1by15b3UtaHVh">OI 中简单的常数优化的介绍</span></p>
<p><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Jsb2cvenlmMjAwNC9mdS1zYWktc2hpLXlhby1qaS16aHUtZGktMzAtZ291LWh1YQ==">复赛时要记住的 30 句话</span></p>
<p><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Rpc2N1c3Mvc2hvdy83MDc4Ng==">怎么在 NOIP 用下划线开头的 STL</span></p>
2020-10-07T04:00:00.000Z
https://fidel.js.org/2020/04/05/new-about/
About Fidel's Lab
<div class="note info">
<p>此 About 页面及 Fidel's Lab 为目前的第三个版本。你可以 <a href="https://fidel.js.org/changelog">在这里查看详细的更新日志</a>。</p>
</div>
<span id="more"></span>
<p><s>现役 OIer</s> 已退役。</p>
<h1 id="rss-订阅"><a class="anchor" href="#rss-订阅">#</a> RSS 订阅</h1>
<p>RSS 是个好东西。它将每个人的不同系统、不同主题、不同排版的 Blog 集合成一种统一的信息格式,将浏览独立博客这种行为从「被动浏览」变为「伪主动推送」。</p>
<p>在我看来,RSS 不仅是一种技术上的革命,更是一种信息获取方式的革命。</p>
<p>您可以在 <a href="https://fidel.js.org/feed">这里</a> 获取 Fidel's Lab 的详细 RSS 订阅链接。</p>
<p><s>(虽然我知道这么写似乎不太优雅,但一下子想不到更好的措辞了 QwQ)</s></p>
<h1 id="哪里可以找到我"><a class="anchor" href="#哪里可以找到我">#</a> 哪里可以找到我</h1>
<ul>
<li>GitHub:<span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL0ZpZGVseHl6Lw==">@Fidelxyz</span></li>
<li>洛谷 Luogu: <span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL3VzZXIvMTkwODMz">@Fidel</span></li>
</ul>
<h1 id="一些技术性信息"><a class="anchor" href="#一些技术性信息">#</a> 一些技术性信息</h1>
<p>Fidel's Lab 现采用的主题是 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2FtZWhpbWUvaGV4by10aGVtZS1zaG9rYQ==">hexo-theme-shoka</span>。</p>
<div class="note info">
<p>Docs: <span class="exturl" data-url="aHR0cHM6Ly9zaG9rYS5sb3N0eXUubWUvY29tcHV0ZXItc2NpZW5jZS9ub3RlL3RoZW1lLXNob2thLWRvYy9zcGVjaWFsLw==">https://shoka.lostyu.me/computer-science/note/theme-shoka-doc/special/</span></p>
</div>
<div class="note primary">
<p>Fidel's Lab 曾经采用的 Hexo 主题为基于 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL2hleG9qcy9oZXhvLXRoZW1lLWxhbmRzY2FwZQ==">landspace</span> 和 <span class="exturl" data-url="aHR0cHM6Ly9naXRodWIuY29tL3N0b25lMDA5MC9sYW5kc2NhcGUtcGx1cw==">landscape-plus</span> 的魔改版。</p>
</div>
2020-04-05T04:00:00.000Z
https://fidel.js.org/2019/12/27/CSPJ-tour/
CSP-J 2019 游记 & 指引
<p>下面那篇 NOIP 比赛笔记其实是给我自己看的……</p>
<p>所以大家请看这篇 😃</p>
<blockquote>
<p>彻底失去对 Luogu Blog 排版的信心。果然还是自己亲手搭的 Hexo 好用。</p>
<p>啧啧啧,我的 Hexo 排版真的好看。<_<</p>
</blockquote>
<span id="more"></span>
<h1 id="比赛前干啥"><a class="anchor" href="#比赛前干啥">#</a> 比赛前干啥</h1>
<p>睡觉。</p>
<p>CSP-J 在下午,如果有时间,你还可以睡个中午觉。</p>
<p><s>不然你就只能在考场上睡了。</s></p>
<p>😃</p>
<p>临走前记得带上这些:</p>
<ul>
<li>身份证</li>
<li>准考证</li>
<li>通讯工具</li>
<li>2 支或以上好写的笔(可以带几支不同颜色的)</li>
<li>纸巾</li>
<li>一个背包</li>
</ul>
<p>水其实可以不用带。上车后会发一瓶,到了考场还有一瓶。当时我包里带了 3 瓶水回来,考场发的鼎湖山泉现在还放在我桌面上。</p>
<h1 id="开考前干啥"><a class="anchor" href="#开考前干啥">#</a> 开考前干啥</h1>
<p>进入考场之前,手机关机放背包里,不要带进去。</p>
<p>对了,你可以带吃的进去,<strong>神奇的 NOIP 允许你在考试时吃东西。</strong></p>
<p><s>当然你也可以试试带榴莲或者榴莲糖、榴莲蛋糕之类的进去吃,规则上没说不给,不过不保证你能活着出来。😃</s></p>
<p>进入考场,先进入设置把屏幕分辨率从老人机模式调到<strong>原生分辨率</strong>,显示器亮度调到合适,鼠标键盘调到一个舒适的位置。检查机箱 USB 封条是否稳固。</p>
<p>桌面上有<strong>一个加密的压缩包,所有规则须知的文件,和一个编程程序文件夹</strong>。通读须知,<strong>C 盘下建好文件夹</strong>。设置编辑器环境。</p>
<blockquote>
<h2 id="dev-c"><a class="anchor" href="#dev-c">#</a> Dev C++</h2>
<h3 id="自动保存"><a class="anchor" href="#自动保存">#</a> 自动保存</h3>
<ul>
<li><strong>「工具 -> 编辑器选项 - > 自动保存 -> 启动编辑器自动保存」<strong>打勾,文件名 选择</strong>「附加格式化时间戳」</strong></li>
</ul>
<h3 id="编译选项"><a class="anchor" href="#编译选项">#</a> 编译选项</h3>
<ul>
<li>
<p><strong>「工具 -> 编译选项 -> 代码生成 / 优化 -> 连接器 -> 产生调试信息」</strong> 选择 YES</p>
<p>快捷键:启动调试 <code>F5</code> 下一步 <code>F7</code></p>
</li>
<li>
<p><strong>打开 <code>-Wall</code> </strong></p>
</li>
<li>
<p><strong>选择 C++ 编译器标准:ISO C++98</strong></p>
</li>
</ul>
</blockquote>
<p>为了减少踢到<strong>电源线 / 考场停电 / 电脑死机</strong>时的损失,请打开<strong>自动保存</strong>。<strong>每做完一道题可以备份一份到 D/E/F 盘。</strong></p>
<p>然后差不多开始做题了。</p>
<h1 id="考试开始"><a class="anchor" href="#考试开始">#</a> 考试开始</h1>
<p>输密码是一个会让人抓狂的环节,因为老师读给你的密码会是这样的:</p>
<blockquote>
<p>=zhu1YI1JIAN1cha6(大小写拼音 + 数字)</p>
</blockquote>
<p>实在难以想象一位有方言口音的老师读密码时的情景。</p>
<p><strong>请先把密码打在记事本上,再复制密码解压。</strong></p>
<p>解开压缩包之后,你就可以愉快地做题了。</p>
<p>一些小技巧和注意事项:</p>
<ul>
<li><strong>分屏大法,左边敲代码,右边看题目。</strong></li>
<li>善用草稿纸。T3 T4 写代码前<strong>列需求点,画图</strong>。</li>
<li><strong>记得加文件读写!</strong></li>
<li>接上一条,测试时用文件测。</li>
</ul>
<p>话说我当时的机子 Win 键貌似坏了…… <code>Win</code> + <code>D</code> 和 <code>Win</code> + <code>Tab</code> 用不了,难受。</p>
<blockquote>
<p>比赛结束前 10 分钟就放弃治疗吧,别希望能绝杀。再三检查有没有去掉调试语句、是否能通过编译,文件输入输出是否正确,文件名和建立文件夹是否正确。</p>
</blockquote>
<blockquote>
<p>考场上如果没思路,建议多往厕所跑跑,厕所是一个很奇怪的地方,时常能在厕所获得灵感(雾)</p>
</blockquote>
<h2 id="大数据读写"><a class="anchor" href="#大数据读写">#</a> 大数据读写</h2>
<p>电脑上装了 GVim,<strong>务必使用 GVim 打开大数据文件</strong>。(Notepad 打开会卡死)</p>
<blockquote>
<p>使用 Vim 打开了文件,我们发现此时我们无法对文件进行操作</p>
<p>不要慌,Vim 默认开启时是 “命令” 模式,是需要输入指令来操作的</p>
<p><strong>我们按下 <code>i</code> ,切换到插入模式</strong>,就可以愉快的写代码了</p>
<p>写完代码了,我们需要保存一下</p>
<p>那么问题来了,怎么保存呢</p>
<p>首先,<strong>我们按下 <code>Esc</code> 键</strong> <s>(敲 ESC 三个字母的可以关掉 blog 直接退役了)</s>,返回命令模式</p>
<p>然后,我们在命令模式下<strong>输入 <code>:wq</code> </strong> (均为小写英文字符),就可以保存文件并直接回到终端啦</p>
<p><strong>语句解释: <code>:</code> 的作用是一次输入多条指令,上文中我们未使用 <code>:</code> 直接按 <code>i</code> 便是立刻执行命令,这里便会等待你一次输入全部命令回车后依次执行; <code>w</code> 是 Vim 的保存命令 <s>(不是 s 吗)</s> ; <code>q</code> 是退出指令</strong></p>
</blockquote>
<hr />
<p>写不动了,下星期再接着写。</p>
<hr />
<h1 id="补充"><a class="anchor" href="#补充">#</a> 补充</h1>
<h2 id="2020-04-06"><a class="anchor" href="#2020-04-06">#</a> 2020-04-06</h2>
<p>也没啥好写的了,差不多就这些。就这样吧。</p>
<p>祝大家</p>
<p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>R</mi><mi>P</mi><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><msup><mo>+</mo><mrow><mo>+</mo><mo>+</mo></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow></msup></mrow><annotation encoding="application/x-tex">RP++^{++^{++^{++^{++^{++^{++^{++^{++^{++^{++^{++^{++^{++^{++^{++^{++^{++^{++} } } } } } } } } } } } } } } } } }
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.76666em;vertical-align:-0.08333em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">R</span><span class="mord mathnormal" style="margin-right:0.13889em;">P</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:4.321695em;vertical-align:-0.08333em;"></span><span class="mord"><span class="mbin">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:4.238365em;"><span style="top:-6.238365em;margin-right:0.05em;"><span class="pstrut" style="height:5.825365em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:5.4648071428571425em;"><span style="top:-7.4648071428571425em;margin-right:0.07142857142857144em;"><span class="pstrut" style="height:7.0338071428571425em;"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:7.047329999999999em;"><span style="top:-9.047329999999999em;margin-right:0.1em;"><span class="pstrut" style="height:8.643329999999999em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:6.643329999999999em;"><span style="top:-8.643329999999999em;margin-right:0.1em;"><span class="pstrut" style="height:8.239329999999999em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:6.239329999999999em;"><span style="top:-8.239329999999999em;margin-right:0.1em;"><span class="pstrut" style="height:7.835329999999999em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:5.835329999999999em;"><span style="top:-7.835329999999999em;margin-right:0.1em;"><span class="pstrut" style="height:7.431329999999999em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:5.431329999999999em;"><span style="top:-7.431329999999999em;margin-right:0.1em;"><span class="pstrut" style="height:7.027329999999999em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:5.027329999999999em;"><span style="top:-7.027329999999999em;margin-right:0.1em;"><span class="pstrut" style="height:6.623329999999999em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:4.623329999999999em;"><span style="top:-6.623329999999999em;margin-right:0.1em;"><span class="pstrut" style="height:6.219329999999999em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:4.219329999999999em;"><span style="top:-6.219329999999999em;margin-right:0.1em;"><span class="pstrut" style="height:5.815329999999999em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:3.8153299999999994em;"><span style="top:-5.815329999999999em;margin-right:0.1em;"><span class="pstrut" style="height:5.4113299999999995em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:3.4113299999999995em;"><span style="top:-5.4113299999999995em;margin-right:0.1em;"><span class="pstrut" style="height:5.00733em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:3.0073299999999996em;"><span style="top:-5.00733em;margin-right:0.1em;"><span class="pstrut" style="height:4.60333em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:2.6033299999999997em;"><span style="top:-4.60333em;margin-right:0.1em;"><span class="pstrut" style="height:4.19933em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:2.19933em;"><span style="top:-4.19933em;margin-right:0.1em;"><span class="pstrut" style="height:3.79533em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.7953299999999999em;"><span style="top:-3.79533em;margin-right:0.1em;"><span class="pstrut" style="height:3.39133em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.39133em;"><span style="top:-3.39133em;margin-right:0.1em;"><span class="pstrut" style="height:2.98733em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight"><span class="mbin mtight">+</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.98733em;"><span style="top:-2.98733em;margin-right:0.1em;"><span class="pstrut" style="height:2.58333em;"></span><span class="mord mtight"><span class="mord mtight">+</span><span class="mord mtight">+</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p>(从 <span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Jsb2cvSmFtZXNIZS9jc3Atai15b3Utamk=">隔壁大佬</span> 那抄来的 RP+++++)</p>
<h1 id="引用的文章"><a class="anchor" href="#引用的文章">#</a> 引用的文章</h1>
<ol>
<li><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3Uub3JnL2Jsb2cvZXhwZWN0L3lpLW1lbmctd2VpLW1hLWZvdS1mdS1zaGFvLWh1YS1jc3AyMDE5LWthby1xaWFuLXRpLXhpbmc=">以梦为马,不负韶华 ——CSP2019 考前提醒</span></li>
<li><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3Uub3JnL2Jsb2cvdHdpL3poaS1jc3AtbWVuZy14aW4tZm91LWt1YWktc2hpLXlvbmctbm9pLWxpbnV4LWRpLXJlbi1xdW4=">致 CSP 萌新 / 不会使用 NOI LINUX 的人群</span></li>
</ol>
2019-12-27T05:00:00.000Z
https://fidel.js.org/2019/11/15/noip-note/
NOIP 比赛笔记
<p>一点小笔记</p>
<p>祝大家 RP++</p>
<span id="more"></span>
<h1 id="0x01-环境配置"><a class="anchor" href="#0x01-环境配置">#</a> 0x01 环境配置</h1>
<h2 id="dev-c"><a class="anchor" href="#dev-c">#</a> Dev C++</h2>
<h3 id="自动保存"><a class="anchor" href="#自动保存">#</a> 自动保存</h3>
<ul>
<li><strong>「工具 -> 编辑器选项 - > 自动保存 -> 启动编辑器自动保存」<strong>打勾,文件名 选择</strong>「附加格式化时间戳」</strong></li>
</ul>
<h3 id="编译选项"><a class="anchor" href="#编译选项">#</a> 编译选项</h3>
<ul>
<li>
<p><strong>「工具 -> 编译选项 -> 代码生成 / 优化 -> 连接器 -> 产生调试信息」</strong> 选择 YES</p>
<p>快捷键:启动调试 <code>F5</code> 下一步 <code>F7</code></p>
</li>
<li>
<p><strong>打开 <code>-Wall</code> </strong></p>
</li>
<li>
<p><strong>选择 C++ 编译器标准:ISO C++98</strong></p>
</li>
</ul>
<h2 id="vim"><a class="anchor" href="#vim">#</a> Vim</h2>
<p><code>:vsp ~/.vimrc</code></p>
<pre><code class="language-sh">set ts=4
set sw=4
set smarttab
set number
set expandtab
color desert
syntax on
set cindent
set guifont=Consolas:h16
set backspace=2
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
inoremap { {}<ESC>i
inoremap < <><ESC>i
vmap <C-C> "+y
vmap <C-V> "+p
imap <C-V> <ESC>"+pa
vmap <BACKSPACE> d
imap <C-Z> <ESC>ua
vmap <C-Z> uv
imap <C-S> <ESC>:w<CR>a
vmap <C-S> :w<CR>v
imap <C-A> <ESC>ggVG
vmap <C-A> ggVG
</code></pre>
<h1 id="0x02-注意事项"><a class="anchor" href="#0x02-注意事项">#</a> 0x02 注意事项</h1>
<p>由于 CSP 的评测是在 Linux 的环境下完成的,因此有一些注意事项需要注意:</p>
<ol>
<li>尽量不要使用 <code>gets()</code> 语句读取一行,因为这些函数使用换行符来判断行结束,Windows 下换行是 <code>\r\n</code> ,而 Linux 下换行是 <code>\n</code> ,假设某题的数据是在 Windows 下生成的,那么这道题的换行符就是 <code>\r\n</code> ,最终比赛时的代码是在 Linux 下编译的,读取的换行符是 <code>\n</code> ,这样就会导致读入错误。</li>
</ol>
<blockquote>
<p>kkksc03 评论:其实不使用 <code>gets()</code> 的原因主要还是潜在的溢出风险。</p>
</blockquote>
<ol start="2">
<li>
<p>评测环境为 Linux 64 位,因此请注意指针变量占用的空间是 <code>8</code> 字节,注意计算内存,避免 MLE。</p>
</li>
<li>
<p>在使用 <code>long long</code> 时请记得使用 <code>%lld</code> 而非 WIndows 下的 <code>%I64d</code> 。</p>
</li>
<li>
<p>忌使用 <code>__</code> (双下划线)开头的函数。</p>
</li>
<li>
<p><code>int</code> * <code>int</code> 乘法强转 <code>long long</code> !</p>
</li>
<li>
<p>减少不必要的优化,以降低思维难度、减少代码量和出错为目标。</p>
</li>
<li>
<p><code>next</code> , <code>x0</code> , <code>x1</code> , <code>y0</code> , <code>y1</code> , <code>index</code> 别作变量名!</p>
</li>
<li>
<p>注意 <code>long long</code> 级别的 <code>INF</code> 要开 <code>0x3f3f3f3f3f3f3f3fll</code> 。</p>
</li>
<li>
<p><code>long long</code> 状压左移写 <code>1ll</code> 。</p>
</li>
<li>
<p><strong>尽可能到 Linux 测样例!</strong></p>
</li>
<li>
<p>比赛结束前 10 分钟就放弃治疗吧,别希望能绝杀。再三检查有没有去掉调试语句、是否能通过编译,文件输入输出是否正确,文件名和建立文件夹是否正确。</p>
</li>
<li>
<p><strong>觉得该用 <code>long long</code> 就用!</strong></p>
</li>
<li>
<p><strong>注意检查函数是否写了返回值类型,尤其是 <code>inline</code> 后面!Windows 下不会报错,尽量到 Linux 下测一次!</strong></p>
</li>
<li>
<p>别踢电源线!</p>
</li>
</ol>
<h1 id="0x03-小技巧-and-notes"><a class="anchor" href="#0x03-小技巧-and-notes">#</a> 0x03 小技巧 and Notes</h1>
<h2 id="c-代码模板"><a class="anchor" href="#c-代码模板">#</a> C++ 代码模板</h2>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><cstdio></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">inline</span> <span class="token keyword">int</span> <span class="token function">read</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">int</span> x<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> f<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">;</span> <span class="token keyword">char</span> ch<span class="token operator">=</span><span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token keyword">while</span><span class="token punctuation">(</span>ch<span class="token operator"><</span><span class="token char">'0'</span><span class="token operator">||</span>ch<span class="token operator">></span><span class="token char">'9'</span><span class="token punctuation">)</span><span class="token punctuation">{</span><span class="token keyword">if</span><span class="token punctuation">(</span>ch<span class="token operator">==</span><span class="token char">'-'</span><span class="token punctuation">)</span> f<span class="token operator">=</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">;</span> ch<span class="token operator">=</span><span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">while</span><span class="token punctuation">(</span>ch<span class="token operator">>=</span><span class="token char">'0'</span><span class="token operator">&&</span>ch<span class="token operator"><=</span><span class="token char">'9'</span><span class="token punctuation">)</span><span class="token punctuation">{</span>x<span class="token operator">=</span>x<span class="token operator">*</span><span class="token number">10</span><span class="token operator">+</span>ch<span class="token operator">-</span><span class="token number">48</span><span class="token punctuation">;</span> ch<span class="token operator">=</span><span class="token function">getchar</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token keyword">return</span> x<span class="token operator">*</span>f<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token punctuation">}</span></pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token function">freopen</span><span class="token punctuation">(</span><span class="token string">"test.in"</span><span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">,</span> <span class="token constant">stdin</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token function">freopen</span><span class="token punctuation">(</span><span class="token string">"test.out"</span><span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">,</span> <span class="token constant">stdout</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="13"></td><td><pre></pre></td></tr><tr><td data-num="14"></td><td><pre> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token constant">stdin</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token function">fclose</span><span class="token punctuation">(</span><span class="token constant">stdout</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="16"></td><td><pre> <span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="17"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><h2 id="安全数组大小"><a class="anchor" href="#安全数组大小">#</a> 安全数组大小</h2>
<p><strong>记得开全局数组!!</strong></p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">5792</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">5792</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// 5792*5792*4/1024/1024≈128 MiB.</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">33554432</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// (≈3*10^7) 33554432*4/1024/1024= 128 MiB.</span></pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">8192</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">8192</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// 8192*8192*4/1024/1024≈256 MiB.</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">67108864</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// (≈6*10^7) 67108864*4/1024/1024= 256 MiB.</span></pre></td></tr><tr><td data-num="6"></td><td><pre></pre></td></tr><tr><td data-num="7"></td><td><pre><span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">11585</span><span class="token punctuation">]</span><span class="token punctuation">[</span><span class="token number">11585</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">//11585*11585*4/1024/1024≈512 MiB.</span></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token number">134217728</span><span class="token punctuation">]</span><span class="token punctuation">;</span> <span class="token comment">// (≈10^8) 134217728*4/1024/1024= 512 MiB.</span></pre></td></tr></table></figure><h2 id="对拍"><a class="anchor" href="#对拍">#</a> 对拍</h2>
<p>为了防止挂分,建议对拍,即用暴力和要提交的程序进行互相检测。</p>
<p>建议不会写数据生成器的同学恶补一下。</p>
<p>这里提供一种用 C++ 写的 Windows 对拍脚本,可以参考一下。</p>
<p>其中 <code>data.exe</code> 是数据生成器, <code>std.exe</code> 是暴力, <code>test.exe</code> 是要测的程序。</p>
<p><code>test.out</code> 是要测的程序的输出文件, <code>test.ans</code> 是暴力的输出文件。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><bits/stdc++.h></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><windows.h></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">using</span> <span class="token keyword">namespace</span> std<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="6"></td><td><pre> <span class="token keyword">for</span><span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">1</span><span class="token punctuation">;</span> <span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="7"></td><td><pre> <span class="token function">Sleep</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="8"></td><td><pre> <span class="token function">system</span><span class="token punctuation">(</span><span class="token string">"data.exe"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="9"></td><td><pre> <span class="token function">system</span><span class="token punctuation">(</span><span class="token string">"std.exe"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="10"></td><td><pre> <span class="token function">syetem</span><span class="token punctuation">(</span><span class="token string">"test.exe"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="11"></td><td><pre> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"-----------Test Case %d----------\n"</span><span class="token punctuation">,</span>cas<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="12"></td><td><pre> <span class="token keyword">if</span><span class="token punctuation">(</span><span class="token function">system</span><span class="token punctuation">(</span><span class="token string">"fc test.out test.ans"</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token function">system</span><span class="token punctuation">(</span><span class="token string">"pause"</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="13"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><h2 id="奇妙的语法"><a class="anchor" href="#奇妙的语法">#</a> 奇妙的语法</h2>
<h3 id="inline"><a class="anchor" href="#inline">#</a> <code>inline</code></h3>
<p><strong>竞赛中尽量别用。</strong></p>
<p><strong>记得加函数返回值!</strong></p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">inline</span> <span class="token keyword">void</span> <span class="token function">MyFunction</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token comment">// ...</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><h3 id="运算符重载"><a class="anchor" href="#运算符重载">#</a> 运算符重载</h3>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">struct</span> <span class="token class-name">MyStruct</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">int</span> val<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">bool</span> <span class="token keyword">operator</span><span class="token operator"><</span><span class="token punctuation">(</span><span class="token keyword">const</span> MyStruct <span class="token operator">&</span>u1<span class="token punctuation">)</span> <span class="token keyword">const</span> <span class="token punctuation">{</span></pre></td></tr><tr><td data-num="4"></td><td><pre> <span class="token keyword">return</span> val <span class="token operator"><</span> u1<span class="token punctuation">.</span>val<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre> <span class="token punctuation">}</span></pre></td></tr><tr><td data-num="6"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><h2 id="io"><a class="anchor" href="#io">#</a> IO</h2>
<h3 id="long-long-读写"><a class="anchor" href="#long-long-读写">#</a> long long 读写</h3>
<p>记得用 <code>%lld</code> !</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">long</span> <span class="token keyword">long</span> a<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">scanf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> <span class="token operator">&</span>a<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 读写 long long 注意用 % lld </span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%lld"</span><span class="token punctuation">,</span> a<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><h3 id="整行读入"><a class="anchor" href="#整行读入">#</a> 整行读入</h3>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><iostream></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><string></span></span></pre></td></tr><tr><td data-num="3"></td><td><pre></pre></td></tr><tr><td data-num="4"></td><td><pre>std<span class="token double-colon punctuation">::</span>string a<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre><span class="token function">getline</span><span class="token punctuation">(</span>cin<span class="token punctuation">,</span> a<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><h2 id="stl"><a class="anchor" href="#stl">#</a> STL</h2>
<h3 id="includemath"><a class="anchor" href="#includemath">#</a> <code>#include<math></code></h3>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">double</span> <span class="token function">pow</span><span class="token punctuation">(</span><span class="token keyword">double</span> x<span class="token punctuation">,</span> <span class="token keyword">double</span> y<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">//x^y</span></pre></td></tr></table></figure><p><strong>请勿使用 <code>cmath</code> 库中的 <code>abs</code> 函数!</strong></p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token comment">//DO NOT USE THEM!!!</span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token keyword">int</span> <span class="token function">abs</span><span class="token punctuation">(</span><span class="token keyword">int</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">double</span> <span class="token function">fabs</span><span class="token punctuation">(</span><span class="token keyword">double</span> x<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><blockquote>
<p>C++ 有很多 <s>bug</s> 你想不到的事!</p>
<p>相信 OIers 经常盯着一个他认为没毛病的程序,找问题。一小时后,他把</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string"><cmath></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre><span class="token function">abs</span><span class="token punctuation">(</span>n<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><p>改成</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token keyword">int</span> <span class="token function">myabs</span><span class="token punctuation">(</span><span class="token keyword">int</span> n<span class="token punctuation">)</span><span class="token punctuation">{</span></pre></td></tr><tr><td data-num="2"></td><td><pre> <span class="token keyword">if</span><span class="token punctuation">(</span>n<span class="token operator">>=</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token keyword">return</span> n<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="3"></td><td><pre> <span class="token keyword">return</span> <span class="token operator">-</span>n<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre><span class="token punctuation">}</span></pre></td></tr></table></figure><p>后就 AC 了</p>
<p>来源:<span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3UuY29tLmNuL2Jsb2cvc2l0ZW9ma29iYXlhc2hpL2dlaS1zdW8teW91LXpodW4tYmVpLWppbmctc2FpLWRpLXRvbmcteHVl">给所有准备竞赛的同学 - Nothing But Something - 洛谷博客</span></p>
</blockquote>
<p>如果你非得要用 STL 的 <code>abs</code> ,请用 <code>cstdlib</code> 库中的。</p>
<h3 id="includealgorithm"><a class="anchor" href="#includealgorithm">#</a> <code>#include<algorithm></code></h3>
<p><code>sort</code> 函数的第二个参数为<ins>待排序区间最后一个元素的<strong>后一个元素</strong>地址</ins>。</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><algorithm></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token keyword">int</span> a<span class="token punctuation">[</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token punctuation">{</span><span class="token comment">/* ... */</span><span class="token punctuation">}</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre></pre></td></tr><tr><td data-num="5"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token function">sort</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> a <span class="token operator">+</span> n<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 升序排序 a [0...n-1]</span></pre></td></tr><tr><td data-num="6"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token function">sort</span><span class="token punctuation">(</span>a <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> a <span class="token operator">+</span> n <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 升序排序 a [1...n]</span></pre></td></tr><tr><td data-num="7"></td><td><pre></pre></td></tr><tr><td data-num="8"></td><td><pre><span class="token keyword">bool</span> <span class="token function">cmp</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">&</span>u1<span class="token punctuation">,</span> <span class="token keyword">int</span> <span class="token operator">&</span>u2<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> u1 <span class="token operator">></span> u2<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// 重写比较函数</span></pre></td></tr><tr><td data-num="9"></td><td><pre></pre></td></tr><tr><td data-num="10"></td><td><pre>std<span class="token double-colon punctuation">::</span><span class="token function">sort</span><span class="token punctuation">(</span>a<span class="token punctuation">,</span> a <span class="token operator">+</span> <span class="token number">1</span><span class="token punctuation">,</span> cmp<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 降序排序 a [0...n-1]</span></pre></td></tr></table></figure><h3 id="includevector"><a class="anchor" href="#includevector">#</a> <code>#include<vector></code></h3>
<p>当数组用</p>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><vector></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> a<span class="token punctuation">;</span></pre></td></tr><tr><td data-num="4"></td><td><pre>a<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="5"></td><td><pre>a<span class="token punctuation">.</span><span class="token function">insert</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">5</span><span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 插入</span></pre></td></tr><tr><td data-num="6"></td><td><pre>a<span class="token punctuation">.</span><span class="token function">reverse</span><span class="token punctuation">(</span>a<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> a<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 翻转</span></pre></td></tr><tr><td data-num="7"></td><td><pre>a<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 查询大小</span></pre></td></tr><tr><td data-num="8"></td><td><pre>a<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 查询是否为空</span></pre></td></tr><tr><td data-num="9"></td><td><pre>a<span class="token punctuation">.</span><span class="token function">clear</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 清空</span></pre></td></tr><tr><td data-num="10"></td><td><pre>b<span class="token punctuation">.</span><span class="token function">erase</span><span class="token punctuation">(</span>b<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">,</span> b<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 删除</span></pre></td></tr><tr><td data-num="11"></td><td><pre>std<span class="token double-colon punctuation">::</span>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> b <span class="token operator">=</span> a<span class="token punctuation">;</span> <span class="token comment">// 复制,速度极快</span></pre></td></tr><tr><td data-num="12"></td><td><pre>a<span class="token punctuation">.</span><span class="token function">swap</span><span class="token punctuation">(</span>b<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 交换</span></pre></td></tr><tr><td data-num="13"></td><td><pre></pre></td></tr><tr><td data-num="14"></td><td><pre><span class="token keyword">for</span> <span class="token punctuation">(</span>vector<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span><span class="token double-colon punctuation">::</span>iterator i <span class="token operator">=</span> a<span class="token punctuation">.</span><span class="token function">begin</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i <span class="token operator">!=</span> a<span class="token punctuation">.</span><span class="token function">end</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token comment">// 迭代器</span></pre></td></tr><tr><td data-num="15"></td><td><pre> <span class="token function">printf</span><span class="token punctuation">(</span><span class="token string">"%d "</span><span class="token punctuation">,</span> <span class="token operator">*</span>i<span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><h3 id="includequeue"><a class="anchor" href="#includequeue">#</a> <code>#include<queue></code></h3>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string"><queue></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre><span class="token comment">// Queue</span></pre></td></tr><tr><td data-num="4"></td><td><pre>std<span class="token double-colon punctuation">::</span>queue<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> q1<span class="token punctuation">;</span> <span class="token comment">// 队列</span></pre></td></tr><tr><td data-num="5"></td><td><pre>q1<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 压入</span></pre></td></tr><tr><td data-num="6"></td><td><pre>q1<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 查询队头元素</span></pre></td></tr><tr><td data-num="7"></td><td><pre>q1<span class="token punctuation">.</span><span class="token function">pop</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 弹出</span></pre></td></tr><tr><td data-num="8"></td><td><pre>q1<span class="token punctuation">.</span><span class="token function">empty</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 查询是否为空</span></pre></td></tr><tr><td data-num="9"></td><td><pre>q1<span class="token punctuation">.</span><span class="token function">size</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 查询大小</span></pre></td></tr><tr><td data-num="10"></td><td><pre></pre></td></tr><tr><td data-num="11"></td><td><pre><span class="token comment">// Deque</span></pre></td></tr><tr><td data-num="12"></td><td><pre>std<span class="token double-colon punctuation">::</span>deque<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> q2<span class="token punctuation">;</span> <span class="token comment">// 双端队列</span></pre></td></tr><tr><td data-num="13"></td><td><pre>q2<span class="token punctuation">.</span><span class="token function">push_back</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="14"></td><td><pre>q2<span class="token punctuation">.</span><span class="token function">push_front</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="15"></td><td><pre>q2<span class="token punctuation">.</span><span class="token function">pop_back</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="16"></td><td><pre>q2<span class="token punctuation">.</span><span class="token function">pop_front</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="17"></td><td><pre>q2<span class="token punctuation">.</span><span class="token function">back</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="18"></td><td><pre>q2<span class="token punctuation">.</span><span class="token function">front</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr><tr><td data-num="19"></td><td><pre></pre></td></tr><tr><td data-num="20"></td><td><pre><span class="token comment">// Priority Queue</span></pre></td></tr><tr><td data-num="21"></td><td><pre>std<span class="token double-colon punctuation">::</span>priority_queue<span class="token operator"><</span><span class="token keyword">int</span><span class="token operator">></span> q3<span class="token punctuation">;</span> <span class="token comment">// 优先队列(自动排序的队列)</span></pre></td></tr><tr><td data-num="22"></td><td><pre><span class="token comment">// 默认升序排列,如果需要降序排列可重写小于号操作符 <</span></pre></td></tr></table></figure><h3 id="includeutility"><a class="anchor" href="#includeutility">#</a> <code>#include<utility></code></h3>
<figure class="highlight cpp"><figcaption data-lang="C++"></figcaption><table><tr><td data-num="1"></td><td><pre><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span><span class="token string"><utility></span></span></pre></td></tr><tr><td data-num="2"></td><td><pre></pre></td></tr><tr><td data-num="3"></td><td><pre>std<span class="token double-colon punctuation">::</span>pair<span class="token operator"><</span><span class="token keyword">int</span><span class="token punctuation">,</span> <span class="token keyword">int</span><span class="token operator">></span> a <span class="token operator">=</span> std<span class="token double-colon punctuation">::</span><span class="token function">make_pair</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">,</span> <span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">;</span></pre></td></tr></table></figure><h1 id="0x7f-神奇的网站"><a class="anchor" href="#0x7f-神奇的网站">#</a> 0x7F 神奇的网站</h1>
<p><span class="exturl" data-url="aHR0cDovL29laXMub3Jn">数列推导式查询 OEIS</span></p>
<p><span class="exturl" data-url="aHR0cHM6Ly9sdW9ndS5vcmc=">洛谷 luogu</span></p>
<h2 id="引用-or-有帮助的文章"><a class="anchor" href="#引用-or-有帮助的文章">#</a> 引用 or 有帮助的文章</h2>
<ol>
<li><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3Uub3JnL2Jsb2cvZXhwZWN0L3lpLW1lbmctd2VpLW1hLWZvdS1mdS1zaGFvLWh1YS1jc3AyMDE5LWthby1xaWFuLXRpLXhpbmc=">以梦为马,不负韶华 ——CSP2019 考前提醒</span></li>
<li><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3Uub3JnL2Jsb2cvdHdpL3poaS1jc3AtbWVuZy14aW4tZm91LWt1YWktc2hpLXlvbmctbm9pLWxpbnV4LWRpLXJlbi1xdW4=">致 CSP 萌新 / 不会使用 NOI LINUX 的人群</span></li>
<li><span class="exturl" data-url="aHR0cHM6Ly93d3cubHVvZ3Uub3JnL2Jsb2cvZGFya2ZsYW1lcy9ub2ktbGludXg=">Noi Linux 的使用</span></li>
<li><span class="exturl" data-url="aHR0cHM6Ly93d3cuemhhbmdrYWkueGluL2Jsb2cvQWJvdXQtTk9JLUxpbnV4Lw==">NOI Linux 使用心得</span></li>
<li><span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5Mzg0NDYxL2FydGljbGUvZGV0YWlscy84MTI3NzcwNw==">【模板】Noi-Linux 下的一些配置</span></li>
<li><span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Zja3VfODgvYXJ0aWNsZS9kZXRhaWxzLzg4Mjk4MzQw">C/C++ 字符串与数字相互转换</span></li>
<li><span class="exturl" data-url="aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dfbGludXgvYXJ0aWNsZS9kZXRhaWxzLzc2MjIyMTEy">C++ sort 排序函数用法</span></li>
<li><span class="exturl" data-url="aHR0cHM6Ly93d3cuY25ibG9ncy5jb20vYW1pbnh1L3AvNDY4NjMzMi5odG1s">C++ 中 vector 使用详细说明 (转)</span></li>
</ol>
2019-11-15T05:00:00.000Z