<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>lemonaaaaa&#39;s blog</title>
  
  <subtitle>A blog recording my life</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://lemonaaaaa.com/"/>
  <updated>2020-12-30T06:17:25.047Z</updated>
  <id>http://lemonaaaaa.com/</id>
  
  <author>
    <name>Lemon</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>《玫瑰海岸》 摘抄</title>
    <link href="http://lemonaaaaa.com/2020/12/lqxsw-meiguihaian/"/>
    <id>http://lemonaaaaa.com/2020/12/lqxsw-meiguihaian/</id>
    <published>2020-12-30T06:11:06.000Z</published>
    <updated>2020-12-30T06:17:25.047Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="海岸小品"><a class="markdownIt-Anchor" href="#海岸小品"></a> 海岸小品</h1><h2 id="谛听那涛声"><a class="markdownIt-Anchor" href="#谛听那涛声"></a> 谛听那涛声</h2><p style="text-indent:2em">有时候在海边的黄昏，看海鸥以优雅闲淡的姿势飞过，很容易忘记它们飞行是为了觅食；因为在我们的想象里，觅食是一种紧张的行为，应该是匆忙而混乱的。</p><p style="text-indent:2em">静静看海鸥划过晚霞，我感觉它们像我们一样，是来欣赏最后的日落。或者竟以一种澄明贞静的心情谛听着海潮的声音，让浪一波一波地冲刷着心的礁石。</p><p style="text-indent:2em">当看到海鸥敛翅，用极快的速度飞身入海，然后从海中捞起一条鱼时，我惊得呆了；原来，它不只听潮，还在觅食，随时得留意海面的动静。但它谋生的动作并未减少我对优雅的估价，反而深刻地启示了我。</p><p style="text-indent:2em">我们不可避免地要去求生，有时甚至要下海，不过，我们在紧张匆忙的生活里，可以让自己有较优雅的姿势，或者在为生活盘桓时，还可以谛听远方与心灵的潮声。</p><h2 id="享受白云"><a class="markdownIt-Anchor" href="#享受白云"></a> 享受白云</h2><p style="text-indent:2em">我带一个朋友跑了几百里路。我说：“我带你去看一件美丽的东西。”</p><p style="text-indent:2em">我们到了种满马鞍藤的海岸，我说：“到了，我带你来看南台湾的云。”</p><p style="text-indent:2em">他甚至无法在海岸上坐十分钟，说：“云，有什么好看呢？”然后就催促我离开了。</p><p style="text-indent:2em">我们跑到小镇上唯一的咖啡厅过了一个无聊的午后。喝着质劣的咖啡时，我心中想着的都是海岸上奔跑的白云。我想，下次要看云，最好独自到海边。</p><p style="text-indent:2em">这是我年轻时代的一段往事了，越近中年越让我知道，在这苦乐人间，我们很容易找到一起享用金钱的朋友，但想找到能一起喝咖啡的朋友已经难了，想找到能坐一个下午共同享受白云的朋友，就更难了。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="文学" scheme="http://lemonaaaaa.com/categories/%E6%96%87%E5%AD%A6/"/>
    
      <category term="散文" scheme="http://lemonaaaaa.com/categories/%E6%96%87%E5%AD%A6/%E6%95%A3%E6%96%87/"/>
    
    
      <category term="林清玄" scheme="http://lemonaaaaa.com/tags/%E6%9E%97%E6%B8%85%E7%8E%84/"/>
    
      <category term="散文" scheme="http://lemonaaaaa.com/tags/%E6%95%A3%E6%96%87/"/>
    
      <category term="爱情" scheme="http://lemonaaaaa.com/tags/%E7%88%B1%E6%83%85/"/>
    
      <category term="人生" scheme="http://lemonaaaaa.com/tags/%E4%BA%BA%E7%94%9F/"/>
    
  </entry>
  
  <entry>
    <title>第二十次CCF计算机软件能力认证 (CCF CSP 202009) 题解</title>
    <link href="http://lemonaaaaa.com/2020/09/ccf-csp-202009/"/>
    <id>http://lemonaaaaa.com/2020/09/ccf-csp-202009/</id>
    <published>2020-09-15T11:53:57.000Z</published>
    <updated>2020-09-15T11:58:51.550Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="第一题"><a class="markdownIt-Anchor" href="#第一题"></a> 第一题</h1><h2 id="题目大意"><a class="markdownIt-Anchor" href="#题目大意"></a> 题目大意</h2><p>给出一个参考点，再给出<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>个点，求这<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>个点中距参考点欧几里得最近的<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</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">3</span></span></span></span>个点的编号。<font color="red">如果距离相同，则按照编号升序排序。</font></p><h2 id="解法"><a class="markdownIt-Anchor" href="#解法"></a> 解法</h2><p>直接求出每个点距离参考点的距离，再排序即可。</p><p>如果不会排序，则扫三遍距离，每次找不同并且最小的即可。</p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">2005</span>;</span><br><span class="line"><span class="keyword">int</span> x,n,y;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> id;</span><br><span class="line"><span class="keyword">double</span> dis;</span><br><span class="line">&#125; pos[maxn];</span><br><span class="line"><span class="function"><span class="keyword">double</span> <span class="title">get</span><span class="params">(<span class="keyword">double</span> x,<span class="keyword">double</span> y,<span class="keyword">double</span> xx,<span class="keyword">double</span> yy)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">return</span> (x-xx)*(x-xx)+(y-yy)*(y-yy);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">cmp</span><span class="params">(node a,node b)</span> </span>&#123;<span class="keyword">return</span> a.dis==b.dis?a.id&lt;b.id:a.dis&lt;b.dis;&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d%d"</span>,&amp;n,&amp;x,&amp;y);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,tx,ty;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;tx,&amp;ty);</span><br><span class="line">pos[i].id=i;</span><br><span class="line">pos[i].dis=get(tx,ty,x,y);</span><br><span class="line">&#125;</span><br><span class="line">sort(pos+<span class="number">1</span>,pos+n,cmp);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=<span class="number">3</span>;i++) <span class="built_in">printf</span>(<span class="string">"%d\n"</span>,pos[i].id);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="第二题"><a class="markdownIt-Anchor" href="#第二题"></a> 第二题</h1><h2 id="题目大意-2"><a class="markdownIt-Anchor" href="#题目大意-2"></a> 题目大意</h2><p>给出一个疫区，再给出<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>个人各<span class="katex"><span class="katex-mathml"><math><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.61508em;vertical-align:0em;"></span><span class="mord mathdefault">t</span></span></span></span>个时刻的行踪。如果某人某时刻在疫区内，则算<code>经过</code>；如果某人<font color="red">连续</font><span class="katex"><span class="katex-mathml"><math><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.61508em;vertical-align:0em;"></span><span class="mord mathdefault">t</span></span></span></span>时刻都在疫区内，则算<code>停留</code>。求这<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>个人中经过和停留疫区的各多少人。</p><h2 id="解法-2"><a class="markdownIt-Anchor" href="#解法-2"></a> 解法</h2><p>直接模拟即可，注意要连续<span class="katex"><span class="katex-mathml"><math><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.61508em;vertical-align:0em;"></span><span class="mord mathdefault">t</span></span></span></span>时刻才算停留。</p><h2 id="代码-2"><a class="markdownIt-Anchor" href="#代码-2"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">int</span> n,k,t,xl,yd,xr,yu,x,y;</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">check</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span>(x&gt;=xl&amp;&amp;x&lt;=xr&amp;&amp;y&gt;=yd&amp;&amp;y&lt;=yu) <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d%d%d%d%d%d"</span>,&amp;n,&amp;k,&amp;t,&amp;xl,&amp;yd,&amp;xr,&amp;yu);</span><br><span class="line"><span class="keyword">int</span> ans1=<span class="number">0</span>,ans2=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> temp=<span class="number">0</span>,t2=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">bool</span> flag=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=t;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;x,&amp;y);</span><br><span class="line"><span class="keyword">if</span>(check())</span><br><span class="line">&#123;</span><br><span class="line">temp++;</span><br><span class="line">t2++;</span><br><span class="line"><span class="keyword">if</span>(t2&gt;=k) flag=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> t2=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(temp) ans1++;</span><br><span class="line"><span class="keyword">if</span>(flag) ans2++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n%d"</span>,ans1,ans2);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="第三题"><a class="markdownIt-Anchor" href="#第三题"></a> 第三题</h1><h2 id="题目大意-3"><a class="markdownIt-Anchor" href="#题目大意-3"></a> 题目大意</h2><p>给出许多逻辑器件，告诉每一个逻辑器件的输入，再给出外输入，求给定器件最后的输出。只考虑时序电路，即如果产生了循环，则输出&quot;LOOP&quot;。</p><h2 id="题解"><a class="markdownIt-Anchor" href="#题解"></a> 题解</h2><p>一眼看过去就是拓扑排序，先跑一遍求出拓扑序，然后就可以直接根据拓扑序进行处理。正好拓扑排序也可以判环，跑完拓扑排序后看是否还有点有入度，如果有，即有环。</p><h2 id="代码-3"><a class="markdownIt-Anchor" href="#代码-3"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;map&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">10005</span>;</span><br><span class="line"><span class="built_in">map</span>&lt;<span class="built_in">string</span>,<span class="keyword">int</span>&gt; mp;</span><br><span class="line"><span class="keyword">int</span> T,type[maxn],in[maxn],que[maxn],head[maxn];</span><br><span class="line"><span class="keyword">int</span> sta[maxn],cnt=<span class="number">0</span>,s,n,m,degree[maxn];</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> to,next;</span><br><span class="line">&#125; edge[maxn&lt;&lt;<span class="number">1</span>];</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> u,<span class="keyword">int</span> v)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">edge[++cnt].to=v;</span><br><span class="line">edge[cnt].next=head[u];</span><br><span class="line">head[u]=cnt;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">clear</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">memset</span>(type,<span class="number">0</span>,<span class="keyword">sizeof</span>(type));</span><br><span class="line"><span class="built_in">memset</span>(head,<span class="number">0</span>,<span class="keyword">sizeof</span>(head));</span><br><span class="line"><span class="built_in">memset</span>(degree,<span class="number">0</span>,<span class="keyword">sizeof</span>(degree));</span><br><span class="line"><span class="built_in">memset</span>(sta,<span class="number">0</span>,<span class="keyword">sizeof</span>(sta));</span><br><span class="line">cnt=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">int</span> <span class="title">getnum</span><span class="params">(<span class="built_in">string</span> str)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> x=<span class="number">0</span>,len=str.length()<span class="number">-1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=len;i++) x=(x&lt;&lt;<span class="number">1</span>)+(x&lt;&lt;<span class="number">3</span>)+str[i]<span class="number">-48</span>;</span><br><span class="line"><span class="keyword">return</span> x;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"C.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line">mp[<span class="string">"NOT"</span>]=<span class="number">1</span>;mp[<span class="string">"AND"</span>]=<span class="number">2</span>;mp[<span class="string">"OR"</span>]=<span class="number">3</span>;</span><br><span class="line">mp[<span class="string">"XOR"</span>]=<span class="number">4</span>;mp[<span class="string">"NAND"</span>]=<span class="number">5</span>;mp[<span class="string">"NOR"</span>]=<span class="number">6</span>;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line">clear();</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;m,&amp;n);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,k;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">string</span> opt,str;</span><br><span class="line"><span class="built_in">cin</span>&gt;&gt;opt;</span><br><span class="line">type[i]=mp[opt];</span><br><span class="line"><span class="comment">//printf("%d\n",type[i]);</span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;k);</span><br><span class="line"><span class="keyword">while</span>(k--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">cin</span>&gt;&gt;str;</span><br><span class="line"><span class="comment">//cout&lt;&lt;str&lt;&lt;endl;</span></span><br><span class="line"><span class="keyword">int</span> id=getnum(str);</span><br><span class="line"><span class="comment">//printf("%d\n",id);</span></span><br><span class="line"><span class="keyword">if</span>(str[<span class="number">0</span>]==<span class="string">'I'</span>)</span><br><span class="line">&#123;</span><br><span class="line">add(id+n,i);</span><br><span class="line">degree[i]++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">add(id,i);</span><br><span class="line">degree[i]++;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//printf("%d %d\n",m,n);</span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;s);</span><br><span class="line"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; in[maxn],que[maxn];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,x;i&lt;=s;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=m;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;x);</span><br><span class="line">in[i].push_back(x);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,x,ss;i&lt;=s;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;ss);</span><br><span class="line"><span class="keyword">while</span>(ss--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;x);</span><br><span class="line">que[i].push_back(x);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">queue</span>&lt;<span class="keyword">int</span>&gt; q;</span><br><span class="line"><span class="built_in">vector</span>&lt;<span class="keyword">int</span>&gt; vec[maxn],ord;</span><br><span class="line"><span class="keyword">bool</span> loop=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n+m;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(!degree[i])</span><br><span class="line">&#123;</span><br><span class="line">q.push(i);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">while</span>(!q.empty())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> x=q.front();q.pop();</span><br><span class="line">ord.push_back(x);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=head[x];i;i=edge[i].next)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(!(--degree[edge[i].to]))</span><br><span class="line">&#123;</span><br><span class="line">q.push(edge[i].to);</span><br><span class="line">&#125;</span><br><span class="line">vec[edge[i].to].push_back(x);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n+m;i++) <span class="keyword">if</span>(degree[i]) loop=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">if</span>(loop) <span class="built_in">printf</span>(<span class="string">"LOOP\n"</span>);</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//printf("%d\n",ord.size());</span></span><br><span class="line"><span class="comment">//for(int i=0;i&lt;ord.size();i++) printf("%d ",ord[i]);printf("\n");</span></span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> t=<span class="number">1</span>;t&lt;=s;t++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++) sta[i+n]=in[t][i<span class="number">-1</span>];</span><br><span class="line"><span class="comment">//for(int i=0;i&lt;(int)ord.size();i++) printf("#%d %d\n",ord[i],vec[ord[i]].size());</span></span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;(<span class="keyword">int</span>)ord.size();i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(ord[i]&gt;n) <span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">if</span>(type[ord[i]]==<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]=!sta[vec[ord[i]][<span class="number">0</span>]];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(type[ord[i]]==<span class="number">2</span>)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]=sta[vec[ord[i]][<span class="number">0</span>]];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;vec[ord[i]].size();j++)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]&amp;=sta[vec[ord[i]][j]];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(type[ord[i]]==<span class="number">3</span>)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]=sta[vec[ord[i]][<span class="number">0</span>]];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;vec[ord[i]].size();j++)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]|=sta[vec[ord[i]][j]];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(type[ord[i]]==<span class="number">4</span>)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]=sta[vec[ord[i]][<span class="number">0</span>]];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;vec[ord[i]].size();j++)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]^=sta[vec[ord[i]][j]];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(type[ord[i]]==<span class="number">5</span>)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]=sta[vec[ord[i]][<span class="number">0</span>]];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;vec[ord[i]].size();j++)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]&amp;=sta[vec[ord[i]][j]];</span><br><span class="line">&#125;</span><br><span class="line">sta[ord[i]]=!sta[ord[i]];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(type[ord[i]]==<span class="number">6</span>)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]=sta[vec[ord[i]][<span class="number">0</span>]];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;vec[ord[i]].size();j++)</span><br><span class="line">&#123;</span><br><span class="line">sta[ord[i]]|=sta[vec[ord[i]][j]];</span><br><span class="line">&#125;</span><br><span class="line">sta[ord[i]]=!sta[ord[i]];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;que[t].size();i++) <span class="built_in">printf</span>(<span class="string">"%d "</span>,sta[que[t][i]]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="第四题仅作参考"><a class="markdownIt-Anchor" href="#第四题仅作参考"></a> 第四题（仅作参考）</h1><h2 id="题目大意-4"><a class="markdownIt-Anchor" href="#题目大意-4"></a> 题目大意</h2><p>给出<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>个点，再给出一个半径为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</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 mathdefault" style="margin-right:0.02778em;">r</span></span></span></span>的圆/球/超球体（这里记为<code>CIRCLE</code>）。对于每个点，需要求出这个点与其他点的最短距离之和，不能经过<code>CIRCLE</code>。</p><h2 id="解法-3"><a class="markdownIt-Anchor" href="#解法-3"></a> 解法</h2><p>对于两个点连线不经过<code>CIRCLE</code>的一对点，最近距离就是直接连线。</p><p>对于两个点连线经过<code>CIRCLE</code>的一对点，最近距离就是切线+圆弧+切线。</p><p>但是这道题调了3个小时也不对，不知道是写挂了还是思路有问题。<br />最后只过了40分的所有点都在圆上的情况。</p><h2 id="代码40分"><a class="markdownIt-Anchor" href="#代码40分"></a> 代码（40分）</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">double</span> pi=<span class="built_in">acos</span>(<span class="number">-1.0</span>);</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">105</span>;</span><br><span class="line"><span class="keyword">int</span> n,m,r,c[maxn],p[<span class="number">2005</span>][maxn];</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="keyword">double</span> <span class="title">getdis</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> y)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">work15</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">double</span> temp=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=m;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(i==j) <span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">double</span> dis=<span class="built_in">sqrt</span>((<span class="keyword">double</span>)(p[i][<span class="number">1</span>]-p[j][<span class="number">1</span>])*(p[i][<span class="number">1</span>]-p[j][<span class="number">1</span>])+(<span class="keyword">double</span>)(p[i][<span class="number">2</span>]-p[j][<span class="number">2</span>])*(p[i][<span class="number">2</span>]-p[j][<span class="number">2</span>]));</span><br><span class="line"><span class="keyword">double</span> tdis=dis/<span class="number">2.0</span>;</span><br><span class="line"><span class="keyword">double</span> sinv=tdis/(<span class="keyword">double</span>)r;</span><br><span class="line"><span class="comment">//printf("@%lf\n",sinv);</span></span><br><span class="line"><span class="keyword">double</span> ta=<span class="built_in">asin</span>(sinv)*<span class="number">2</span>;</span><br><span class="line"><span class="comment">//printf("#%lf\n",ta/pi);</span></span><br><span class="line">temp+=ta*r;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.14lf\n"</span>,temp);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"D.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d%d"</span>,&amp;n,&amp;m,&amp;r);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;c[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=n;j++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;p[i][j]);</span><br><span class="line"><span class="keyword">if</span>(m&lt;=<span class="number">50</span>) work15();</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">double</span> temp=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=m;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(i==j) <span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">double</span> tt=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> k=<span class="number">1</span>;k&lt;=n;k++) tt+=(<span class="keyword">double</span>)(p[i][k]-p[j][k])*(p[i][k]-p[j][k]);</span><br><span class="line"><span class="keyword">double</span> dis=<span class="built_in">sqrt</span>(tt);</span><br><span class="line"><span class="keyword">double</span> tdis=dis/<span class="number">2.0</span>;</span><br><span class="line"><span class="keyword">double</span> sinv=tdis/(<span class="keyword">double</span>)r;</span><br><span class="line"><span class="comment">//printf("@%lf\n",sinv);</span></span><br><span class="line"><span class="keyword">double</span> ta=<span class="built_in">asin</span>(sinv)*<span class="number">2</span>;</span><br><span class="line"><span class="comment">//printf("#%lf\n",ta/pi);</span></span><br><span class="line">temp+=ta*r;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%.14lf\n"</span>,temp);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="CCF CSP" scheme="http://lemonaaaaa.com/categories/Code-life/CCF-CSP/"/>
    
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
      <category term="contests" scheme="http://lemonaaaaa.com/tags/contests/"/>
    
      <category term="csp" scheme="http://lemonaaaaa.com/tags/csp/"/>
    
      <category term="拓扑排序" scheme="http://lemonaaaaa.com/tags/%E6%8B%93%E6%89%91%E6%8E%92%E5%BA%8F/"/>
    
      <category term="排序" scheme="http://lemonaaaaa.com/tags/%E6%8E%92%E5%BA%8F/"/>
    
      <category term="模拟" scheme="http://lemonaaaaa.com/tags/%E6%A8%A1%E6%8B%9F/"/>
    
      <category term="思维" scheme="http://lemonaaaaa.com/tags/%E6%80%9D%E7%BB%B4/"/>
    
      <category term="计算几何" scheme="http://lemonaaaaa.com/tags/%E8%AE%A1%E7%AE%97%E5%87%A0%E4%BD%95/"/>
    
  </entry>
  
  <entry>
    <title>洛谷 P4015 运输问题 题解</title>
    <link href="http://lemonaaaaa.com/2020/08/luogu-4015/"/>
    <id>http://lemonaaaaa.com/2020/08/luogu-4015/</id>
    <published>2020-08-28T08:06:31.000Z</published>
    <updated>2020-08-28T08:06:31.863Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p><a href="https://www.luogu.com.cn/problem/P4015" target="_blank" rel="noopener">题目链接</a></p></blockquote><h1 id="题目大意"><a class="markdownIt-Anchor" href="#题目大意"></a> 题目大意</h1><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>W</mi></mrow><annotation encoding="application/x-tex">W</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 mathdefault" style="margin-right:0.13889em;">W</span></span></span></span> 公司有 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">m</span></span></span></span> 个仓库和 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span> 个零售商店。第 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">i</span></span></span></span> 个仓库有 <span class="katex"><span class="katex-mathml"><math><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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span> 个零售商店需要 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>b</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">b_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault">b</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 mathdefault mtight" style="margin-right:0.05724em;">j</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> 个单位的货物。</p><p>货物供需平衡.</p><p>从第 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">i</span></span></span></span> 个仓库运送每单位货物到第 <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span> 个零售商店的费用为 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>c</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">c_{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 mathdefault">c</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 mathdefault mtight">i</span><span class="mord mathdefault 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>​​ 。</p><p>试设计一个将仓库中所有货物运送到零售商店的运输方案，使总运输费用最少。</p><h1 id="题解"><a class="markdownIt-Anchor" href="#题解"></a> 题解</h1><p>费用流模板题。</p><p>建源点和汇点连边。</p><p>源点向每个仓库<span class="katex"><span class="katex-mathml"><math><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 mathdefault">i</span></span></span></span>连边，流量为仓库<span class="katex"><span class="katex-mathml"><math><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 mathdefault">i</span></span></span></span>的货物数量，费用为<span class="katex"><span class="katex-mathml"><math><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>.<br />每个商店<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>向汇点连边，流量为商店<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>的需求量，费用为<span class="katex"><span class="katex-mathml"><math><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>以上两种边的目的都是限制流量，同时因为货物供需平衡，最后一定能全部满足。</p><p>最后每个仓库<span class="katex"><span class="katex-mathml"><math><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 mathdefault">i</span></span></span></span>向商店<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>连边，流量为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mi>n</mi><mi>f</mi></mrow><annotation encoding="application/x-tex">inf</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 mathdefault">i</span><span class="mord mathdefault">n</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span></span></span></span>，费用为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>c</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">c_{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 mathdefault">c</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 mathdefault mtight">i</span><span class="mord mathdefault 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><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 mathdefault">i</span></span></span></span>运送了货物到商店<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>.</p><p>最后跑费用流就好了。</p><h1 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h1><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">105</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxm=<span class="number">1000005</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> inf=<span class="number">0x7f7f7f7f</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> linf=<span class="number">1e18</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> to,next,flow;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> cost;</span><br><span class="line">&#125; edge[maxm&lt;&lt;<span class="number">1</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">bool</span> vis[maxn&lt;&lt;<span class="number">2</span>];</span><br><span class="line"><span class="keyword">int</span> head[maxn&lt;&lt;<span class="number">2</span>],k,s,t;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> dist[maxn&lt;&lt;<span class="number">2</span>],tot_cost;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> u,<span class="keyword">int</span> v,<span class="keyword">int</span> w,<span class="keyword">long</span> <span class="keyword">long</span> c)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">edge[++k].to=v;</span><br><span class="line">edge[k].next=head[u];</span><br><span class="line">head[u]=k;</span><br><span class="line">edge[k].flow=w;</span><br><span class="line">edge[k].cost=c;</span><br><span class="line">swap(u,v);</span><br><span class="line">edge[++k].to=v;</span><br><span class="line">edge[k].next=head[u];</span><br><span class="line">head[u]=k;</span><br><span class="line">edge[k].flow=<span class="number">0</span>;</span><br><span class="line">edge[k].cost=-c;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">spfa</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;=t;i++) dist[i]=linf;</span><br><span class="line"><span class="built_in">memset</span>(vis,<span class="literal">false</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"><span class="built_in">queue</span>&lt;<span class="keyword">int</span>&gt; q;dist[t]=<span class="number">0</span>;q.push(t);</span><br><span class="line"><span class="keyword">while</span>(!q.empty())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> x=q.front();q.pop();vis[x]=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=head[x];i;i=edge[i].next)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(dist[edge[i].to]&gt;dist[x]-edge[i].cost&amp;&amp;edge[i^<span class="number">1</span>].flow)</span><br><span class="line">&#123;</span><br><span class="line">dist[edge[i].to]=dist[x]-edge[i].cost;</span><br><span class="line"><span class="keyword">if</span>(!vis[edge[i].to])</span><br><span class="line">&#123;</span><br><span class="line">vis[edge[i].to]=<span class="literal">true</span>;</span><br><span class="line">q.push(edge[i].to);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> dist[s]!=linf;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> f)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">vis[x]=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">if</span>(x==t||!f) <span class="keyword">return</span> f;</span><br><span class="line"><span class="keyword">int</span> flow=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=head[x];i;i=edge[i].next)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(vis[edge[i].to]) <span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">if</span>(dist[edge[i].to]==dist[x]-edge[i].cost&amp;&amp;edge[i].flow)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> temp=dfs(edge[i].to,min(f-flow,edge[i].flow));</span><br><span class="line">edge[i].flow-=temp;</span><br><span class="line">edge[i^<span class="number">1</span>].flow+=temp;</span><br><span class="line">flow+=temp;</span><br><span class="line">tot_cost+=(<span class="keyword">long</span> <span class="keyword">long</span>)temp*edge[i].cost;</span><br><span class="line"><span class="keyword">if</span>(f==flow) <span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> flow;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">zkw</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">tot_cost=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(spfa())</span><br><span class="line">&#123;</span><br><span class="line">vis[t]=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">while</span>(vis[t])</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">memset</span>(vis,<span class="literal">false</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line">dfs(s,inf);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(tot_cost&gt;=<span class="number">0</span>) <span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,tot_cost);</span><br><span class="line"><span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,-tot_cost);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> n,m,a[maxn],b[maxn],cost[maxn][maxn];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"4015.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;m,&amp;n);s=<span class="number">0</span>;t=m+n+<span class="number">1</span>;k=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;b[i]);</span><br><span class="line"><span class="comment">//1-n store</span></span><br><span class="line"><span class="comment">//n+1-m repo</span></span><br><span class="line"><span class="comment">//0 source</span></span><br><span class="line"><span class="comment">//n+m+1</span></span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=n;j++)</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;cost[i][j]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) add(i,t,b[i],<span class="number">0</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++) add(s,i+n,a[i],<span class="number">0</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=n;j++)</span><br><span class="line">add(i+n,j,inf,cost[i][j]);</span><br><span class="line">zkw();</span><br><span class="line"><span class="built_in">memset</span>(head,<span class="number">0</span>,<span class="keyword">sizeof</span>(head));k=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) add(i,t,b[i],<span class="number">0</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++) add(s,i+n,a[i],<span class="number">0</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=n;j++)</span><br><span class="line">add(i+n,j,inf,-cost[i][j]);</span><br><span class="line">zkw();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Luogu" scheme="http://lemonaaaaa.com/categories/Code-life/Luogu/"/>
    
    
      <category term="网络流" scheme="http://lemonaaaaa.com/tags/%E7%BD%91%E7%BB%9C%E6%B5%81/"/>
    
      <category term="费用流" scheme="http://lemonaaaaa.com/tags/%E8%B4%B9%E7%94%A8%E6%B5%81/"/>
    
      <category term="图论" scheme="http://lemonaaaaa.com/tags/%E5%9B%BE%E8%AE%BA/"/>
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
  </entry>
  
  <entry>
    <title>洛谷 P2596 [ZJOI2006]书架 题解</title>
    <link href="http://lemonaaaaa.com/2020/08/luogu-2596/"/>
    <id>http://lemonaaaaa.com/2020/08/luogu-2596/</id>
    <published>2020-08-27T12:48:14.000Z</published>
    <updated>2020-08-27T12:48:14.752Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><blockquote><p><a href="https://www.luogu.com.cn/problem/P2596" target="_blank" rel="noopener">题目链接</a></p></blockquote><h1 id="题目原文"><a class="markdownIt-Anchor" href="#题目原文"></a> 题目原文</h1><p>小 T 有一个很大的书柜。这个书柜的构造有些独特，即书柜里的书是从上至下堆放成一列。她用 <span class="katex"><span class="katex-mathml"><math><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><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 mathdefault">n</span></span></span></span> 的正整数给每本书都编了号。</p><p>小 T 在看书的时候，每次取出一本书，看完后放回书柜然后再拿下一本。由于这些书太有吸引力了，所以她看完后常常会忘记原来是放在书柜的什么位置。不过小 T 的记忆力是非常好的，所以每次放书的时候至少能够将那本书放在拿出来时的位置附近，比如说她拿的时候这本书上面有 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">x</span></span></span></span> 本书，那么放回去时这本书上面就只可能有 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">x-1</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 mathdefault">x</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><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 mathdefault">x</span></span></span></span> 或 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">x+1</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 mathdefault">x</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>当然也有特殊情况，比如在看书的时候突然电话响了或者有朋友来访。这时候粗心的小 T 会随手把书放在书柜里所有书的最上面或者最下面，然后转身离开。</p><p>久而久之，小 T 的书柜里的书的顺序就会越来越乱，找到特定的编号的书就变得越来越困难。于是她想请你帮她编写一个图书管理程序，处理她看书时的一些操作，以及回答她的两个提问：</p><ul><li>编号为 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">x</span></span></span></span> 的书在书柜的什么位置。</li><li>从上到下第 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">i</span></span></span></span> 本书的编号是多少。</li></ul><h2 id="题解"><a class="markdownIt-Anchor" href="#题解"></a> 题解</h2><p>一道splay的模板题，拿来熟悉splay的模板和理解splay的结构是很不错的。</p><h3 id="top-操作"><a class="markdownIt-Anchor" href="#top-操作"></a> Top 操作</h3><p>首先将给的点旋转到根。</p><p>先判断其有没有左儿子，如果没有，那么这个点就已经是在top，不用进行任何操作。</p><p>再判断其有没有右儿子，如果没有，说明这个点在bottom，直接交换左右儿子即可。</p><p>如果既有左儿子又有右儿子，那么我们只需要将它的左儿子接到它的后继上，这样既满足了平衡树的规则，也满足了根节点没有左儿子，即该点是top的要求。</p><h3 id="bottom-操作"><a class="markdownIt-Anchor" href="#bottom-操作"></a> Bottom 操作</h3><p>与Top操作同理。</p><h3 id="insert-操作"><a class="markdownIt-Anchor" href="#insert-操作"></a> Insert 操作</h3><p>首先将给的点旋转到根。</p><p>如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>t</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">t=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.61508em;vertical-align:0em;"></span><span class="mord mathdefault">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></span></span>，那么就直接将根节点与后继交换。<br />如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>t</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">t=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.61508em;vertical-align:0em;"></span><span class="mord mathdefault">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">0</span></span></span></span>，相当于位置没有改变，直接忽略本次操作。<br />如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>t</mi><mo>=</mo><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">t=-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.61508em;vertical-align:0em;"></span><span class="mord mathdefault">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.72777em;vertical-align:-0.08333em;"></span><span class="mord">−</span><span class="mord">1</span></span></span></span>，那么就直接将根节点与前驱交换。</p><h3 id="ask-操作"><a class="markdownIt-Anchor" href="#ask-操作"></a> Ask 操作</h3><p>就是求比根节点小的数的个数。</p><p>将根节点旋转到根，答案就是根节点左儿子的size。</p><h3 id="query-操作"><a class="markdownIt-Anchor" href="#query-操作"></a> Query 操作</h3><p>就是找第k大。</p><h2 id="总结与反思"><a class="markdownIt-Anchor" href="#总结与反思"></a> 总结与反思</h2><p>在多次交换的时候一定要注意前后值是否发生改变，需不需要保留历史版本，太坑了。</p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*************************************************</span></span><br><span class="line"><span class="comment">*           Copyright: lemonaaaaa                *</span></span><br><span class="line"><span class="comment">*           Author: lemonaaaaa                   *</span></span><br><span class="line"><span class="comment">*           Date: 2020-08-24                     *</span></span><br><span class="line"><span class="comment">*           Description: luogu P2596 splay tree  *</span></span><br><span class="line"><span class="comment">**************************************************/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">splay_tree</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> ch[maxn][<span class="number">2</span>],fa[maxn],val[maxn],size[maxn],cnt[maxn],<span class="built_in">stack</span>[maxn];</span><br><span class="line"><span class="keyword">int</span> tot,root;</span><br><span class="line">splay_tree()</span><br><span class="line">&#123;</span><br><span class="line">tot=root=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">get</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">return</span> ch[fa[x]][<span class="number">1</span>]==x;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">update</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span>(!x) <span class="keyword">return</span>;</span><br><span class="line">size[x]=cnt[x];</span><br><span class="line"><span class="keyword">if</span>(ch[x][<span class="number">0</span>]) size[x]+=size[ch[x][<span class="number">0</span>]];</span><br><span class="line"><span class="keyword">if</span>(ch[x][<span class="number">1</span>]) size[x]+=size[ch[x][<span class="number">1</span>]]; </span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">clear</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">ch[x][<span class="number">0</span>]=ch[x][<span class="number">1</span>]=val[x]=fa[x]=size[x]=cnt[x]=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">rotate</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> old=fa[x],oldfa=fa[old],w=get(x);</span><br><span class="line">ch[old][w]=ch[x][w^<span class="number">1</span>];fa[ch[old][w]]=old;</span><br><span class="line">fa[old]=x;ch[x][w^<span class="number">1</span>]=old;fa[x]=oldfa;</span><br><span class="line"><span class="keyword">if</span>(oldfa) ch[oldfa][ch[oldfa][<span class="number">1</span>]==old]=x;</span><br><span class="line">update(old);update(x);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">splay</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> tar)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> father;(father=fa[x])!=tar;rotate(x))</span><br><span class="line"><span class="keyword">if</span>(fa[father]!=tar) rotate(get(x)==get(father)?father:x);</span><br><span class="line"><span class="keyword">if</span>(!tar) root=x;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">insert</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span>(!root)</span><br><span class="line">&#123;</span><br><span class="line">root=++tot;</span><br><span class="line">val[root]=x;</span><br><span class="line">cnt[root]=size[root]=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> now=root,father=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(<span class="literal">true</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(val[now]==x)</span><br><span class="line">&#123;</span><br><span class="line">cnt[now]++;</span><br><span class="line">update(now);</span><br><span class="line">update(father);</span><br><span class="line">splay(now,<span class="number">0</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">father=now;</span><br><span class="line">now=ch[now][x&gt;val[now]];</span><br><span class="line"><span class="keyword">if</span>(!now)</span><br><span class="line">&#123;</span><br><span class="line">now=++tot;</span><br><span class="line">cnt[now]=size[now]=<span class="number">1</span>;</span><br><span class="line">val[now]=x;</span><br><span class="line">fa[now]=father;</span><br><span class="line">ch[father][x&gt;val[father]]=now;</span><br><span class="line">update(now);update(father);</span><br><span class="line">splay(now,<span class="number">0</span>);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">find</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> ans=<span class="number">0</span>,now=root;</span><br><span class="line"><span class="keyword">while</span>(<span class="literal">true</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(x&lt;val[now]) now=ch[now][<span class="number">0</span>];</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">ans+=size[ch[now][<span class="number">0</span>]];</span><br><span class="line"><span class="keyword">if</span>(val[now]==x)</span><br><span class="line">&#123;</span><br><span class="line">splay(now,<span class="number">0</span>);</span><br><span class="line"><span class="keyword">return</span> ans+<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">ans+=cnt[now];</span><br><span class="line">now=ch[now][<span class="number">1</span>];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">findkth</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> now=root;</span><br><span class="line"><span class="keyword">while</span>(<span class="literal">true</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(ch[now][<span class="number">0</span>]&amp;&amp;x&lt;=size[ch[now][<span class="number">0</span>]]) now=ch[now][<span class="number">0</span>];</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> temp=size[ch[now][<span class="number">0</span>]]+cnt[now];</span><br><span class="line"><span class="keyword">if</span>(x&lt;=temp) <span class="keyword">return</span> val[now];</span><br><span class="line">x-=temp;now=ch[now][<span class="number">1</span>];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">pre</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> now=ch[root][<span class="number">0</span>];</span><br><span class="line"><span class="keyword">while</span>(ch[now][<span class="number">1</span>]) now=ch[now][<span class="number">1</span>];</span><br><span class="line"><span class="keyword">return</span> now;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">next</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> now=ch[root][<span class="number">1</span>];</span><br><span class="line"><span class="keyword">while</span>(ch[now][<span class="number">0</span>]) now=ch[now][<span class="number">0</span>];</span><br><span class="line"><span class="keyword">return</span> now;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">del</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">find(x);</span><br><span class="line"><span class="keyword">if</span>(cnt[root]&gt;<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">cnt[root]--;</span><br><span class="line">update(root);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!ch[root][<span class="number">0</span>]&amp;&amp;!ch[root][<span class="number">1</span>])</span><br><span class="line">&#123;</span><br><span class="line">clear(root);</span><br><span class="line">root=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!ch[root][<span class="number">0</span>])</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> oldroot=root;</span><br><span class="line">root=ch[root][<span class="number">1</span>];</span><br><span class="line">fa[root]=<span class="number">0</span>;</span><br><span class="line">clear(oldroot);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!ch[root][<span class="number">1</span>])</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> oldroot=root;</span><br><span class="line">root=ch[root][<span class="number">0</span>];</span><br><span class="line">fa[root]=<span class="number">0</span>;</span><br><span class="line">clear(oldroot);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> leftbig=pre(),oldroot=root;</span><br><span class="line">splay(leftbig,<span class="number">0</span>);</span><br><span class="line">ch[root][<span class="number">1</span>]=ch[oldroot][<span class="number">1</span>];</span><br><span class="line">fa[ch[root][<span class="number">1</span>]]=root;</span><br><span class="line">clear(oldroot);</span><br><span class="line">update(root);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">print</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">if</span>(ch[x][<span class="number">0</span>]) print(ch[x][<span class="number">0</span>]);</span><br><span class="line"><span class="built_in">stack</span>[++<span class="built_in">stack</span>[<span class="number">0</span>]]=val[x];</span><br><span class="line"><span class="keyword">if</span>(ch[x][<span class="number">1</span>]) print(ch[x][<span class="number">1</span>]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">int</span> n,m,p[maxn],pos[maxn];</span><br><span class="line">splay_tree tree;</span><br><span class="line"><span class="keyword">char</span> opt[<span class="number">10</span>];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line"><span class="comment">//freopen("P2596_1.in","r",stdin);</span></span><br><span class="line">freopen(<span class="string">"2596.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;n,&amp;m);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;p[i]);</span><br><span class="line">pos[p[i]]=i;</span><br><span class="line">tree.insert(i);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//for(int i=1;i&lt;=n;i++) printf("##%d %d\n",i,tree.val[i]);</span></span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,x,y;i&lt;=m;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//printf("$%d\n",i);</span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s%d"</span>,opt,&amp;x);</span><br><span class="line"><span class="keyword">if</span>(opt[<span class="number">0</span>]==<span class="string">'T'</span>)</span><br><span class="line">&#123;</span><br><span class="line">tree.splay(pos[x],<span class="number">0</span>);</span><br><span class="line"><span class="comment">//tree.find(pos[x]);</span></span><br><span class="line"><span class="comment">//if(tree.root==pos[x]) printf("Yes\n");</span></span><br><span class="line"><span class="keyword">if</span>(!tree.ch[tree.root][<span class="number">0</span>]) <span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(!tree.ch[tree.root][<span class="number">1</span>])</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//printf("$$");</span></span><br><span class="line">tree.ch[tree.root][<span class="number">1</span>]=tree.ch[tree.root][<span class="number">0</span>];</span><br><span class="line">tree.ch[tree.root][<span class="number">0</span>]=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> nxt=tree.next();</span><br><span class="line">tree.ch[nxt][<span class="number">0</span>]=tree.ch[tree.root][<span class="number">0</span>];</span><br><span class="line">tree.fa[tree.ch[nxt][<span class="number">0</span>]]=nxt;</span><br><span class="line">tree.ch[tree.root][<span class="number">0</span>]=<span class="number">0</span>;</span><br><span class="line">tree.splay(nxt,<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(opt[<span class="number">0</span>]==<span class="string">'B'</span>)</span><br><span class="line">&#123;</span><br><span class="line">tree.splay(pos[x],<span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span>(!tree.ch[tree.root][<span class="number">1</span>]) <span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(!tree.ch[tree.root][<span class="number">0</span>])</span><br><span class="line">&#123;</span><br><span class="line">tree.ch[tree.root][<span class="number">0</span>]=tree.ch[tree.root][<span class="number">1</span>];</span><br><span class="line">tree.ch[tree.root][<span class="number">1</span>]=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> pre=tree.pre();</span><br><span class="line">tree.ch[pre][<span class="number">1</span>]=tree.ch[tree.root][<span class="number">1</span>];</span><br><span class="line">tree.fa[tree.ch[pre][<span class="number">1</span>]]=pre;</span><br><span class="line">tree.ch[tree.root][<span class="number">1</span>]=<span class="number">0</span>;</span><br><span class="line">tree.splay(pre,<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(opt[<span class="number">0</span>]==<span class="string">'I'</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;y);</span><br><span class="line"><span class="keyword">if</span>(!y) <span class="keyword">continue</span>;</span><br><span class="line">tree.splay(pos[x],<span class="number">0</span>);</span><br><span class="line"><span class="keyword">if</span>(y==<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> nxt=tree.next();</span><br><span class="line"><span class="keyword">if</span>(nxt==tree.root) <span class="keyword">continue</span>;</span><br><span class="line"><span class="comment">//swap(pos[p[nxt]],pos[x]);</span></span><br><span class="line"><span class="keyword">int</span> pp=pos[x];</span><br><span class="line">pos[p[nxt]]=pos[x];pos[x]=nxt;</span><br><span class="line">swap(p[pp],p[nxt]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> pre=tree.pre();</span><br><span class="line"><span class="keyword">if</span>(pre==tree.root) <span class="keyword">continue</span>;</span><br><span class="line"><span class="comment">//swap(pos[p[pre]],pos[x]);</span></span><br><span class="line"><span class="keyword">int</span> pp=pos[x];</span><br><span class="line">pos[p[pre]]=pos[x];pos[x]=pre;</span><br><span class="line">swap(p[pp],p[pre]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(opt[<span class="number">0</span>]==<span class="string">'A'</span>)</span><br><span class="line">&#123;</span><br><span class="line">tree.splay(pos[x],<span class="number">0</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>,tree.size[tree.ch[tree.root][<span class="number">0</span>]]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>,p[tree.findkth(x)]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//tree.stack[0]=0;</span></span><br><span class="line"><span class="comment">//tree.print(tree.root);</span></span><br><span class="line"><span class="comment">//for(int j=1;j&lt;=tree.stack[0];j++) printf("%d ",p[tree.stack[j]]);</span></span><br><span class="line"><span class="comment">//printf("\n");</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Luogu" scheme="http://lemonaaaaa.com/categories/Code-life/Luogu/"/>
    
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
      <category term="splay" scheme="http://lemonaaaaa.com/tags/splay/"/>
    
      <category term="平衡树" scheme="http://lemonaaaaa.com/tags/%E5%B9%B3%E8%A1%A1%E6%A0%91/"/>
    
  </entry>
  
  <entry>
    <title>计算机系统基础 Bomb Lab 实验</title>
    <link href="http://lemonaaaaa.com/2020/08/bomb-lab/"/>
    <id>http://lemonaaaaa.com/2020/08/bomb-lab/</id>
    <published>2020-08-26T05:33:06.000Z</published>
    <updated>2020-08-26T05:33:06.977Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="phase_6"><a class="markdownIt-Anchor" href="#phase_6"></a> phase_6</h1><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br></pre></td><td class="code"><pre><span class="line">;phase_6开始</span><br><span class="line">0x00000000004010f4 &lt;+0&gt;:     push   %r14</span><br><span class="line">0x00000000004010f6 &lt;+2&gt;:     push   %r13</span><br><span class="line">0x00000000004010f8 &lt;+4&gt;:     push   %r12</span><br><span class="line">0x00000000004010fa &lt;+6&gt;:     push   %rbp</span><br><span class="line">0x00000000004010fb &lt;+7&gt;:     push   %rbx</span><br><span class="line">0x00000000004010fc &lt;+8&gt;:     sub    $0x50,%rsp ;分配50个字节的空间</span><br><span class="line"></span><br><span class="line">0x0000000000401100 &lt;+12&gt;:    mov    %rsp,%r13</span><br><span class="line">0x0000000000401103 &lt;+15&gt;:    mov    %rsp,%rsi</span><br><span class="line">0x0000000000401106 &lt;+18&gt;:    callq  0x40145c &lt;read_six_numbers&gt; ;读入6个数,读入的6个数从%rsp开始存，依次存在%rsp, %rsp+4, ..., %rsp+20</span><br><span class="line"></span><br><span class="line">0x000000000040110b &lt;+23&gt;:    mov    %rsp,%r14 ;将rsp的地址传递给r14</span><br><span class="line">0x000000000040110e &lt;+26&gt;:    mov    $0x0,%r12d ;将r12低32位赋值为0</span><br><span class="line"></span><br><span class="line">;loop1 begin (for r12d: 0-5) ;第一层循环</span><br><span class="line">0x0000000000401114 &lt;+32&gt;:    mov    %r13,%rbp</span><br><span class="line">0x0000000000401117 &lt;+35&gt;:    mov    0x0(%r13),%eax ;将r13的值+0送到eax</span><br><span class="line">0x000000000040111b &lt;+39&gt;:    sub    $0x1,%eax ;eax-&#x3D;1</span><br><span class="line">0x000000000040111e &lt;+42&gt;:    cmp    $0x5,%eax</span><br><span class="line">0x0000000000401121 &lt;+45&gt;:    jbe    0x401128 &lt;phase_6+52&gt; ;上面两行相当于eax-1&lt;&#x3D;5，即eax&lt;&#x3D;6时跳转到+52，否则explode_bomb</span><br><span class="line"></span><br><span class="line">0x0000000000401123 &lt;+47&gt;:    callq  0x40143a &lt;explode_bomb&gt; ;mission failed</span><br><span class="line"></span><br><span class="line">0x0000000000401128 &lt;+52&gt;:    add    $0x1,%r12d ;r12d++</span><br><span class="line">0x000000000040112c &lt;+56&gt;:    cmp    $0x6,%r12d</span><br><span class="line">0x0000000000401130 &lt;+60&gt;:    je     0x401153 &lt;phase_6+95&gt; ;如果r12d&#x3D;&#x3D;6，说明已经比较完了，那么跳转到+95(跳出循环)</span><br><span class="line"></span><br><span class="line">0x0000000000401132 &lt;+62&gt;:    mov    %r12d,%ebx ;将r12低32位送到ebx</span><br><span class="line"></span><br><span class="line">  ;loop2_in_1 begin (for ebx: r12d-5) ;开始第二层循环</span><br><span class="line">0x0000000000401135 &lt;+65&gt;:    movslq %ebx,%rax</span><br><span class="line">0x0000000000401138 &lt;+68&gt;:    mov    (%rsp,%rax,4),%eax</span><br><span class="line">0x000000000040113b &lt;+71&gt;:    cmp    %eax,0x0(%rbp) ;比较第一层循环枚举到的数(0x0(%rbp))和当前枚举到的数是否相等</span><br><span class="line">0x000000000040113e &lt;+74&gt;:    jne    0x401145 &lt;phase_6+81&gt; ;不相等则跳转到+81继续执行，相等则explode_bomb</span><br><span class="line"></span><br><span class="line">0x0000000000401140 &lt;+76&gt;:    callq  0x40143a &lt;explode_bomb&gt; ;mission failed</span><br><span class="line"></span><br><span class="line">0x0000000000401145 &lt;+81&gt;:    add    $0x1,%ebx ;ebx++</span><br><span class="line">0x0000000000401148 &lt;+84&gt;:    cmp    $0x5,%ebx ;</span><br><span class="line">0x000000000040114b &lt;+87&gt;:    jle    0x401135 &lt;phase_6+65&gt; ;上面两行相当于如果ebx+1&lt;&#x3D;5，则跳转到+65(第二层循环起点)</span><br><span class="line">  ;loop2_in_1 end.</span><br><span class="line"></span><br><span class="line">0x000000000040114d &lt;+89&gt;:    add    $0x4,%r13</span><br><span class="line">0x0000000000401151 &lt;+93&gt;:    jmp    0x401114 &lt;phase_6+32&gt; ;进入下一次循环</span><br><span class="line">;loop1 end. ;根据以上可以得出这两层循环是在判断输入的6个数都是小于等于6的，并且互不相等，否则便会引爆炸弹。</span><br><span class="line"></span><br><span class="line">0x0000000000401153 &lt;+95&gt;:    lea    0x18(%rsp),%rsi ;将地址传给rsi，由+118可知这是循环结束的条件(0x18(%rsp)为*(rsp+24)，注意区分十进制和十六进制)</span><br><span class="line">0x0000000000401158 &lt;+100&gt;:   mov    %r14,%rax ;将r14的地址传给rax，由前面我们知道r14的地址存的是rsp的地址，即为那6个数的首地址</span><br><span class="line">0x000000000040115b &lt;+103&gt;:   mov    $0x7,%ecx ;将ecx赋值为7</span><br><span class="line"></span><br><span class="line">;loop3 begin(for six values in rsp)</span><br><span class="line">0x0000000000401160 &lt;+108&gt;:   mov    %ecx,%edx ;将ecx的值送到edx中(值为7)</span><br><span class="line">0x0000000000401162 &lt;+110&gt;:   sub    (%rax),%edx ;把edx-*rax的值送到edx中，即edx-&#x3D;*rax</span><br><span class="line"></span><br><span class="line">0x0000000000401164 &lt;+112&gt;:   mov    %edx,(%rax) ;把edx的值送到*rax中，结合上两句，一次循环的操作*rax&#x3D;7-*rax</span><br><span class="line">0x0000000000401166 &lt;+114&gt;:   add    $0x4,%rax ;rax+4，即访问下一个地址</span><br><span class="line">0x000000000040116a &lt;+118&gt;:   cmp    %rsi,%rax ;判断是否循环到结束条件</span><br><span class="line">0x000000000040116d &lt;+121&gt;:   jne    0x401160 &lt;phase_6+108&gt; ;如果没有继续循环loop3</span><br><span class="line">;loop3 end. ;根据loop3可以得出将输入的6个数中每一个数x变成7-x</span><br><span class="line"></span><br><span class="line">0x000000000040116f &lt;+123&gt;:   mov    $0x0,%esi ;esi&#x3D;0</span><br><span class="line">0x0000000000401174 &lt;+128&gt;:   jmp    0x401197 &lt;phase_6+163&gt; ;直接跳转到+163</span><br><span class="line"></span><br><span class="line">;loop4 begin</span><br><span class="line"></span><br><span class="line">  ;loop5 begin ;嵌套在loop4里面</span><br><span class="line">0x0000000000401176 &lt;+130&gt;:   mov    0x8(%rdx),%rdx ;访问下一个地址(链表的下一个元素)</span><br><span class="line"></span><br><span class="line">0x000000000040117a &lt;+134&gt;:   add    $0x1,%eax ;eax+&#x3D;1</span><br><span class="line">0x000000000040117d &lt;+137&gt;:   cmp    %ecx,%eax ;比较ecx和eax</span><br><span class="line">0x000000000040117f &lt;+139&gt;:   jne    0x401176 &lt;phase_6+130&gt;</span><br><span class="line">  ;loop5 end.</span><br><span class="line"></span><br><span class="line">0x0000000000401181 &lt;+141&gt;:   jmp    0x401188 &lt;phase_6+148&gt; ;注意这里是直接跳转到+148，不执行+143</span><br><span class="line"></span><br><span class="line">0x0000000000401183 &lt;+143&gt;:   mov    $0x6032d0,%edx</span><br><span class="line">  ;使用&quot;p&#x2F;s *0x6032d0 @24&quot;查看</span><br><span class="line">  ;*0x6032d0: &#123;332, 1, 6304480, 0, 168, 2, 6304496, 0, 924, 3, 6304512, 0, 691, 4, 6304528, 0, 477, 5, 6304544, 0, 443, 6, 0, 0&#125;</span><br><span class="line">  ;可以得到这个链表一共有6个元素，每个元素有4个字节，第三个字节为下一个元素的地址，第四个字节为0，前两个暂不清楚</span><br><span class="line"></span><br><span class="line">0x0000000000401188 &lt;+148&gt;:   mov    %rdx,0x20(%rsp,%rsi,2)</span><br><span class="line"></span><br><span class="line">0x000000000040118d &lt;+153&gt;:   add    $0x4,%rsi ;访问下一个地址</span><br><span class="line">0x0000000000401191 &lt;+157&gt;:   cmp    $0x18,%rsi ;如果到最后一个地址则结束(rsi&#x3D;&#x3D;24，注意区分十进制和十六进制)</span><br><span class="line">0x0000000000401195 &lt;+161&gt;:   je     0x4011ab &lt;phase_6+183&gt; ;如果相等就结束循环</span><br><span class="line"></span><br><span class="line">0x0000000000401197 &lt;+163&gt;:   mov    (%rsp,%rsi,1),%ecx ;不满足循环结束条件&#x2F;从+128跳转过来,作为第一次循环的入口</span><br><span class="line">0x000000000040119a &lt;+166&gt;:   cmp    $0x1,%ecx</span><br><span class="line">0x000000000040119d &lt;+169&gt;:   jle    0x401183 &lt;phase_6+143&gt; ;ecx&lt;&#x3D;1则跳转到+143</span><br><span class="line"></span><br><span class="line">0x000000000040119f &lt;+171&gt;:   mov    $0x1,%eax ;赋初值eax&#x3D;1</span><br><span class="line">0x00000000004011a4 &lt;+176&gt;:   mov    $0x6032d0,%edx ;传入链表的首地址到edx</span><br><span class="line">0x00000000004011a9 &lt;+181&gt;:   jmp    0x401176 &lt;phase_6+130&gt; ;开始循环</span><br><span class="line">;loop4 end.</span><br><span class="line"></span><br><span class="line">0x00000000004011ab &lt;+183&gt;:   mov    0x20(%rsp),%rbx ;rbx&#x3D;*(rsp+32)，则rbx存的为排序关键数</span><br><span class="line">0x00000000004011b0 &lt;+188&gt;:   lea    0x28(%rsp),%rax ;将*(rsp+40)的地址送到rax</span><br><span class="line">0x00000000004011b5 &lt;+193&gt;:   lea    0x50(%rsp),%rsi ;将*(rps+80)的地址送到rsi</span><br><span class="line">0x00000000004011ba &lt;+198&gt;:   mov    %rbx,%rcx ;将rbx送到rcx，即rcx&#x3D;rbx&#x3D;*(rsp+32)</span><br><span class="line"></span><br><span class="line">;loop begin for(rax 40-80)</span><br><span class="line">0x00000000004011bd &lt;+201&gt;:   mov    (%rax),%rdx ;rdx&#x3D;*rax</span><br><span class="line">0x00000000004011c0 &lt;+204&gt;:   mov    %rdx,0x8(%rcx) ;*(rcx+8)&#x3D;rdx</span><br><span class="line">0x00000000004011c4 &lt;+208&gt;:   add    $0x8,%rax ;rax+&#x3D;8</span><br><span class="line"></span><br><span class="line">0x00000000004011c8 &lt;+212&gt;:   cmp    %rsi,%rax ;比较rsi和rax</span><br><span class="line">0x00000000004011cb &lt;+215&gt;:   je     0x4011d2 &lt;phase_6+222&gt; ;当rax&#x3D;&#x3D;rsi时跳转到+222，即结束循环</span><br><span class="line"></span><br><span class="line">0x00000000004011cd &lt;+217&gt;:   mov    %rdx,%rcx ;rcx&#x3D;rdx&#x3D;*(rcx+8)</span><br><span class="line">0x00000000004011d0 &lt;+220&gt;:   jmp    0x4011bd &lt;phase_6+201&gt; ;继续循环</span><br><span class="line">;loop end.</span><br><span class="line"></span><br><span class="line">0x00000000004011d2 &lt;+222&gt;:   movq   $0x0,0x8(%rdx)</span><br><span class="line"></span><br><span class="line">0x00000000004011da &lt;+230&gt;:   mov    $0x5,%ebp ;赋值，数据寄存器ebp&#x3D;5</span><br><span class="line"></span><br><span class="line">;loop begin</span><br><span class="line">0x00000000004011df &lt;+235&gt;:   mov    0x8(%rbx),%rax ;rax&#x3D;*(rbx+8)</span><br><span class="line">0x00000000004011e3 &lt;+239&gt;:   mov    (%rax),%eax ;eax&#x3D;*rax&#x3D;*(rbx+8)</span><br><span class="line">0x00000000004011e5 &lt;+241&gt;:   cmp    %eax,(%rbx)</span><br><span class="line">0x00000000004011e7 &lt;+243&gt;:   jge    0x4011ee &lt;phase_6+250&gt; ;如果*rbx&gt;eax&#x3D;*(rbx+8)，即前一个数必须大于后一个数，则跳转到+250，否则explode_bomb</span><br><span class="line"></span><br><span class="line">0x00000000004011e9 &lt;+245&gt;:   callq  0x40143a &lt;explode_bomb&gt;</span><br><span class="line"></span><br><span class="line">0x00000000004011ee &lt;+250&gt;:   mov    0x8(%rbx),%rbx ;将*(rbx+8)送到rbx，为下一次循环做准备(准备比较下一个数和下下个数)</span><br><span class="line">0x00000000004011f2 &lt;+254&gt;:   sub    $0x1,%ebp ;ebp-&#x3D;1</span><br><span class="line">0x00000000004011f5 &lt;+257&gt;:   jne    0x4011df &lt;phase_6+235&gt; ;ebp不为0则继续循环</span><br><span class="line">;loop end. ;这个循环判断整个序列是否按大小降序排列，如果不是则执行explode_bomb</span><br><span class="line"></span><br><span class="line">;phase_6结束</span><br><span class="line">0x00000000004011f7 &lt;+259&gt;:   add    $0x50,%rsp</span><br><span class="line">0x00000000004011fb &lt;+263&gt;:   pop    %rbx</span><br><span class="line">0x00000000004011fc &lt;+264&gt;:   pop    %rbp</span><br><span class="line">0x00000000004011fd &lt;+265&gt;:   pop    %r12</span><br><span class="line">0x00000000004011ff &lt;+267&gt;:   pop    %r13</span><br><span class="line">0x0000000000401201 &lt;+269&gt;:   pop    %r14</span><br><span class="line">0x0000000000401203 &lt;+271&gt;:   retq</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="System" scheme="http://lemonaaaaa.com/categories/Code-life/System/"/>
    
    
      <category term="实验" scheme="http://lemonaaaaa.com/tags/%E5%AE%9E%E9%AA%8C/"/>
    
      <category term="系统" scheme="http://lemonaaaaa.com/tags/%E7%B3%BB%E7%BB%9F/"/>
    
      <category term="汇编" scheme="http://lemonaaaaa.com/tags/%E6%B1%87%E7%BC%96/"/>
    
  </entry>
  
  <entry>
    <title>Educational Codeforces Round 94 (Rated for Div. 2) 题解</title>
    <link href="http://lemonaaaaa.com/2020/08/educational-codeforces-round-94-div2/"/>
    <id>http://lemonaaaaa.com/2020/08/educational-codeforces-round-94-div2/</id>
    <published>2020-08-26T05:31:59.000Z</published>
    <updated>2020-08-26T05:31:59.043Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="a-string-similarity"><a class="markdownIt-Anchor" href="#a-string-similarity"></a> A. String Similarity</h1><blockquote><p><a href="https://codeforces.com/contest/1400/problem/A" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文"><a class="markdownIt-Anchor" href="#题目原文"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1400A.jpg" alt="1400A" /></p><h2 id="题目大意"><a class="markdownIt-Anchor" href="#题目大意"></a> 题目大意</h2><p>定义两个字符串相似：两个字符串中至少有一个位置的值相同。</p><p>现在给出一个长度为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mi>n</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2n-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">2</span><span class="mord mathdefault">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><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.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span>，现在让你构造一个长度为<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>的字符串，使得这个字符串与<span class="katex"><span class="katex-mathml"><math><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.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span>的所有长度为<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>的子串都相似。</p><h2 id="解题思路"><a class="markdownIt-Anchor" href="#解题思路"></a> 解题思路</h2><p>可以发现，<span class="katex"><span class="katex-mathml"><math><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.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span>的所有长度为<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>的子串都有一个公共位置<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo stretchy="false">[</mo><mi>n</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s[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 mathdefault">s</span><span class="mopen">[</span><span class="mord mathdefault">n</span><span class="mclose">]</span></span></span></span></p><h2 id="解法"><a class="markdownIt-Anchor" href="#解法"></a> 解法</h2><p>直接输出<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>个<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo stretchy="false">[</mo><mi>n</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s[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 mathdefault">s</span><span class="mopen">[</span><span class="mord mathdefault">n</span><span class="mclose">]</span></span></span></span>就行，这个答案一定与所有子串都相似。</p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*************************************************</span></span><br><span class="line"><span class="comment">*           Copyright: lemonaaaaa                *</span></span><br><span class="line"><span class="comment">*           Author: lemonaaaaa                   *</span></span><br><span class="line"><span class="comment">*           Date: 2020-8-25                      *</span></span><br><span class="line"><span class="comment">*           Description: Edu Codeforces Round 94 *</span></span><br><span class="line"><span class="comment">**************************************************/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n;</span><br><span class="line"><span class="keyword">char</span> str[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"A.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>,str+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">printf</span>(<span class="string">"%c"</span>,str[n]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="b-rpg-protagonist"><a class="markdownIt-Anchor" href="#b-rpg-protagonist"></a> B. RPG Protagonist</h1><blockquote><p><a href="https://codeforces.com/contest/1400/problem/B" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-2"><a class="markdownIt-Anchor" href="#题目原文-2"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1400B.jpg" alt="1400B" /></p><h2 id="题目大意-2"><a class="markdownIt-Anchor" href="#题目大意-2"></a> 题目大意</h2><p>现在有两个人，一个人可以带<span class="katex"><span class="katex-mathml"><math><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 mathdefault">p</span></span></span></span>单位的重量，另一个人可以带<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>f</mi></mrow><annotation encoding="application/x-tex">f</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 mathdefault" style="margin-right:0.10764em;">f</span></span></span></span>单位的重量。现在有两种物品，给出两种物品单件的重量以及两种物品的数量，求这两个人最多一共带走多少物品（数量最多）。</p><h2 id="解题思路-2"><a class="markdownIt-Anchor" href="#解题思路-2"></a> 解题思路</h2><p>可以发现，我们一定是采取贪心的策略。</p><p>我们先考虑一个人，那一定是先尽可能地选重量小的装，这样一定能够装更多数量。</p><p>那其实我们只需要求出第一个人选剩下的数量，第二个人能装的数量可以直接O(1)算出来。</p><h2 id="解法-2"><a class="markdownIt-Anchor" href="#解法-2"></a> 解法</h2><p>直接枚举第一个人选了多少个第一种物品，然后我们根据贪心策略，我们一定是让第一个人尽可能地装满，然后这个时候我们就得到了两种物品剩下的数量，这个时候就按照前面说的直接先选小的的策略进行选择即可。</p><h2 id="代码-2"><a class="markdownIt-Anchor" href="#代码-2"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*************************************************</span></span><br><span class="line"><span class="comment">*           Copyright: lemonaaaaa                *</span></span><br><span class="line"><span class="comment">*           Author: lemonaaaaa                   *</span></span><br><span class="line"><span class="comment">*           Date: 2020-8-25                      *</span></span><br><span class="line"><span class="comment">*           Description: Edu Codeforces Round 94 *</span></span><br><span class="line"><span class="comment">**************************************************/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> p,f,cnts,cntw,s,w,ans;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"B.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line">ans=<span class="number">0</span>;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld%lld"</span>,&amp;p,&amp;f);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld%lld"</span>,&amp;cnts,&amp;cntw);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld%lld"</span>,&amp;s,&amp;w);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">long</span> <span class="keyword">long</span> i=<span class="number">0</span>;i&lt;=cnts;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(i*s&gt;p) <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> resp=p-i*s;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t2=resp/w;</span><br><span class="line"><span class="keyword">if</span>(t2&gt;cntw) t2=cntw;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t1=i+t2;</span><br><span class="line"></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t3=cntw-t2;</span><br><span class="line"><span class="keyword">if</span>(s&lt;=w)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t4=f/s;</span><br><span class="line"><span class="keyword">if</span>(t4&gt;cnts-i) t4=cnts-i;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> temp=f-t4*s;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t6=temp/w;</span><br><span class="line"><span class="keyword">if</span>(t6&gt;t3) t6=t3;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t5=t4+t6;</span><br><span class="line">ans=max(ans,t1+t5);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t4=f/w;</span><br><span class="line"><span class="keyword">if</span>(t4&gt;t3) t4=t3;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> temp=f-t4*w;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t6=temp/s;</span><br><span class="line"><span class="keyword">if</span>(t6&gt;cnts-i) t6=cnts-i;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t5=t4+t6;</span><br><span class="line">ans=max(ans,t1+t5);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="c-binary-string-reconstruction"><a class="markdownIt-Anchor" href="#c-binary-string-reconstruction"></a> C. Binary String Reconstruction</h1><blockquote><p><a href="https://codeforces.com/contest/1400/problem/C" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-3"><a class="markdownIt-Anchor" href="#题目原文-3"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1400C.jpg" alt="1400C" /></p><h2 id="题目大意-3"><a class="markdownIt-Anchor" href="#题目大意-3"></a> 题目大意</h2><p>对于一个原串<span class="katex"><span class="katex-mathml"><math><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.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span>，现在通过以下规则构建串<span class="katex"><span class="katex-mathml"><math><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.61508em;vertical-align:0em;"></span><span class="mord mathdefault">t</span></span></span></span>。</p><p>对于一个位置<span class="katex"><span class="katex-mathml"><math><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 mathdefault">i</span></span></span></span>，如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo stretchy="false">[</mo><mi>i</mi><mo>−</mo><mi>x</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s[i-x]</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 mathdefault">s</span><span class="mopen">[</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mclose">]</span></span></span></span>存在并且<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo stretchy="false">[</mo><mi>i</mi><mo>−</mo><mi>x</mi><mo stretchy="false">]</mo><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">s[i-x]=1</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 mathdefault">s</span><span class="mopen">[</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mclose">]</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><semantics><mrow><mi>s</mi><mo stretchy="false">[</mo><mi>i</mi><mo>+</mo><mi>x</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">s[i+x]</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 mathdefault">s</span><span class="mopen">[</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mclose">]</span></span></span></span>存在并且<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>s</mi><mo stretchy="false">[</mo><mi>i</mi><mo>+</mo><mi>x</mi><mo stretchy="false">]</mo><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">s[i+x]=1</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 mathdefault">s</span><span class="mopen">[</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">x</span><span class="mclose">]</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><semantics><mrow><mi>t</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">t[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="mord mathdefault">t</span><span class="mopen">[</span><span class="mord mathdefault">i</span><span class="mclose">]</span></span></span></span>就为1，否则<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>t</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">t[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="mord mathdefault">t</span><span class="mopen">[</span><span class="mord mathdefault">i</span><span class="mclose">]</span></span></span></span>为0.</p><p>现在给出串<span class="katex"><span class="katex-mathml"><math><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.61508em;vertical-align:0em;"></span><span class="mord mathdefault">t</span></span></span></span>，让你还原原串<span class="katex"><span class="katex-mathml"><math><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.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span>.</p><h2 id="解题思路-3"><a class="markdownIt-Anchor" href="#解题思路-3"></a> 解题思路</h2><p>直接从前往后依次贪心还原即可，如果有冲突的就无解。注意<span class="katex"><span class="katex-mathml"><math><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><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.43056em;vertical-align:0em;"></span><span class="mord mathdefault">s</span></span></span></span>前后两个位置都为<span class="katex"><span class="katex-mathml"><math><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><h2 id="解法-3"><a class="markdownIt-Anchor" href="#解法-3"></a> 解法</h2><p>如上。</p><h2 id="代码-3"><a class="markdownIt-Anchor" href="#代码-3"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*************************************************</span></span><br><span class="line"><span class="comment">*           Copyright: lemonaaaaa                *</span></span><br><span class="line"><span class="comment">*           Author: lemonaaaaa                   *</span></span><br><span class="line"><span class="comment">*           Date: 2020-8-25                      *</span></span><br><span class="line"><span class="comment">*           Description: Edu Codeforces Round 94 *</span></span><br><span class="line"><span class="comment">**************************************************/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T,x;</span><br><span class="line"><span class="keyword">char</span> str[maxn];</span><br><span class="line"><span class="keyword">int</span> ans[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"C.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s%d"</span>,str+<span class="number">1</span>,&amp;x);</span><br><span class="line"><span class="keyword">int</span> n=<span class="built_in">strlen</span>(str+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">bool</span> flag=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) ans[i]=<span class="number">-1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(str[i]==<span class="string">'1'</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">bool</span> f=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">if</span>(i-x&gt;=<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(ans[i-x]==<span class="number">1</span>) f=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(ans[i-x]==<span class="number">-1</span>) ans[i-x]=<span class="number">1</span>,f=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!f&amp;&amp;i+x&lt;=n)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(ans[i+x]==<span class="number">1</span>) f=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(ans[i+x]==<span class="number">-1</span>) ans[i+x]=<span class="number">1</span>,f=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!f) flag=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">bool</span> f=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">if</span>(i-x&gt;=<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(ans[i-x]==<span class="number">-1</span>) ans[i-x]=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>(ans[i-x]==<span class="number">1</span>) f=<span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(i+x&lt;=n)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(ans[i+x]==<span class="number">-1</span>) ans[i+x]=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>(ans[i+x]==<span class="number">1</span>) f=<span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!f) flag=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="keyword">if</span>(ans[i]==<span class="number">-1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> f=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span>(i-x&gt;=<span class="number">1</span>&amp;&amp;str[i-x]==<span class="string">'0'</span>) f=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>(i+x&lt;=n&amp;&amp;str[i+x]==<span class="string">'0'</span>) f=<span class="number">0</span>;</span><br><span class="line">ans[i]=f;</span><br><span class="line"><span class="keyword">if</span>(f==<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(i-x&gt;=<span class="number">1</span>&amp;&amp;str[i-x]==<span class="string">'1'</span>) flag=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">if</span>(i+x&lt;=n&amp;&amp;str[i+x]==<span class="string">'1'</span>) flag=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(f==<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(i-x&gt;=<span class="number">1</span>&amp;&amp;str[i-x]==<span class="string">'0'</span>) flag=<span class="literal">true</span>;;</span><br><span class="line"><span class="keyword">if</span>(i+x&lt;=n&amp;&amp;str[i+x]==<span class="string">'0'</span>) flag=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(flag) &#123;<span class="built_in">printf</span>(<span class="string">"-1\n"</span>);<span class="keyword">continue</span>;&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">printf</span>(<span class="string">"%d"</span>,ans[i]);<span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="d-zigzags"><a class="markdownIt-Anchor" href="#d-zigzags"></a> D. Zigzags</h1><blockquote><p><a href="https://codeforces.com/contest/1400/problem/D" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-4"><a class="markdownIt-Anchor" href="#题目原文-4"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1400D.jpg" alt="1400D" /></p><h2 id="题目大意-4"><a class="markdownIt-Anchor" href="#题目大意-4"></a> 题目大意</h2><p>给出一个数组，求满足以下条件的四元组<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><mi>i</mi><mo separator="true">,</mo><mi>j</mi><mo separator="true">,</mo><mi>k</mi><mo separator="true">,</mo><mi>l</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(i,j,k,l)</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 mathdefault">i</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mclose">)</span></span></span></span>的个数。</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mo>⩽</mo><mi>i</mi><mo>&lt;</mo><mi>j</mi><mo>&lt;</mo><mi>k</mi><mo>&lt;</mo><mi>l</mi><mo>⩽</mo><mi>n</mi><mspace linebreak="newline"></mspace><msub><mi>a</mi><mi>i</mi></msub><mo>=</mo><msub><mi>a</mi><mi>k</mi></msub><mtext>  </mtext><mtext>and</mtext><mtext>  </mtext><msub><mi>a</mi><mi>j</mi></msub><mo>=</mo><msub><mi>a</mi><mi>l</mi></msub></mrow><annotation encoding="application/x-tex">1 \leqslant i &lt; j &lt; k &lt; l \leqslant n \\ a_i = a_k \; \text{and} \; a_j=a_l </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.78111em;vertical-align:-0.13667em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel amsrm">⩽</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69862em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.73354em;vertical-align:-0.0391em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.83111em;vertical-align:-0.13667em;"></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel amsrm">⩽</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 mathdefault">n</span></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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.980548em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><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 mathdefault mtight" style="margin-right:0.03148em;">k</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="mord text"><span class="mord">and</span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault mtight" style="margin-right:0.05724em;">j</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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><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 mathdefault mtight" style="margin-right:0.01968em;">l</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></p><h2 id="解题思路-4"><a class="markdownIt-Anchor" href="#解题思路-4"></a> 解题思路</h2><p>先前缀和求出各数字出现的次数，再枚举<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>的位置，这时两个数字都是确定的，然后直接<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(1)</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 mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span>算出<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>前<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo stretchy="false">[</mo><mi>k</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">a[k]</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 mathdefault">a</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mclose">]</span></span></span></span>的数量与<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>后<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">a[j]</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 mathdefault">a</span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mclose">]</span></span></span></span>的数量，相乘累加答案即可。</p><h2 id="解法-4"><a class="markdownIt-Anchor" href="#解法-4"></a> 解法</h2><p>如上。</p><h2 id="代码-4"><a class="markdownIt-Anchor" href="#代码-4"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*************************************************</span></span><br><span class="line"><span class="comment">*           Copyright: lemonaaaaa                *</span></span><br><span class="line"><span class="comment">*           Author: lemonaaaaa                   *</span></span><br><span class="line"><span class="comment">*           Date: 2020-8-26                      *</span></span><br><span class="line"><span class="comment">*           Description: Edu Codeforces Round 94 *</span></span><br><span class="line"><span class="comment">**************************************************/</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">3005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n,a[maxn],cnt[maxn][maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"D.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=n;j++)</span><br><span class="line">&#123;</span><br><span class="line">cnt[i][j]=cnt[i<span class="number">-1</span>][j];</span><br><span class="line">&#125;</span><br><span class="line">cnt[i][a[i]]++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=i+<span class="number">1</span>;j&lt;=n;j++)</span><br><span class="line">&#123;</span><br><span class="line">ans+=(<span class="keyword">long</span> <span class="keyword">long</span>)cnt[i<span class="number">-1</span>][a[j]]*(<span class="keyword">long</span> <span class="keyword">long</span>)(cnt[n][a[i]]-cnt[j][a[i]]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/standings/edu-round-94.jpg" alt="edu-round-94" /></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Codeforces" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/"/>
    
      <category term="Round" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/Round/"/>
    
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
      <category term="contests" scheme="http://lemonaaaaa.com/tags/contests/"/>
    
      <category term="模拟" scheme="http://lemonaaaaa.com/tags/%E6%A8%A1%E6%8B%9F/"/>
    
      <category term="思维" scheme="http://lemonaaaaa.com/tags/%E6%80%9D%E7%BB%B4/"/>
    
      <category term="枚举" scheme="http://lemonaaaaa.com/tags/%E6%9E%9A%E4%B8%BE/"/>
    
  </entry>
  
  <entry>
    <title>Codeforces Round 665 (Div. 2) 题解</title>
    <link href="http://lemonaaaaa.com/2020/08/codeforces-round-665-div2/"/>
    <id>http://lemonaaaaa.com/2020/08/codeforces-round-665-div2/</id>
    <published>2020-08-22T12:24:38.000Z</published>
    <updated>2020-08-22T12:24:38.871Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="a-distance-and-axis"><a class="markdownIt-Anchor" href="#a-distance-and-axis"></a> A. Distance and Axis</h1><blockquote><p><a href="https://codeforces.com/contest/1401/problem/A" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文"><a class="markdownIt-Anchor" href="#题目原文"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1401A.png" alt="1401A" /></p><h2 id="题目大意"><a class="markdownIt-Anchor" href="#题目大意"></a> 题目大意</h2><p>在<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mi>X</mi></mrow><annotation encoding="application/x-tex">OX</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 mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span>轴上，给出点<span class="katex"><span class="katex-mathml"><math><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 mathdefault">A</span></span></span></span>的坐标<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>=</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">x=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 mathdefault">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.43056em;vertical-align:0em;"></span><span class="mord mathdefault">n</span></span></span></span>，给出一个值<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>，求问能不能在<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mi>X</mi></mrow><annotation encoding="application/x-tex">OX</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 mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span>轴上找一个点<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span>，使得你<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∣</mi><mi>O</mi><mi>A</mi><mo>−</mo><mi>A</mi><mi>B</mi><mi mathvariant="normal">∣</mi><mo>=</mo><mi>k</mi></mrow><annotation encoding="application/x-tex">|OA-AB|=k</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">∣</span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault">A</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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord">∣</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.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>。如果不能找到，你每次可以将<span class="katex"><span class="katex-mathml"><math><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 mathdefault">A</span></span></span></span>点的坐标<span class="katex"><span class="katex-mathml"><math><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><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><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 mathdefault">A</span></span></span></span>多少次，使得可以找到点<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span> （如果以开始就能找到，那么输出 <span class="katex"><span class="katex-mathml"><math><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><h2 id="解题思路"><a class="markdownIt-Anchor" href="#解题思路"></a> 解题思路</h2><p>由题意得<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mi>A</mi><mo>=</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">OA=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 mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault">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.43056em;vertical-align:0em;"></span><span class="mord mathdefault">n</span></span></span></span>，设<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span>的坐标为<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>，那么<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∣</mi><mi>A</mi><mi>B</mi><mi mathvariant="normal">∣</mi><mo>=</mo><mi mathvariant="normal">∣</mi><mi>n</mi><mo>−</mo><mi>y</mi><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">|AB|=|n-y|</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">∣</span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord">∣</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">∣</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span></span></span></span>，那么<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi mathvariant="normal">∣</mi><mi>O</mi><mi>A</mi><mo>−</mo><mi>A</mi><mi>B</mi><mi mathvariant="normal">∣</mi><mo>=</mo><mi mathvariant="normal">∣</mi><mn>2</mn><mi>n</mi><mo>−</mo><mi>y</mi><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">|OA-AB|=|2n-y|</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">∣</span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault">A</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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">A</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mord">∣</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">∣</span><span class="mord">2</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mord">∣</span></span></span></span>，所以就是求是否存在<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>2</mn><mi>n</mi><mo>−</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">2n-y</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">2</span><span class="mord mathdefault">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.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>等于<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>。</p><h2 id="解法"><a class="markdownIt-Anchor" href="#解法"></a> 解法</h2><p>如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mo>&lt;</mo><mi>k</mi></mrow><annotation encoding="application/x-tex">n&lt;k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">n</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>，那么一定解出来<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>是负数，所以一定要将点<span class="katex"><span class="katex-mathml"><math><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 mathdefault">A</span></span></span></span>移动到<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>=</mo><mi>k</mi></mrow><annotation encoding="application/x-tex">x=k</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 mathdefault">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.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>处，答案为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mo>−</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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">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.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>。</p><p>如果<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mo>−</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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">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.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>为奇数，那么除以2之后为小数，所以应该<span class="katex"><span class="katex-mathml"><math><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><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><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>。</p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n,k,ans;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"A.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;n,&amp;k);</span><br><span class="line">ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>(n&lt;k) ans+=k-n,n=k;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>((n-k)&amp;<span class="number">1</span>) ans++;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>,ans);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="b-ternary-sequence"><a class="markdownIt-Anchor" href="#b-ternary-sequence"></a> B. Ternary Sequence</h1><blockquote><p><a href="https://codeforces.com/contest/1401/problem/B" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-2"><a class="markdownIt-Anchor" href="#题目原文-2"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1401B.png" alt="1401B" /></p><h2 id="题目大意-2"><a class="markdownIt-Anchor" href="#题目大意-2"></a> 题目大意</h2><p>有两个数组<span class="katex"><span class="katex-mathml"><math><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 mathdefault">a</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><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.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span>，这两个数组都只会有3个值：0或1或2。现在告诉你这两个数组中这三个值的数量。请你构造<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo separator="true">,</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">a,b</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 mathdefault">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">b</span></span></span></span>数组，并且由下面规则生成<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</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 mathdefault">c</span></span></span></span>数组，并且使得<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</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 mathdefault">c</span></span></span></span>数组每一项的和最大，求这个最大值。</p><p>规则：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>c</mi><mi>i</mi></msub><mo>=</mo><mrow><mo fence="true">{</mo><mtable rowspacing="0.3599999999999999em" columnalign="left left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mi>a</mi><mi>i</mi></msub><msub><mi>b</mi><mi>i</mi></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mtext>if </mtext><msub><mi>a</mi><mi>i</mi></msub><mo>&gt;</mo><msub><mi>b</mi><mi>i</mi></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>0</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mtext>if </mtext><msub><mi>a</mi><mi>i</mi></msub><mo>=</mo><msub><mi>b</mi><mi>i</mi></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mi>a</mi><mi>i</mi></msub><msub><mi>b</mi><mi>i</mi></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mtext>if </mtext><msub><mi>a</mi><mi>i</mi></msub><mo>&lt;</mo><msub><mi>b</mi><mi>i</mi></msub></mrow></mstyle></mtd></mtr></mtable></mrow></mrow><annotation encoding="application/x-tex"> c_i = \begin{cases} a_i b_i &amp;\text{if } a_i &gt; b_i \\   0 &amp;\text{if } a_i = b_i \\ -a_i b_i &amp;\text{if } a_i &lt; b_i\end{cases}</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 mathdefault">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:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault 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:4.32em;vertical-align:-1.9099999999999997em;"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.35002em;"><span style="top:-2.19999em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎩</span></span></span><span style="top:-2.19999em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎪</span></span></span><span style="top:-3.1500100000000004em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎨</span></span></span><span style="top:-4.30001em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎪</span></span></span><span style="top:-4.60002em;"><span class="pstrut" style="height:3.15em;"></span><span class="delimsizinginner delim-size4"><span>⎧</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.8500199999999998em;"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.41em;"><span style="top:-4.41em;"><span class="pstrut" style="height:3.008em;"></span><span class="mord"><span class="mord"><span class="mord mathdefault">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 mathdefault 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="mord"><span class="mord mathdefault">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 mathdefault 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 style="top:-2.97em;"><span class="pstrut" style="height:3.008em;"></span><span class="mord"><span class="mord">0</span></span></span><span style="top:-1.5300000000000002em;"><span class="pstrut" style="height:3.008em;"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord mathdefault">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 mathdefault 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="mord"><span class="mord mathdefault">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 mathdefault 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.9099999999999997em;"><span></span></span></span></span></span><span class="arraycolsep" style="width:1em;"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.41em;"><span style="top:-4.41em;"><span class="pstrut" style="height:3.008em;"></span><span class="mord"><span class="mord text"><span class="mord">if </span></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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 style="top:-2.97em;"><span class="pstrut" style="height:3.008em;"></span><span class="mord"><span class="mord text"><span class="mord">if </span></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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 class="mord"><span class="mord mathdefault">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 mathdefault 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 style="top:-1.5300000000000002em;"><span class="pstrut" style="height:3.008em;"></span><span class="mord"><span class="mord text"><span class="mord">if </span></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.9099999999999997em;"><span></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><h2 id="解题思路-2"><a class="markdownIt-Anchor" href="#解题思路-2"></a> 解题思路</h2><p>这种题看过去不是贪心就是dp。</p><h2 id="解法-2"><a class="markdownIt-Anchor" href="#解法-2"></a> 解法</h2><p>我们贪心地想，首先要使得<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mi>i</mi></msub><mo>=</mo><mn>2</mn><mo separator="true">,</mo><mtext>  </mtext><msub><mi>b</mi><mi>i</mi></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">a_i=2, \; b_i=1</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 mathdefault">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 mathdefault 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.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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.64444em;vertical-align:0em;"></span><span class="mord">1</span></span></span></span>的数量尽可能地多，然后尽可能地使得其他都为0，最后实在不行再使得值为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mi>i</mi></msub><mo>=</mo><mn>1</mn><mo separator="true">,</mo><mtext>  </mtext><msub><mi>b</mi><mi>i</mi></msub><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">a_i=1, \; b_i=2</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 mathdefault">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 mathdefault 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.8888799999999999em;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="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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.64444em;vertical-align:0em;"></span><span class="mord">2</span></span></span></span>。</p><h2 id="代码-2"><a class="markdownIt-Anchor" href="#代码-2"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> x1,yy1,z1,x2,y2,z2;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"B.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld%lld%lld%lld%lld%lld"</span>,&amp;x1,&amp;yy1,&amp;z1,&amp;x2,&amp;y2,&amp;z2);</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t1=min(z1,y2),ans=<span class="number">0</span>;</span><br><span class="line">z1-=t1;y2-=t1;</span><br><span class="line">ans+=<span class="number">2l</span>l*t1;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t2=min(z1,z2);</span><br><span class="line">z1-=t2;z2-=t2;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> t3=min(x1,z2);</span><br><span class="line">x1-=t3;z2-=t3;</span><br><span class="line">ans-=<span class="number">2l</span>l*z2;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="c-mere-array"><a class="markdownIt-Anchor" href="#c-mere-array"></a> C. Mere Array</h1><blockquote><p><a href="https://codeforces.com/contest/1401/problem/C" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-3"><a class="markdownIt-Anchor" href="#题目原文-3"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1401C.png" alt="1401C" /></p><h2 id="题目大意-3"><a class="markdownIt-Anchor" href="#题目大意-3"></a> 题目大意</h2><p>给出长度为<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>的数组，每个数都大于1。记数组中最小的数为minn，现在你可以将数组中任意两个<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>g</mi><mi>c</mi><mi>d</mi><mo>=</mo><mi>m</mi><mi>i</mi><mi>n</mi><mi>n</mi></mrow><annotation encoding="application/x-tex">gcd=minn</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 mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">c</span><span class="mord mathdefault">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.65952em;vertical-align:0em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span><span class="mord mathdefault">n</span></span></span></span>的数进行交换。求有没有可能使得整个数组变成不下降序列。</p><h2 id="解题思路-3"><a class="markdownIt-Anchor" href="#解题思路-3"></a> 解题思路</h2><p>显然minn可以和所有数进行交换，那就将minn作为交换的中间值。</p><h2 id="解法-3"><a class="markdownIt-Anchor" href="#解法-3"></a> 解法</h2><p>将数组中是minn的倍数的数提出来，直接排序（因为他们都可以通过minn进行交换）。然后从小到大插入提出来的位置。最后check一下数组，如果这个数组满足要求，那么就ok。</p><h2 id="代码-3"><a class="markdownIt-Anchor" href="#代码-3"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> a[maxn],b[maxn],c[maxn],T,n;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"C.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line"><span class="keyword">int</span> minn=<span class="number">0x7f7f7f7f</span>;b[<span class="number">0</span>]=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i]),minn=min(minn,a[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="keyword">if</span>(a[i]%minn==<span class="number">0</span>) b[++b[<span class="number">0</span>]]=a[i];</span><br><span class="line">sort(b+<span class="number">1</span>,b+b[<span class="number">0</span>]+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">int</span> p=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(a[i]%minn) c[i]=a[i];</span><br><span class="line"><span class="keyword">else</span> c[i]=b[p++];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">bool</span> flag=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">2</span>;i&lt;=n;i++) <span class="keyword">if</span>(c[i]&lt;c[i<span class="number">-1</span>]) flag=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">if</span>(flag) <span class="built_in">printf</span>(<span class="string">"YES\n"</span>);</span><br><span class="line"><span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"NO\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="d-maximum-distributed-tree"><a class="markdownIt-Anchor" href="#d-maximum-distributed-tree"></a> D. Maximum Distributed Tree</h1><blockquote><p><a href="https://codeforces.com/contest/1401/problem/D" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-4"><a class="markdownIt-Anchor" href="#题目原文-4"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1401D.png" alt="1401D" /></p><h2 id="题目大意-4"><a class="markdownIt-Anchor" href="#题目大意-4"></a> 题目大意</h2><p>给出一棵树，但没有边权。<br />给出一个数的因数形式（给出的数的乘积为k）。</p><p>现在你需要给每一条边赋值，使得所有每两个点之间通过的路径和最大，且边权需要满足以下要求：</p><ol><li>每条边的边权必须大于0</li><li><font color="red">所有边的边权之积为k</font></li><li>边权为1的边的数量尽可能地少</li></ol><h2 id="解题思路-4"><a class="markdownIt-Anchor" href="#解题思路-4"></a> 解题思路</h2><p>显然我们需要将通过最多的边赋值最大，通过次数最低的边赋值最小。于是我们想到贪心。</p><h2 id="解法-4"><a class="markdownIt-Anchor" href="#解法-4"></a> 解法</h2><p>用树形dp求出每条边的通过次数，对于一条边i，它的通过次数等于它的子树大小*(n-它的子树大小)。然后再贪心求解。</p><p>注意m&gt;n-1的情况！</p><h2 id="代码-4"><a class="markdownIt-Anchor" href="#代码-4"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> mod=<span class="number">1e9</span>+<span class="number">7</span>;</span><br><span class="line"><span class="keyword">int</span> T,n,head[maxn],k=<span class="number">0</span>,size[maxn],tot,m;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> to,next;</span><br><span class="line">&#125; edge[maxn&lt;&lt;<span class="number">1</span>];</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> u,<span class="keyword">int</span> v)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">edge[++k].to=v;</span><br><span class="line">edge[k].next=head[u];</span><br><span class="line">head[u]=k;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> p[maxn],ans=<span class="number">0</span>,b[maxn];</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> fa)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">size[x]=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=head[x];i;i=edge[i].next)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(edge[i].to==fa) <span class="keyword">continue</span>;</span><br><span class="line">dfs(edge[i].to,x);</span><br><span class="line">size[x]+=size[edge[i].to];</span><br><span class="line">b[++tot]=(<span class="keyword">long</span> <span class="keyword">long</span>)size[edge[i].to]*(<span class="keyword">long</span> <span class="keyword">long</span>)(n-size[edge[i].to]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"D.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">memset</span>(head,<span class="number">0</span>,<span class="keyword">sizeof</span>(head));k=<span class="number">0</span>;tot=<span class="number">0</span>;ans=<span class="number">0</span>;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,x,y;i&lt;n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;x,&amp;y);</span><br><span class="line">add(x,y);add(y,x);</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;m);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++) <span class="built_in">scanf</span>(<span class="string">"%lld"</span>,&amp;p[i]);</span><br><span class="line">dfs(<span class="number">1</span>,<span class="number">1</span>);</span><br><span class="line">sort(b+<span class="number">1</span>,b+tot+<span class="number">1</span>);</span><br><span class="line">sort(p+<span class="number">1</span>,p+m+<span class="number">1</span>);</span><br><span class="line">p[<span class="number">0</span>]=<span class="number">1l</span>l;</span><br><span class="line"><span class="comment">//for(int i=1;i&lt;=tot;i++) printf("%d ",b[i]);printf("\n");</span></span><br><span class="line"><span class="keyword">while</span>(m&gt;tot)</span><br><span class="line">&#123;</span><br><span class="line">p[m<span class="number">-1</span>]=(p[m<span class="number">-1</span>]*p[m])%mod;</span><br><span class="line">m--;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> pp=m;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=tot;i;i--)</span><br><span class="line">&#123;</span><br><span class="line">b[i]%=mod;</span><br><span class="line">ans=(ans+(b[i]*p[pp])%mod)%mod;</span><br><span class="line">pp--;</span><br><span class="line"><span class="keyword">if</span>(pp&lt;<span class="number">0</span>) pp=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Codeforces" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/"/>
    
      <category term="Round" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/Round/"/>
    
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
      <category term="contests" scheme="http://lemonaaaaa.com/tags/contests/"/>
    
      <category term="模拟" scheme="http://lemonaaaaa.com/tags/%E6%A8%A1%E6%8B%9F/"/>
    
      <category term="思维" scheme="http://lemonaaaaa.com/tags/%E6%80%9D%E7%BB%B4/"/>
    
      <category term="树" scheme="http://lemonaaaaa.com/tags/%E6%A0%91/"/>
    
      <category term="枚举" scheme="http://lemonaaaaa.com/tags/%E6%9E%9A%E4%B8%BE/"/>
    
      <category term="规律" scheme="http://lemonaaaaa.com/tags/%E8%A7%84%E5%BE%8B/"/>
    
      <category term="动态规划" scheme="http://lemonaaaaa.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
      <category term="树上dp" scheme="http://lemonaaaaa.com/tags/%E6%A0%91%E4%B8%8Adp/"/>
    
  </entry>
  
  <entry>
    <title>Educational Codeforces Round 93 (Rated for Div. 2) 题解</title>
    <link href="http://lemonaaaaa.com/2020/08/educational-codeforces-round-93-div2/"/>
    <id>http://lemonaaaaa.com/2020/08/educational-codeforces-round-93-div2/</id>
    <published>2020-08-15T13:46:33.000Z</published>
    <updated>2020-08-15T13:46:33.844Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="a-bad-triangle"><a class="markdownIt-Anchor" href="#a-bad-triangle"></a> A. Bad Triangle</h1><blockquote><p><a href="https://codeforces.com/contest/1398/problem/A" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文"><a class="markdownIt-Anchor" href="#题目原文"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1398A.jpg" alt="1398A" /></p><h2 id="题目大意"><a class="markdownIt-Anchor" href="#题目大意"></a> 题目大意</h2><p>给出n条边，每条边有一个长度，求问是否存在3条边不能构成三角形。</p><h2 id="解题思路"><a class="markdownIt-Anchor" href="#解题思路"></a> 解题思路</h2><p>最开始看错题了，以为是是否存在3条边能构成三角形，结果又一次10分钟没切掉A.</p><p>直接判断最小的两条边边长之和是否小于等于最长的边的边长即可。</p><h2 id="解法"><a class="markdownIt-Anchor" href="#解法"></a> 解法</h2><p>如上。</p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n,a[maxn],b[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line"><span class="comment">//freopen("A.txt","r",stdin);</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);<span class="keyword">bool</span> flag=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">2</span>;i&lt;n;i++) <span class="keyword">if</span>(a[<span class="number">1</span>]+a[i]&lt;=a[n])</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"1 %d %d\n"</span>,i,n);</span><br><span class="line">flag=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!flag) <span class="built_in">printf</span>(<span class="string">"-1\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="b-substring-removal-game"><a class="markdownIt-Anchor" href="#b-substring-removal-game"></a> B. Substring Removal Game</h1><blockquote><p><a href="https://codeforces.com/contest/1398/problem/B" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-2"><a class="markdownIt-Anchor" href="#题目原文-2"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1398B.jpg" alt="1398B" /></p><h2 id="题目大意-2"><a class="markdownIt-Anchor" href="#题目大意-2"></a> 题目大意</h2><p>Alice和Bob玩游戏，Alice先手。游戏规则如下：每次玩家可以选择任意相同且连续的数字从数组里删除，玩家得分为删除的这串数字中1的个数。现在Alice和Bob都采取最佳策略，求问Alice的最大可能得分是多少。</p><h2 id="解题思路-2"><a class="markdownIt-Anchor" href="#解题思路-2"></a> 解题思路</h2><p>分析：没人愿意选连续的一串0，不仅得0分，而且如果将两个1之间的所有0全部选完了之后另一个人就可以获得更多的分；就算只选一部分连续的0也是没有意义的。所以两个人执行最优策略一定是都选连续的1，并且肯定要从最长的连续的1开始选。</p><h2 id="解法-2"><a class="markdownIt-Anchor" href="#解法-2"></a> 解法</h2><p>统计连续的1的长度并从大到小排序为<span class="katex"><span class="katex-mathml"><math><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><msub><mi>a</mi><mn>3</mn></msub><mo>…</mo><msub><mi>a</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">a_1,a_2,a_3 \dots a_k</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 mathdefault">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 mathdefault">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="mord"><span class="mord mathdefault">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">3</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.16666666666666666em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><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 mathdefault mtight" style="margin-right:0.03148em;">k</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>，那么Alice的得分即为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mn>1</mn></msub><mtext>  </mtext><mo>+</mo><msub><mi>a</mi><mn>3</mn></msub><mtext>  </mtext><mo>+</mo><msub><mi>a</mi><mn>5</mn></msub><mtext>  </mtext><mo>+</mo><mo>…</mo></mrow><annotation encoding="application/x-tex">a_1\;+a_3\;+a_5\;+\dots</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.73333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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="mspace" style="margin-right:0.2222222222222222em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.73333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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">3</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.2222222222222222em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.73333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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">5</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.2222222222222222em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:0.12em;vertical-align:0em;"></span><span class="minner">…</span></span></span></span>。</p><h2 id="代码-2"><a class="markdownIt-Anchor" href="#代码-2"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T;</span><br><span class="line"><span class="keyword">char</span> str[maxn];</span><br><span class="line"><span class="keyword">int</span> a[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"B.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>,str+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">int</span> n=<span class="built_in">strlen</span>(str+<span class="number">1</span>);</span><br><span class="line">a[<span class="number">0</span>]=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(str[i]==<span class="string">'1'</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> cnt=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(i&lt;=n&amp;&amp;str[i]==<span class="string">'1'</span>)</span><br><span class="line">&#123;</span><br><span class="line">cnt++;</span><br><span class="line">i++;</span><br><span class="line">&#125;</span><br><span class="line">a[++a[<span class="number">0</span>]]=cnt;</span><br><span class="line">i--;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">sort(a+<span class="number">1</span>,a+a[<span class="number">0</span>]+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">int</span> ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=a[<span class="number">0</span>];i&gt;<span class="number">0</span>;i-=<span class="number">2</span>) ans+=a[i];</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>,ans);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="c-good-subarrays"><a class="markdownIt-Anchor" href="#c-good-subarrays"></a> C. Good Subarrays</h1><blockquote><p><a href="https://codeforces.com/contest/1398/problem/C" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-3"><a class="markdownIt-Anchor" href="#题目原文-3"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1398C.jpg" alt="1398C" /></p><h2 id="题目大意-3"><a class="markdownIt-Anchor" href="#题目大意-3"></a> 题目大意</h2><p>给出一串数，求区间长度等于区间和的区间个数。</p><h2 id="解题思路-3"><a class="markdownIt-Anchor" href="#解题思路-3"></a> 解题思路</h2><p>将所有数都-1，那么问题转换为了求区间和为0的区间个数。</p><h2 id="解法-3"><a class="markdownIt-Anchor" href="#解法-3"></a> 解法</h2><p>开一个map记录区间长度为i的数量，然后记录每个前缀和的出现次数。如果枚举到一个位置时前缀和已经出现过了，那么说明这个位置到 上一个位置、到之前所有前缀和等于这个位置前缀和的位置 之间，区间和为0，那么答案加上这些区间个数就行。</p><h2 id="代码-3"><a class="markdownIt-Anchor" href="#代码-3"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;map&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n,a[maxn];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> s[maxn],ans=<span class="number">0</span>;</span><br><span class="line"><span class="built_in">map</span>&lt;<span class="keyword">long</span> <span class="keyword">long</span>,<span class="keyword">long</span> <span class="keyword">long</span>&gt; mp;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"D.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);mp.clear();ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%1d"</span>,&amp;a[i]),a[i]--;</span><br><span class="line">mp[<span class="number">0</span>]=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line">s[i]=s[i<span class="number">-1</span>]+a[i];</span><br><span class="line"><span class="keyword">if</span>(mp[s[i]]) ans+=mp[s[i]];</span><br><span class="line">mp[s[i]]++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="d-colored-rectangles"><a class="markdownIt-Anchor" href="#d-colored-rectangles"></a> D. Colored Rectangles</h1><blockquote><p><a href="https://codeforces.com/contest/1398/problem/D" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-4"><a class="markdownIt-Anchor" href="#题目原文-4"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1398D.jpg" alt="1398D" /></p><h2 id="题目大意-4"><a class="markdownIt-Anchor" href="#题目大意-4"></a> 题目大意</h2><p>给出三种颜色的若干棍棍，每次可以选择两种不同颜色的棍棍，将他们的长度相乘加到答案上，不能重复选，求能得到的最大答案是多少。</p><h2 id="解题思路-4"><a class="markdownIt-Anchor" href="#解题思路-4"></a> 解题思路</h2><p>最开始想的是贪心，每次都取最长的两组棍棍相乘，然后顺利通过了样例，交上去WA了。最开始还以为自己贪心细节写错了，后来发现贪心的实现没有问题，那就证明了这道题贪心是错的。然后一看数据范围，只有200，于是想到dp。</p><h2 id="解法-4"><a class="markdownIt-Anchor" href="#解法-4"></a> 解法</h2><p><code>f[i][j][k]</code>表示第一种颜色选了i根，第二种颜色选了j根，第三种颜色选了k根得到的最大答案是多少。转移的话就枚举上一次选了哪两根来转移就好。选的顺序是从长到短，这个可以很容易证明~~（略）~~。</p><h2 id="代码-4"><a class="markdownIt-Anchor" href="#代码-4"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> n,k,m,a[maxn],b[maxn],c[maxn];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> f[<span class="number">205</span>][<span class="number">205</span>][<span class="number">205</span>];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"C.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d%d"</span>,&amp;n,&amp;m,&amp;k);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;b[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=k;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;c[i]);</span><br><span class="line">sort(a+<span class="number">1</span>,a+n+<span class="number">1</span>,greater&lt;<span class="keyword">int</span>&gt;());</span><br><span class="line">sort(b+<span class="number">1</span>,b+m+<span class="number">1</span>,greater&lt;<span class="keyword">int</span>&gt;());</span><br><span class="line">sort(c+<span class="number">1</span>,c+k+<span class="number">1</span>,greater&lt;<span class="keyword">int</span>&gt;());</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j&lt;=m;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> p=<span class="number">0</span>;p&lt;=k;p++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>((i<span class="number">-1</span>&gt;=<span class="number">0</span>)&amp;&amp;(j<span class="number">-1</span>&gt;=<span class="number">0</span>)) f[i][j][p]=max(f[i][j][p],f[i<span class="number">-1</span>][j<span class="number">-1</span>][p]+a[i]*b[j]);</span><br><span class="line"><span class="keyword">if</span>((p<span class="number">-1</span>&gt;=<span class="number">0</span>)&amp;&amp;(j<span class="number">-1</span>&gt;=<span class="number">0</span>)) f[i][j][p]=max(f[i][j][p],f[i][j<span class="number">-1</span>][p<span class="number">-1</span>]+b[j]*c[p]);</span><br><span class="line"><span class="keyword">if</span>((i<span class="number">-1</span>&gt;=<span class="number">0</span>)&amp;&amp;(p<span class="number">-1</span>&gt;=<span class="number">0</span>)) f[i][j][p]=max(f[i][j][p],f[i<span class="number">-1</span>][j][p<span class="number">-1</span>]+a[i]*c[p]);</span><br><span class="line"><span class="comment">//printf("%d %d %d %lld\n",a[i],b[j],c[p],f[i][j][p]);</span></span><br><span class="line">ans=max(ans,f[i][j][p]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/standings/edu-round-93.jpg" alt="edu-round-93" /></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Codeforces" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/"/>
    
      <category term="Round" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/Round/"/>
    
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
      <category term="contests" scheme="http://lemonaaaaa.com/tags/contests/"/>
    
      <category term="模拟" scheme="http://lemonaaaaa.com/tags/%E6%A8%A1%E6%8B%9F/"/>
    
      <category term="思维" scheme="http://lemonaaaaa.com/tags/%E6%80%9D%E7%BB%B4/"/>
    
      <category term="枚举" scheme="http://lemonaaaaa.com/tags/%E6%9E%9A%E4%B8%BE/"/>
    
      <category term="动态规划" scheme="http://lemonaaaaa.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
      <category term="STL" scheme="http://lemonaaaaa.com/tags/STL/"/>
    
  </entry>
  
  <entry>
    <title>Codeforces Round 664 (Div. 2) 题解</title>
    <link href="http://lemonaaaaa.com/2020/08/codeforces-round-664-div2/"/>
    <id>http://lemonaaaaa.com/2020/08/codeforces-round-664-div2/</id>
    <published>2020-08-13T03:57:02.000Z</published>
    <updated>2020-08-13T03:57:02.602Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="a-boboniu-likes-to-color-balls"><a class="markdownIt-Anchor" href="#a-boboniu-likes-to-color-balls"></a> A. Boboniu Likes to Color Balls</h1><blockquote><p><a href="https://codeforces.com/contest/1395/problem/A" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文"><a class="markdownIt-Anchor" href="#题目原文"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1395A.jpg" alt="1395A" /></p><h2 id="题目大意"><a class="markdownIt-Anchor" href="#题目大意"></a> 题目大意</h2><p>给出红球的数量，绿球的数量，蓝球的数量，白球的数量，并且你有一次机会将一个红球、一个绿球和一个蓝球都涂成白球。询问是否可能用这些球组成回文串。</p><h2 id="解题思路"><a class="markdownIt-Anchor" href="#解题思路"></a> 解题思路</h2><p>四种球中如果最多只有一种球为奇数，那么一定可以组成回文串（将奇数个的那种球放最中间）。另外要注意当红球、蓝球、绿球的数量都大于0才能都涂成白球（白球数量要记得+=3）。</p><h2 id="解法"><a class="markdownIt-Anchor" href="#解法"></a> 解法</h2><p>如上。</p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> T,r,g,b,w;</span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">get</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x)</span> </span>&#123;<span class="keyword">if</span>(x&amp;<span class="number">1</span>) <span class="keyword">return</span> <span class="number">1</span>;<span class="keyword">return</span> <span class="number">0</span>;&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"A.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld%lld%lld%lld"</span>,&amp;r,&amp;g,&amp;b,&amp;w);</span><br><span class="line"><span class="keyword">bool</span> flag=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> temp=get(r)+get(g)+get(b)+get(w);</span><br><span class="line"><span class="keyword">if</span>(temp&lt;=<span class="number">1</span>) flag=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">if</span>(r&amp;&amp;g&amp;&amp;b) r--,g--,b--,w+=<span class="number">3</span>;</span><br><span class="line">temp=get(r)+get(g)+get(b)+get(w);</span><br><span class="line"><span class="keyword">if</span>(temp&lt;=<span class="number">1</span>) flag=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">if</span>(flag) <span class="built_in">printf</span>(<span class="string">"YES\n"</span>);</span><br><span class="line"><span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"NO\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="b-boboniu-plays-chess"><a class="markdownIt-Anchor" href="#b-boboniu-plays-chess"></a> B. Boboniu Plays Chess</h1><blockquote><p><a href="https://codeforces.com/contest/1395/problem/B" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-2"><a class="markdownIt-Anchor" href="#题目原文-2"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1395B.jpg" alt="1395B" /></p><h2 id="题目大意-2"><a class="markdownIt-Anchor" href="#题目大意-2"></a> 题目大意</h2><p>在一个<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mo>×</mo><mi>m</mi></mrow><annotation encoding="application/x-tex">n \times m</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 mathdefault">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.43056em;vertical-align:0em;"></span><span class="mord mathdefault">m</span></span></span></span>的棋盘上，位置<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">(</mo><msub><mi>S</mi><mi>x</mi></msub><mo separator="true">,</mo><msub><mi>S</mi><mi>y</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(S_x,S_y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.036108em;vertical-align:-0.286108em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathdefault" style="margin-right:0.05764em;">S</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:-0.05764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight">x</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 mathdefault" style="margin-right:0.05764em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.15139200000000003em;"><span style="top:-2.5500000000000003em;margin-left:-0.05764em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.03588em;">y</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="mclose">)</span></span></span></span>上有一个车（只能走直线）。求一种走法遍历整个棋盘。</p><h2 id="解题思路-2"><a class="markdownIt-Anchor" href="#解题思路-2"></a> 解题思路</h2><p>因为题目没有限制每个点只能走一次，那就随意走就好了。为了方便我采用的是一行一行地走，碰到边界拐弯。</p><h2 id="解法-2"><a class="markdownIt-Anchor" href="#解法-2"></a> 解法</h2><p>如上。</p><h2 id="代码-2"><a class="markdownIt-Anchor" href="#代码-2"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> ansx[maxn],ansy[maxn],n,m,sx,sy;</span><br><span class="line"><span class="keyword">bool</span> vis[<span class="number">105</span>][<span class="number">105</span>];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"B.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d%d%d"</span>,&amp;n,&amp;m,&amp;sx,&amp;sy);</span><br><span class="line"><span class="keyword">int</span> now=<span class="number">1</span>;</span><br><span class="line">ansx[now]=sx;ansy[now]=sy;</span><br><span class="line">vis[sx][sy]=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(vis[sx][i]) <span class="keyword">continue</span>;</span><br><span class="line">ansx[++now]=sx;ansy[now]=i;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> cnt=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=sx+<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(cnt&amp;<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=m;j;j--)</span><br><span class="line">&#123;</span><br><span class="line">ansx[++now]=i;ansy[now]=j;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=m;j++)</span><br><span class="line">&#123;</span><br><span class="line">ansx[++now]=i;ansy[now]=j;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">cnt++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=sx<span class="number">-1</span>;i;i--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(cnt&amp;<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=m;j;j--)</span><br><span class="line">&#123;</span><br><span class="line">ansx[++now]=i;ansy[now]=j;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=m;j++)</span><br><span class="line">&#123;</span><br><span class="line">ansx[++now]=i;ansy[now]=j;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">cnt++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=now;i++) <span class="built_in">printf</span>(<span class="string">"%d %d\n"</span>,ansx[i],ansy[i]);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="c-boboniu-and-bit-operations"><a class="markdownIt-Anchor" href="#c-boboniu-and-bit-operations"></a> C. Boboniu and Bit Operations</h1><blockquote><p><a href="https://codeforces.com/contest/1395/problem/C" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-3"><a class="markdownIt-Anchor" href="#题目原文-3"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1395C.jpg" alt="1395C" /></p><h2 id="题目大意-3"><a class="markdownIt-Anchor" href="#题目大意-3"></a> 题目大意</h2><p>给出一个长度为n的<span class="katex"><span class="katex-mathml"><math><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 mathdefault">a</span></span></span></span>数组和一个长度为m的<span class="katex"><span class="katex-mathml"><math><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.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span>数组，对于<span class="katex"><span class="katex-mathml"><math><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 mathdefault">a</span></span></span></span>数组中每一个元素<span class="katex"><span class="katex-mathml"><math><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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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><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.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span>数组里面找到一个元素与它求按位与，得到<span class="katex"><span class="katex-mathml"><math><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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault 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><semantics><mrow><msub><mi>c</mi><mn>1</mn></msub><mi mathvariant="normal">∣</mi><msub><mi>c</mi><mn>2</mn></msub><mi mathvariant="normal">∣</mi><mo>…</mo><mi mathvariant="normal">∣</mi><msub><mi>c</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">c_1|c_2| \dots |c_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"><span class="mord mathdefault">c</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="mord">∣</span><span class="mord"><span class="mord mathdefault">c</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="mord">∣</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="mord">∣</span><span class="mord"><span class="mord mathdefault">c</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 mathdefault 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><h2 id="解题思路-3"><a class="markdownIt-Anchor" href="#解题思路-3"></a> 解题思路</h2><p>因为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mi>i</mi></msub><mo separator="true">,</mo><mtext>  </mtext><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 mathdefault">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 mathdefault 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="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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><semantics><mrow><mi>m</mi><mi>a</mi><mi>x</mi><mrow><mi>m</mi><mi>a</mi><mi>x</mi><msub><mi>a</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>m</mi><mi>a</mi><mi>x</mi><msub><mi>b</mi><mi>j</mi></msub></mrow></mrow><annotation encoding="application/x-tex">max{max{a_i},max{b_j}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault">x</span><span class="mord"><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault">x</span><span class="mord"><span class="mord"><span class="mord mathdefault">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 mathdefault 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 class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault">x</span><span class="mord"><span class="mord"><span class="mord mathdefault">b</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 mathdefault mtight" style="margin-right:0.05724em;">j</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></span>，所以我们直接从小到大枚举答案进行验证就好。时间复杂度<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo>⋅</mo><mi>m</mi><mo>⋅</mo><msup><mn>2</mn><mn>9</mn></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n \cdot m \cdot 2^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 mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathdefault">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.44445em;vertical-align:0em;"></span><span class="mord mathdefault">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:1.064108em;vertical-align:-0.25em;"></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">9</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></p><h2 id="解法-3"><a class="markdownIt-Anchor" href="#解法-3"></a> 解法</h2><p>枚举答案，对于每一个答案<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mi>n</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">ans</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 mathdefault">a</span><span class="mord mathdefault">n</span><span class="mord mathdefault">s</span></span></span></span>，判断是否存在<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mi>i</mi></msub><mtext>  </mtext><mi>a</mi><mi>n</mi><mi>d</mi><mtext>  </mtext><msub><mi>b</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">a_i\;and\; b_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.980548em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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="mord mathdefault">a</span><span class="mord mathdefault">n</span><span class="mord mathdefault">d</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault">b</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 mathdefault mtight" style="margin-right:0.05724em;">j</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><semantics><mrow><mi>a</mi><mi>n</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">ans</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 mathdefault">a</span><span class="mord mathdefault">n</span><span class="mord mathdefault">s</span></span></span></span>的子集。</p><h2 id="代码-3"><a class="markdownIt-Anchor" href="#代码-3"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> n,m,a[maxn],b[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"C.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;n,&amp;m);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;b[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> ans=<span class="number">0</span>;ans&lt;(<span class="number">1</span>&lt;&lt;<span class="number">9</span>);ans++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">bool</span> flag=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">bool</span> f=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=m;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>((a[i]&amp;b[j]&amp;ans)==(a[i]&amp;b[j])) f=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!f)</span><br><span class="line">&#123;</span><br><span class="line">flag=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(flag)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>,ans);</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="d-boboniu-chats-with-du"><a class="markdownIt-Anchor" href="#d-boboniu-chats-with-du"></a> D. Boboniu Chats with Du</h1><blockquote><p><a href="https://codeforces.com/contest/1395/problem/D" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-4"><a class="markdownIt-Anchor" href="#题目原文-4"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1395D.jpg" alt="1395D" /></p><h2 id="题目大意-4"><a class="markdownIt-Anchor" href="#题目大意-4"></a> 题目大意</h2><p>给出n个值<span class="katex"><span class="katex-mathml"><math><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><msub><mi>a</mi><mn>3</mn></msub><mo>…</mo><msub><mi>a</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">a_1,a_2,a_3 \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 mathdefault">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 mathdefault">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="mord"><span class="mord mathdefault">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">3</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.16666666666666666em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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>，每天你可以选择一个值（不能重复选），如果这个值大于了m，那么你在接下来d天内不能选择。现在一共有n天，求最后能得到的最大的值的和。</p><h2 id="解题思路-4"><a class="markdownIt-Anchor" href="#解题思路-4"></a> 解题思路</h2><p>朴素解法：<br />这明显是一个01背包，如果<span class="katex"><span class="katex-mathml"><math><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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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>小于等于m，那么cost就为1；否则cost就为d+1。直接做01背包，<s>然后你就会发现TLE了</s>。</p><p>解法：<br />因为d是固定的，所以如果我们要选<span class="katex"><span class="katex-mathml"><math><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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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>大于m的值，一定从最大的开始选，选<span class="katex"><span class="katex-mathml"><math><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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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>小于等于m的值同理。所以我们排序后对这两部分分别做前缀和，然后我们再直接暴力枚举选多少个<span class="katex"><span class="katex-mathml"><math><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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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>小于等于m的值，然后由于d是固定的，所以我们可以O(1)算出可以选多少个<span class="katex"><span class="katex-mathml"><math><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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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>大于m的值，用前缀和O(1)更新答案。总复杂度<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo>⋅</mo><mi>l</mi><mi>o</mi><mi>g</mi><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n \cdot logn)</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 mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">o</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">n</span><span class="mclose">)</span></span></span></span>。</p><p>另外注意边界，<s>同学pretest AC了，一觉醒来就WA了</s>。</p><h2 id="解法-4"><a class="markdownIt-Anchor" href="#解法-4"></a> 解法</h2><p>前缀和+枚举</p><h2 id="代码-4"><a class="markdownIt-Anchor" href="#代码-4"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> n,d,m,a[maxn],f[maxn][<span class="number">2</span>],s[maxn],ans=<span class="number">0</span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"D.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld%lld%lld"</span>,&amp;n,&amp;d,&amp;m);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%lld"</span>,&amp;a[i]);</span><br><span class="line">sort(a+<span class="number">1</span>,a+n+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">int</span> tot=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(a[i]&lt;=m) tot++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=tot;i;i--) s[i]=s[i+<span class="number">1</span>]+a[i];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=n;i&gt;=tot+<span class="number">1</span>;i--) s[i]=s[i+<span class="number">1</span>]+a[i];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;=tot;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> tim=(n-i+d)/(d+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">if</span>(n-tot&lt;tim) <span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">int</span> t1=tot-i+<span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span>(t1&gt;tot) t1=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">int</span> t2=n-tim+<span class="number">1</span>;</span><br><span class="line">ans=max(ans,s[t1]+s[t2]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/standings/round-664.jpg" alt="round-664" /></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Codeforces" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/"/>
    
      <category term="Round" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/Round/"/>
    
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
      <category term="contests" scheme="http://lemonaaaaa.com/tags/contests/"/>
    
      <category term="模拟" scheme="http://lemonaaaaa.com/tags/%E6%A8%A1%E6%8B%9F/"/>
    
      <category term="思维" scheme="http://lemonaaaaa.com/tags/%E6%80%9D%E7%BB%B4/"/>
    
      <category term="枚举" scheme="http://lemonaaaaa.com/tags/%E6%9E%9A%E4%B8%BE/"/>
    
      <category term="规律" scheme="http://lemonaaaaa.com/tags/%E8%A7%84%E5%BE%8B/"/>
    
      <category term="动态规划" scheme="http://lemonaaaaa.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
  </entry>
  
  <entry>
    <title>Codeforces Round 663 (Div. 2) 题解</title>
    <link href="http://lemonaaaaa.com/2020/08/codeforces-round-663-div2/"/>
    <id>http://lemonaaaaa.com/2020/08/codeforces-round-663-div2/</id>
    <published>2020-08-10T09:48:08.000Z</published>
    <updated>2020-08-10T09:48:08.114Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="a-suborrays"><a class="markdownIt-Anchor" href="#a-suborrays"></a> A. Suborrays</h1><blockquote><p><a href="https://codeforces.com/contest/1391/problem/A" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文"><a class="markdownIt-Anchor" href="#题目原文"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1391A.jpg" alt="1391A" /></p><h2 id="题目大意"><a class="markdownIt-Anchor" href="#题目大意"></a> 题目大意</h2><p>如果存在一个排列，对于其任意的连续子序列<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>p</mi><mi>i</mi></msub><mo>…</mo><msub><mi>p</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">p_i \dots p_j</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 mathdefault">p</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 mathdefault 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.16666666666666666em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mord mathdefault">p</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 mathdefault mtight" style="margin-right:0.05724em;">j</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><semantics><mrow><msub><mi>p</mi><mi>i</mi></msub><mtext>  </mtext><mi>O</mi><mi>R</mi><mtext>  </mtext><msub><mi>p</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><mtext>  </mtext><mi>O</mi><mi>R</mi><mtext>  </mtext><mo>…</mo><mtext>  </mtext><mi>O</mi><mi>R</mi><mtext>  </mtext><msub><mi>p</mi><mi>j</mi></msub><mo>⩾</mo><mi>j</mi><mo>−</mo><mi>i</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">p_i \;OR \;p_{i+1} \;OR \;\dots \;OR \;p_j \geqslant j-i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.969438em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault">p</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 mathdefault 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="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault">p</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 mathdefault mtight">i</span><span class="mbin mtight">+</span><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.208331em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord"><span class="mord mathdefault">p</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 mathdefault mtight" style="margin-right:0.05724em;">j</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 amsrm">⩾</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</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.74285em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">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>，则称这个排列为好排列。现在请输出任意长度为n的好排列。</p><h2 id="解题思路"><a class="markdownIt-Anchor" href="#解题思路"></a> 解题思路</h2><p>显然直接按从小到大输出一定能满足要求</p><h2 id="解法"><a class="markdownIt-Anchor" href="#解法"></a> 解法</h2><p>直接输出<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mtext>  </mtext><mn>2</mn><mtext>  </mtext><mn>3</mn><mtext>  </mtext><mn>4</mn><mtext>  </mtext><mo>…</mo><mtext>  </mtext><mi>n</mi></mrow><annotation encoding="application/x-tex">1 \; 2 \; 3 \; 4 \; \dots \; n</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="mord">2</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mord mathdefault">n</span></span></span></span></p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n,a[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"A.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">printf</span>(<span class="string">"%d "</span>,i);</span><br><span class="line"><span class="comment">/*for(int i=1;i&lt;=n;i++)</span></span><br><span class="line"><span class="comment">&#123;</span></span><br><span class="line"><span class="comment">for(int j=i;j&lt;=n;j++)</span></span><br><span class="line"><span class="comment">&#123;</span></span><br><span class="line"><span class="comment">int temp=0;</span></span><br><span class="line"><span class="comment">for(int p=i;p&lt;=j;p++) temp|=p;</span></span><br><span class="line"><span class="comment">if(temp&lt;j-i+1) printf("NO\n");</span></span><br><span class="line"><span class="comment">&#125;</span></span><br><span class="line"><span class="comment">&#125;*/</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="b-fix-you"><a class="markdownIt-Anchor" href="#b-fix-you"></a> B. Fix You</h1><blockquote><p><a href="https://codeforces.com/contest/1391/problem/B" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-2"><a class="markdownIt-Anchor" href="#题目原文-2"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1391B.jpg" alt="1391B" /></p><h2 id="题目大意-2"><a class="markdownIt-Anchor" href="#题目大意-2"></a> 题目大意</h2><p>给出n行m列的矩阵，每个格子的值是’R’或者’D’。当移动到一个值为’R’的格子，那么会自动向右移动一格；当移动到一个值为’D’的格子，那么会自动向下移动一格。求至少修改多少个格子的值，能够满足“无论起始位置在哪，中途不能移动到边界外，并且最终都能到达最右下角的格子。</p><h2 id="解题思路-2"><a class="markdownIt-Anchor" href="#解题思路-2"></a> 解题思路</h2><p>我们发现’R’和’D’都是单调的，也就是说不会往回走，大体上的趋势一定是向右下角走的，我们只需要考虑是否会移出边界。</p><ul><li>判断第n行每一列的值是否为’R’，如果不是，则必须修改，否则会移出边界。</li><li>判断第m列每一列的值是否为’D’，如果不是，则必须修改，否则会移出边界。</li></ul><h2 id="解法-2"><a class="markdownIt-Anchor" href="#解法-2"></a> 解法</h2><p>答案即为第n行格子值为’D’的数量和第m列格子值为’R’的数量之和。</p><h2 id="代码-2"><a class="markdownIt-Anchor" href="#代码-2"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n,m,a[<span class="number">105</span>][<span class="number">105</span>];</span><br><span class="line"><span class="keyword">char</span> str[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"B.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;n,&amp;m);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>,str+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=m;j++)</span><br><span class="line"><span class="keyword">if</span>(str[j]==<span class="string">'R'</span>) a[i][j]=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">else</span> a[i][j]=<span class="number">1</span>; </span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n<span class="number">-1</span>;i++) <span class="keyword">if</span>(!a[i][m]) ans++;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m<span class="number">-1</span>;i++) <span class="keyword">if</span>(a[n][i]) ans++;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>,ans);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="c-cyclic-permutations"><a class="markdownIt-Anchor" href="#c-cyclic-permutations"></a> C. Cyclic Permutations</h1><blockquote><p><a href="https://codeforces.com/contest/1391/problem/C" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-3"><a class="markdownIt-Anchor" href="#题目原文-3"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1391C.jpg" alt="1391C" /></p><h2 id="题目大意-3"><a class="markdownIt-Anchor" href="#题目大意-3"></a> 题目大意</h2><p>语言表达能力比较差，叙述上存在困难，直接看原文吧……那两个条件就是与最近的大于它的下标连边。</p><h2 id="解题思路-3"><a class="markdownIt-Anchor" href="#解题思路-3"></a> 解题思路</h2><p>考虑<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mo>&lt;</mo><mi>j</mi><mo>&lt;</mo><mi>k</mi></mrow><annotation encoding="application/x-tex">i&lt;j&lt;k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.69862em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">i</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>，那么我们发现只有<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>a</mi><mi>i</mi></msub><mo>&gt;</mo><msub><mi>a</mi><mi>j</mi></msub><mo>&lt;</mo><msub><mi>a</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">a_i&gt;a_j&lt;a_k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6891em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault 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">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8252079999999999em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault">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 mathdefault mtight" style="margin-right:0.05724em;">j</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">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.33610799999999996em;"><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 mathdefault mtight" style="margin-right:0.03148em;">k</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><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 mathdefault">i</span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>连边，<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>连边，<span class="katex"><span class="katex-mathml"><math><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 mathdefault">i</span></span></span></span>与<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03148em;">k</span></span></span></span>连边）。因为题目只需要满足存在一个简单环就行了，那就是只需要存在一个子序列（不一定连续）满足这个条件的就可以。</p><p>最开始尝试去用排列组合的方法直接算，后来发现比较困难，有重复情况。然后后来想到可以用总方案数-不满足要求的方案数。</p><p>显然总方案数为n!，那么现在考虑不满足要求的方案数。前面说到只要存在一个小的在中间，两边存在两个比它大的就行。那么我们就考虑最大的数，也就是n的位置。</p><ul><li>将n放第1个位置，左边放0个数，右边放n-1个数，且顺序必须是从大到小，所以方案数为C(n-1,0)</li><li>将n放第2个位置，左边放1个数（从n-1个数中选1个），右边放n-2个数，且两边顺序必须是从n的位置开始，向两边从大到小排列（合唱队形），所以方案数为C(n-1,1)</li><li>将n放第3个位置，左边放2个数（从n-1个数中选2个），右边放n-3个数，且两边顺序必须是从n的位置开始，向两边从大到小排列（合唱队形），所以方案数为C(n-1,2)</li><li>将n放第n个位置，左边放n-1个数（从n-1个数中选n-1个），右边放0个数，且两边顺序必须是从n的位置开始，向两边从大到小排列（合唱队形），所以方案数为C(n-1,n-1)</li></ul><p>所以不合法的方案数为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msubsup><mrow><mo fence="true">(</mo><mstyle displaystyle="true" scriptlevel="0"><mfrac linethickness="0px"><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow><mi>i</mi></mfrac></mstyle><mo fence="true">)</mo></mrow><mo>=</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">\sum\limits_{i=0}^{n-1}\dbinom{n-1}{i} = 2^{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.478782em;vertical-align:-0.9776689999999999em;"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.5011130000000001em;"><span style="top:-2.122331em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.0000050000000003em;"><span class="pstrut" style="height:3em;"></span><span><span class="mop op-symbol small-op">∑</span></span></span><span style="top:-3.950005em;margin-left:0em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><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.9776689999999999em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.32144em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">i</span></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">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 class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</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"><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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></p><h2 id="解法-3"><a class="markdownIt-Anchor" href="#解法-3"></a> 解法</h2><p>答案即为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mo stretchy="false">!</mo><mo>−</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">n!-2^{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.77777em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">n</span><span class="mclose">!</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"><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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></p><h2 id="代码-3"><a class="markdownIt-Anchor" href="#代码-3"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">1000005</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">long</span> <span class="keyword">long</span> mod=<span class="number">1e9</span>+<span class="number">7</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> fac[maxn];</span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">poww</span><span class="params">(<span class="keyword">long</span> <span class="keyword">long</span> x,<span class="keyword">long</span> <span class="keyword">long</span> k)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span>(k)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(k&amp;<span class="number">1</span>) ans=(ans*x)%mod;</span><br><span class="line">x=(x*x)%mod;</span><br><span class="line">k&gt;&gt;=<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"C.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> n;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld"</span>,&amp;n);</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans=<span class="number">0</span>;</span><br><span class="line">fac[<span class="number">0</span>]=fac[<span class="number">1</span>]=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">long</span> <span class="keyword">long</span> i=<span class="number">2</span>;i&lt;=n;i++) fac[i]=(fac[i<span class="number">-1</span>]*i)%mod;</span><br><span class="line">ans=fac[n];</span><br><span class="line">ans=ans-poww(<span class="number">2l</span>l,n<span class="number">-1</span>);</span><br><span class="line">ans=(ans%mod+mod)%mod;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="d-505"><a class="markdownIt-Anchor" href="#d-505"></a> D. 505</h1><blockquote><p><a href="https://codeforces.com/contest/1391/problem/D" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-4"><a class="markdownIt-Anchor" href="#题目原文-4"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/problems/1391D.jpg" alt="1391D" /></p><h2 id="题目大意-4"><a class="markdownIt-Anchor" href="#题目大意-4"></a> 题目大意</h2><p>如果一个二进制矩阵是good的，那么它的所有边长为偶数的子矩阵中1的个数都是奇数个。<br />给出n行m列的矩阵，求修改多少次矩阵中的值能够使这个矩阵变为good的。如果不存在修改方案满足要求，输出-1。</p><h2 id="解题思路-4"><a class="markdownIt-Anchor" href="#解题思路-4"></a> 解题思路</h2><p>如果n=1||m=1，那么没有边长为偶数的子矩阵，输出0<br />如果n&gt;=4&amp;&amp;m&gt;=4，那么考虑两个连续的2x2的矩阵。如果这两个连续的2x2矩阵都满足要求，也就是说这两个连续的矩阵中1的个数都是奇数，那么这两个矩阵合起来的2x4的矩阵中1的个数就为偶数了。所以n&gt;=4&amp;&amp;m&gt;=4一定不存在合法的矩阵，也就是无论怎么修改都不能满足要求，所以输出-1</p><p>现在n就只能是2或3了，考虑动态规划。<code>f[i][j]</code>表示第i列的状态为j，j为3位二进制，表示这一列的3位分别为0或者1。那么我们可以枚举这一列的状态和上一列的状态进行转移。<br />假设这一列原来的状态是now（输入的状态），枚举的状态是j，上一列的状态是p。如果j和p满足要求，那么我们就可以进行转移，而满足的要求为这相邻的两列所有长度为偶数的子矩阵的1的个数为奇数，这里预处理一下就好（最大也就是3x2的矩阵）。</p><h2 id="解法-4"><a class="markdownIt-Anchor" href="#解法-4"></a> 解法</h2><p>转移方程<code>f[i][j]=min(f[i][j],f[i-1][p]+(now^j)中1的个数);</code><br />now^j中1的个数即为需要修改这一列的数的个数。</p><h2 id="代码-4"><a class="markdownIt-Anchor" href="#代码-4"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;string&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">1000005</span>;</span><br><span class="line"><span class="keyword">int</span> n,m,ans=<span class="number">0x7f7f7f7f</span>;</span><br><span class="line"><span class="keyword">int</span> a[<span class="number">4</span>][maxn],f[maxn][<span class="number">8</span>];</span><br><span class="line"><span class="keyword">bool</span> ok[<span class="number">8</span>][<span class="number">8</span>]=&#123;<span class="literal">false</span>&#125;;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">calc</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">int</span> ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(x)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(x&amp;<span class="number">1</span>) ans++;</span><br><span class="line">x&gt;&gt;=<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"> <span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line"><span class="comment">//freopen("D.txt","r",stdin);</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;n,&amp;m);</span><br><span class="line"><span class="keyword">if</span>(n&gt;=<span class="number">4</span>&amp;&amp;m&gt;=<span class="number">4</span>) <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">"-1\n"</span>),<span class="number">0</span>;</span><br><span class="line"><span class="keyword">if</span>(n==<span class="number">1</span>||m==<span class="number">1</span>) <span class="keyword">return</span> <span class="built_in">printf</span>(<span class="string">"0\n"</span>),<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j&lt;=m;j++) <span class="built_in">scanf</span>(<span class="string">"%1d"</span>,&amp;a[i][j]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">8</span>;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j&lt;<span class="number">8</span>;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> t[<span class="number">3</span>];</span><br><span class="line">t[<span class="number">0</span>]=t[<span class="number">1</span>]=t[<span class="number">2</span>]=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> p=<span class="number">0</span>;p&lt;n;p++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>((<span class="number">1</span>&lt;&lt;p)&amp;i) t[p]++;</span><br><span class="line"><span class="keyword">if</span>((<span class="number">1</span>&lt;&lt;p)&amp;j) t[p]++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">bool</span> flag=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> p=<span class="number">0</span>;p&lt;n<span class="number">-1</span>;p++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(!((t[p]+t[p+<span class="number">1</span>])&amp;<span class="number">1</span>)) flag=<span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(flag) ok[i][j]=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">memset</span>(f,<span class="number">0x7f7f7f7f</span>,<span class="keyword">sizeof</span>(f));</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">8</span>;i++) f[<span class="number">0</span>][i]=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=m;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> now=a[<span class="number">1</span>][i]+a[<span class="number">2</span>][i]*<span class="number">2</span>+a[<span class="number">3</span>][i]*<span class="number">4</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j&lt;<span class="number">8</span>;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> p=<span class="number">0</span>;p&lt;<span class="number">8</span>;p++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(!ok[j][p]) <span class="keyword">continue</span>;</span><br><span class="line">f[i][j]=min(f[i][j],f[i<span class="number">-1</span>][p]+calc(now^j));</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">8</span>;i++) ans=min(ans,f[m][i]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%d\n"</span>,ans);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN2/img/codeforces/standings/round-663.jpg" alt="round-663" /></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Codeforces" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/"/>
    
      <category term="Round" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/Round/"/>
    
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
      <category term="contests" scheme="http://lemonaaaaa.com/tags/contests/"/>
    
      <category term="模拟" scheme="http://lemonaaaaa.com/tags/%E6%A8%A1%E6%8B%9F/"/>
    
      <category term="思维" scheme="http://lemonaaaaa.com/tags/%E6%80%9D%E7%BB%B4/"/>
    
      <category term="数论" scheme="http://lemonaaaaa.com/tags/%E6%95%B0%E8%AE%BA/"/>
    
      <category term="规律" scheme="http://lemonaaaaa.com/tags/%E8%A7%84%E5%BE%8B/"/>
    
      <category term="动态规划" scheme="http://lemonaaaaa.com/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
  </entry>
  
  <entry>
    <title>Codeforces Round 660 (Div. 2) 题解</title>
    <link href="http://lemonaaaaa.com/2020/07/codeforces-round-660-div2/"/>
    <id>http://lemonaaaaa.com/2020/07/codeforces-round-660-div2/</id>
    <published>2020-07-31T02:54:10.000Z</published>
    <updated>2020-08-10T09:41:51.879Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="a-captain-flint-and-crew-recruitment"><a class="markdownIt-Anchor" href="#a-captain-flint-and-crew-recruitment"></a> A. Captain Flint and Crew Recruitment</h1><blockquote><p><a href="https://codeforces.com/contest/1388/problem/A" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文"><a class="markdownIt-Anchor" href="#题目原文"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1388A.jpg" alt="1388A" /></p><h2 id="题目大意"><a class="markdownIt-Anchor" href="#题目大意"></a> 题目大意</h2><p>如果一个数 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">x</span></span></span></span> 能够表示成两个不同质数的乘积，那我们就称 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">x</span></span></span></span> 为<code>nearly prime</code>。现给出 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span> ，求 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span> 能不能分解成 <span class="katex"><span class="katex-mathml"><math><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><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</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">3</span></span></span></span> 个是<code>nearly prime</code>？</p><h2 id="解题思路"><a class="markdownIt-Anchor" href="#解题思路"></a> 解题思路</h2><p>先考虑要求的3个<code>nearly prime</code>，因为要3个<font color="red">不同</font>的数，所以我们需要所有的数尽量小，否则和会超出n。最开始我的想法是直接取6、10、14、n-30，过样例就能发现n-30与前面三个数可能会重复，不满足题意。那直接考虑枚举哪三个质数，只要有不重复的并且和小于n，那就能满足题意。</p><h2 id="解法"><a class="markdownIt-Anchor" href="#解法"></a> 解法</h2><p>处理出一部分两两质数的积，枚举取哪三个质数，看n-三个质数是否大于0并且不与三个质数相等。</p><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n;</span><br><span class="line"><span class="keyword">int</span> num[<span class="number">10</span>]=&#123;<span class="number">0</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">5</span>,<span class="number">7</span>,<span class="number">11</span>,<span class="number">13</span>&#125;,a[maxn],tot=<span class="number">0</span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"a.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=<span class="number">6</span>;i++)</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=i+<span class="number">1</span>;j&lt;=<span class="number">6</span>;j++)</span><br><span class="line">a[++tot]=num[i]*num[j];</span><br><span class="line">sort(a+<span class="number">1</span>,a+tot+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line"><span class="keyword">bool</span> flag=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=tot;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=i+<span class="number">1</span>;j&lt;=tot;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> k=j+<span class="number">1</span>;k&lt;=tot;k++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(flag) <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">int</span> temp=n-a[i]-a[j]-a[k];</span><br><span class="line"><span class="keyword">if</span>(temp&lt;=<span class="number">0</span>) <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">if</span>(temp==a[i]||temp==a[j]||temp==a[k]) <span class="keyword">break</span>;</span><br><span class="line">flag=<span class="literal">true</span>;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"YES\n%d %d %d %d\n"</span>,a[i],a[j],a[k],temp);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!flag) <span class="built_in">printf</span>(<span class="string">"NO\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="b-captain-flint-and-a-long-voyage"><a class="markdownIt-Anchor" href="#b-captain-flint-and-a-long-voyage"></a> B. Captain Flint and a Long Voyage</h1><blockquote><p><a href="https://codeforces.com/contest/1388/problem/B" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-2"><a class="markdownIt-Anchor" href="#题目原文-2"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1388B.jpg" alt="1388B" /></p><h2 id="题目大意-2"><a class="markdownIt-Anchor" href="#题目大意-2"></a> 题目大意</h2><p>给出一个 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span> ，你需要确定一个<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>位的十进制数<span class="katex"><span class="katex-mathml"><math><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 mathdefault">x</span></span></span></span>，将<span class="katex"><span class="katex-mathml"><math><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 mathdefault">x</span></span></span></span>每一位写成二进制形式（要去掉前导零），再删去二进制的后<span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span>位，使得最后剩下的二进制最大。求<span class="katex"><span class="katex-mathml"><math><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 mathdefault">x</span></span></span></span>的最小可能值。</p><h2 id="解题思路-2"><a class="markdownIt-Anchor" href="#解题思路-2"></a> 解题思路</h2><p>根据样例以及初步分析，因为不能有前导零，并且二进制数必须要长。一位十进制数最多能表示成4位二进制数，分别是9(1001)和8(1000)。这样就很显然了，二进制前面n*3位全部是1001，后面n位全部是1000。</p><h2 id="解法-2"><a class="markdownIt-Anchor" href="#解法-2"></a> 解法</h2><p>确定一下多少个9，剩下补8。</p><h2 id="代码-2"><a class="markdownIt-Anchor" href="#代码-2"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"B.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line"><span class="keyword">int</span> res=n%<span class="number">4</span>;</span><br><span class="line"><span class="keyword">int</span> t=n-n/<span class="number">4</span>;</span><br><span class="line"><span class="keyword">if</span>(res) t--;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=t;i++) <span class="built_in">printf</span>(<span class="string">"9"</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=t+<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">printf</span>(<span class="string">"8"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="c-uncle-bogdan-and-country-happiness"><a class="markdownIt-Anchor" href="#c-uncle-bogdan-and-country-happiness"></a> C. Uncle Bogdan and Country Happiness</h1><blockquote><p><a href="https://codeforces.com/contest/1388/problem/C" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-3"><a class="markdownIt-Anchor" href="#题目原文-3"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1388C.jpg" alt="1388C" /></p><h2 id="题目大意-3"><a class="markdownIt-Anchor" href="#题目大意-3"></a> 题目大意</h2><p>给出一棵树，每个节点给出人数、不一定准确的心情值。每个人从1号节点出发，在路上可能有些人心情会从good变成bad。每个人沿着最短路径回到自己的节点，求每个节点给出的心情值是否可能都是准确的。（心情值=good人数-bad人数）</p><h2 id="解题思路-3"><a class="markdownIt-Anchor" href="#解题思路-3"></a> 解题思路</h2><p>直接dfs就行。</p><h2 id="解法-3"><a class="markdownIt-Anchor" href="#解法-3"></a> 解法</h2><p>对每一个点求出它和它的子树中的人数，然后根据这个人数和预估心情值就可以算出多少个人是好心情，多少个人是坏心情。</p><p>如果好心情人数算出来是以下情况，那必然不合法：</p><ul><li>是负数</li><li>是小数</li><li>比子树总人数大</li><li>比子树的好心情人数少</li></ul><p>就这样就过了。</p><h2 id="代码-3"><a class="markdownIt-Anchor" href="#代码-3"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> to,next;</span><br><span class="line">&#125; edge[maxn&lt;&lt;<span class="number">1</span>];</span><br><span class="line"><span class="keyword">int</span> head[maxn],k=<span class="number">0</span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> u,<span class="keyword">int</span> v)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">edge[++k].to=v;</span><br><span class="line">edge[k].next=head[u];</span><br><span class="line">head[u]=k;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> n,T;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> m,p[maxn],h[maxn],good[maxn],bad[maxn],size[maxn];</span><br><span class="line"><span class="keyword">bool</span> flag=<span class="literal">false</span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">dfs</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> fa)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">size[x]=p[x];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=head[x];i;i=edge[i].next)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(edge[i].to==fa) <span class="keyword">continue</span>;</span><br><span class="line">dfs(edge[i].to,x);</span><br><span class="line">size[x]+=size[edge[i].to];</span><br><span class="line">&#125;</span><br><span class="line">good[x]=size[x]+h[x];</span><br><span class="line"><span class="keyword">if</span>((good[x]&amp;<span class="number">1</span>)||good[x]&lt;<span class="number">0</span>) flag=<span class="literal">true</span>;</span><br><span class="line">good[x]&gt;&gt;=<span class="number">1</span>;</span><br><span class="line">bad[x]=size[x]-good[x];</span><br><span class="line"><span class="keyword">if</span>(bad[x]&lt;<span class="number">0</span>) flag=<span class="literal">true</span>;</span><br><span class="line"><span class="keyword">int</span> total_good=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=head[x];i;i=edge[i].next)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(edge[i].to==fa) <span class="keyword">continue</span>;</span><br><span class="line">total_good+=good[edge[i].to];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(good[x]&lt;total_good) flag=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"C.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="built_in">memset</span>(head,<span class="number">0</span>,<span class="keyword">sizeof</span>(head));</span><br><span class="line"><span class="built_in">memset</span>(good,<span class="number">0</span>,<span class="keyword">sizeof</span>(good));</span><br><span class="line"><span class="built_in">memset</span>(bad,<span class="number">0</span>,<span class="keyword">sizeof</span>(bad));</span><br><span class="line"><span class="built_in">memset</span>(size,<span class="number">0</span>,<span class="keyword">sizeof</span>(size));</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line">k=<span class="number">0</span>;flag=<span class="literal">false</span>;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%lld"</span>,&amp;n,&amp;m);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%lld"</span>,&amp;p[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%lld"</span>,&amp;h[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,x,y;i&lt;n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;x,&amp;y);</span><br><span class="line">add(x,y);add(y,x);</span><br><span class="line">&#125;</span><br><span class="line">dfs(<span class="number">1</span>,<span class="number">1</span>);</span><br><span class="line"><span class="keyword">if</span>(flag) <span class="built_in">printf</span>(<span class="string">"NO\n"</span>);</span><br><span class="line"><span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"YES\n"</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) head[i]=good[i]=bad[i]=size[i]=<span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="d-captain-flint-and-treasure"><a class="markdownIt-Anchor" href="#d-captain-flint-and-treasure"></a> D. Captain Flint and Treasure</h1><blockquote><p><a href="https://codeforces.com/contest/1388/problem/D" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-4"><a class="markdownIt-Anchor" href="#题目原文-4"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1388D.jpg" alt="1388D" /></p><h2 id="题目大意-4"><a class="markdownIt-Anchor" href="#题目大意-4"></a> 题目大意</h2><p>给出长度为n的a数组和b数组，一共操作n次（每个位置必须操作一次），若第i次选定位置i，则<code>ans+=a[i]</code>，并且<code>a[b[i]]+=a[i]</code>，确定一个操作顺序使得取出的ans最大，并输出操作顺序。</p><h2 id="解题思路-4"><a class="markdownIt-Anchor" href="#解题思路-4"></a> 解题思路</h2><p>题目中保证了不会出现环，并且<code>a[b[i]]+=a[i]</code>是单向操作，自然而然地就想到了有向图的拓扑排序，直接做DAG dp就好。</p><h2 id="解法-4"><a class="markdownIt-Anchor" href="#解法-4"></a> 解法</h2><p>从度数为0的点开始，如果当前值大于0，那么加到下一个点上就可以使下一个点更优（意义为先选这个点）；如果当前值小于0，那么加到下一个点会使结果更差，就不加（意义为先选下一个点，后选这个点）。最后输出方案按照拓扑序输出，见代码，应该很好理解。</p><h2 id="代码-4"><a class="markdownIt-Anchor" href="#代码-4"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> to,next;</span><br><span class="line">&#125; edge[maxn&lt;&lt;<span class="number">1</span>];</span><br><span class="line"><span class="keyword">int</span> k=<span class="number">0</span>,head[maxn];</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> u,<span class="keyword">int</span> v)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">edge[++k].to=v;</span><br><span class="line">edge[k].next=head[u];</span><br><span class="line">head[u]=k;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> n,a[maxn],degree[maxn],rd[maxn],p[maxn],tot=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans=<span class="number">0</span>,f[maxn];</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">toposort</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">queue</span>&lt;<span class="keyword">int</span>&gt; q;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line"><span class="keyword">if</span>(!rd[i]) q.push(i);</span><br><span class="line"><span class="keyword">while</span>(!q.empty())</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> x=q.front();q.pop();</span><br><span class="line">p[++tot]=x;</span><br><span class="line">ans+=f[x];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=head[x];i;i=edge[i].next)</span><br><span class="line">&#123;</span><br><span class="line">f[edge[i].to]+=max(<span class="number">0l</span>l,f[x]);</span><br><span class="line">rd[edge[i].to]--;</span><br><span class="line"><span class="keyword">if</span>(!rd[edge[i].to]) q.push(edge[i].to);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">memset</span>(f,<span class="number">0</span>,<span class="keyword">sizeof</span>(f));</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,b;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;b);</span><br><span class="line"><span class="keyword">if</span>(b==<span class="number">-1</span>) <span class="keyword">continue</span>;</span><br><span class="line">add(i,b);</span><br><span class="line">rd[b]++;</span><br><span class="line">degree[i]++;</span><br><span class="line">degree[b]++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) f[i]=(<span class="keyword">long</span> <span class="keyword">long</span>)a[i];</span><br><span class="line">toposort();</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="keyword">if</span>(f[p[i]]&gt;=<span class="number">0</span>) <span class="built_in">printf</span>(<span class="string">"%d "</span>,p[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=n;i;i--) <span class="keyword">if</span>(f[p[i]]&lt;<span class="number">0</span>) <span class="built_in">printf</span>(<span class="string">"%d "</span>,p[i]);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/standings/round-660.jpg" alt="round-660" /></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Codeforces" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/"/>
    
      <category term="Round" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/Round/"/>
    
    
      <category term="图论" scheme="http://lemonaaaaa.com/tags/%E5%9B%BE%E8%AE%BA/"/>
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
      <category term="contests" scheme="http://lemonaaaaa.com/tags/contests/"/>
    
      <category term="拓扑排序" scheme="http://lemonaaaaa.com/tags/%E6%8B%93%E6%89%91%E6%8E%92%E5%BA%8F/"/>
    
      <category term="模拟" scheme="http://lemonaaaaa.com/tags/%E6%A8%A1%E6%8B%9F/"/>
    
      <category term="思维" scheme="http://lemonaaaaa.com/tags/%E6%80%9D%E7%BB%B4/"/>
    
      <category term="树" scheme="http://lemonaaaaa.com/tags/%E6%A0%91/"/>
    
      <category term="最短路" scheme="http://lemonaaaaa.com/tags/%E6%9C%80%E7%9F%AD%E8%B7%AF/"/>
    
      <category term="枚举" scheme="http://lemonaaaaa.com/tags/%E6%9E%9A%E4%B8%BE/"/>
    
      <category term="dfs" scheme="http://lemonaaaaa.com/tags/dfs/"/>
    
  </entry>
  
  <entry>
    <title>OpenCV 3 第三章 学习笔记</title>
    <link href="http://lemonaaaaa.com/2020/06/opencv3-3/"/>
    <id>http://lemonaaaaa.com/2020/06/opencv3-3/</id>
    <published>2020-06-27T09:40:14.000Z</published>
    <updated>2020-06-27T09:40:14.758Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><center><font size="20px">HighGUI 图形用户界面初步</font></center><h1 id="图像的载入-显示和输出到文件"><a class="markdownIt-Anchor" href="#图像的载入-显示和输出到文件"></a> 图像的载入、显示和输出到文件</h1><h2 id="opencv-的命名空间"><a class="markdownIt-Anchor" href="#opencv-的命名空间"></a> OpenCV 的命名空间</h2><p><code>using namespace cv;</code></p><h2 id="mat-类"><a class="markdownIt-Anchor" href="#mat-类"></a> Mat 类</h2><p>Mat 类是用于保存图像以及其他矩阵数据的数据结构，默认情况下尺寸为0。我们也可以指定其初始尺寸。<br />如<code>cv::Mat pic(320,640,cv&quot;&quot;Scalar(100);</code>。</p><p>读取图片文件：<code>Mat scrImage = imread(&quot;src.jpg&quot;);</code></p><h2 id="图像载入imread函数"><a class="markdownIt-Anchor" href="#图像载入imread函数"></a> 图像载入（imread()函数）</h2><p>函数原型：<code>Mat imread( const String&amp; filename, int flags = IMREAD_COLOR );</code></p><ul><li>第一个参数，对应所需要载入的图片路径名<br>在Windows操作系统下，支持的文件格式如下：<br>1. Windows位图：bmp, dib ；<br>2. JPEG 文件： jpeg, jpg, jpe ；<br>3. JPEG 2000 文件：jp2 ；<br>4. PNG文件：png ；<br>5. 便携文件格式： pbm, pgm, ppm ；<br>6. Sun rasters 光栅文件： sr, ras ；<br>7. TIFF 文件： tiff, tif 。</li><li>第二个参数，为载入标识，它指定一个加载图像的颜色类型，由函数原型可以看到它自带默认值为 <code>IMREAD_COLOR</code> (值为1)，所以在调用时可以忽略这个参数。这个参数在OpenCV中标识图像格式的枚举体中取值。<br />枚举的定义如下：</li></ul><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> ImreadModes &#123;</span><br><span class="line">       IMREAD_UNCHANGED            = <span class="number">-1</span>, <span class="comment">//!&lt; If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation.</span></span><br><span class="line">       IMREAD_GRAYSCALE            = <span class="number">0</span>,  <span class="comment">//!&lt; If set, always convert image to the single channel grayscale image (codec internal conversion).</span></span><br><span class="line">       IMREAD_COLOR                = <span class="number">1</span>,  <span class="comment">//!&lt; If set, always convert image to the 3 channel BGR color image.</span></span><br><span class="line">       IMREAD_ANYDEPTH             = <span class="number">2</span>,  <span class="comment">//!&lt; If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.</span></span><br><span class="line">       IMREAD_ANYCOLOR             = <span class="number">4</span>,  <span class="comment">//!&lt; If set, the image is read in any possible color format.</span></span><br><span class="line">       IMREAD_LOAD_GDAL            = <span class="number">8</span>,  <span class="comment">//!&lt; If set, use the gdal driver for loading the image.</span></span><br><span class="line">       IMREAD_REDUCED_GRAYSCALE_2  = <span class="number">16</span>, <span class="comment">//!&lt; If set, always convert image to the single channel grayscale image and the image size reduced 1/2.</span></span><br><span class="line">       IMREAD_REDUCED_COLOR_2      = <span class="number">17</span>, <span class="comment">//!&lt; If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.</span></span><br><span class="line">       IMREAD_REDUCED_GRAYSCALE_4  = <span class="number">32</span>, <span class="comment">//!&lt; If set, always convert image to the single channel grayscale image and the image size reduced 1/4.</span></span><br><span class="line">       IMREAD_REDUCED_COLOR_4      = <span class="number">33</span>, <span class="comment">//!&lt; If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.</span></span><br><span class="line">       IMREAD_REDUCED_GRAYSCALE_8  = <span class="number">64</span>, <span class="comment">//!&lt; If set, always convert image to the single channel grayscale image and the image size reduced 1/8.</span></span><br><span class="line">       IMREAD_REDUCED_COLOR_8      = <span class="number">65</span>, <span class="comment">//!&lt; If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.</span></span><br><span class="line">       IMREAD_IGNORE_ORIENTATION   = <span class="number">128</span> <span class="comment">//!&lt; If set, do not rotate the image according to EXIF's orientation flag.</span></span><br><span class="line">     &#125;;</span><br></pre></td></tr></table></figure><p>所以默认载入三通道的彩色图像，其他参数用途在注释中也已明确。</p><ul><li>flags &gt; 0 : 返回一个3通道的彩色图像</li><li>flags = 0 : 返回灰度图像</li><li>flags &lt; 0 : 返回包含Alpha通道的加载图像</li></ul><p><code>Mat image0=imread(&quot;1.jpg&quot;, 2 | 4);</code> 载入无损的源图像<br /><code>Mat image1=imread(&quot;1.jpg&quot;, 0);</code> 载入灰度图<br /><code>Mat image2=imread(&quot;1.jpg&quot;, 199);</code> 载入3通道的彩色图像</p><h2 id="图像显示imshow函数"><a class="markdownIt-Anchor" href="#图像显示imshow函数"></a> 图像显示（imshow()函数）</h2><p><code>imshow()</code>函数用于在指定的窗口中显示一幅图像。<br />原型：<code>void imshow(const string&amp; winname, InputArray mat)</code></p><ul><li>第一个参数：填需要显示的窗口标识名称。</li><li>第二个参数：填需要显示的图像。</li></ul><p>如果窗口是用 <code>CV_WINDOW_AUTOSIZE</code> （默认值）标志创建的，那么显示图像原始大小。否则，将根据图像的深度进行缩放以适合窗口。</p><h2 id="创建窗口namedwindow函数"><a class="markdownIt-Anchor" href="#创建窗口namedwindow函数"></a> 创建窗口（namedWindow()函数）</h2><p><code>namedWindow</code>用于创建一个窗口。如果是简单地进行图片显示，则不用这个函数创建窗口。<font color="red">但如果需要在显示窗口之前就用到窗口名时</font>，就需要这个函数先创建出窗口，显式地规定窗口名称，比如指定滑动条依附在某个窗口上。</p><p>函数原型：<code>void namedWindow(const String&amp; winname, int flags = WINDOW_AUTOSIZE);</code></p><ul><li>第一个参数，填写被用作窗口的标识符的窗口名称</li><li>第二个参数，窗口的标识，其enum定义如下：</li></ul><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">enum</span> WindowFlags &#123;</span><br><span class="line">       WINDOW_NORMAL     = <span class="number">0x00000000</span>, <span class="comment">//!&lt; the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size.</span></span><br><span class="line">       WINDOW_AUTOSIZE   = <span class="number">0x00000001</span>, <span class="comment">//!&lt; the user cannot resize the window, the size is constrainted by the image displayed.</span></span><br><span class="line">       WINDOW_OPENGL     = <span class="number">0x00001000</span>, <span class="comment">//!&lt; window with opengl support.</span></span><br><span class="line"></span><br><span class="line">       WINDOW_FULLSCREEN = <span class="number">1</span>,          <span class="comment">//!&lt; change the window to fullscreen.</span></span><br><span class="line">       WINDOW_FREERATIO  = <span class="number">0x00000100</span>, <span class="comment">//!&lt; the image expends as much as it can (no ratio constraint).</span></span><br><span class="line">       WINDOW_KEEPRATIO  = <span class="number">0x00000000</span>, <span class="comment">//!&lt; the ratio of the image is respected.</span></span><br><span class="line">       WINDOW_GUI_EXPANDED=<span class="number">0x00000000</span>, <span class="comment">//!&lt; status bar and tool bar</span></span><br><span class="line">       WINDOW_GUI_NORMAL = <span class="number">0x00000010</span>, <span class="comment">//!&lt; old fashious way</span></span><br><span class="line">    &#125;;</span><br></pre></td></tr></table></figure><h2 id="输出图像到文件imwrite函数"><a class="markdownIt-Anchor" href="#输出图像到文件imwrite函数"></a> 输出图像到文件（imwrite()函数）</h2><p><code>imwrite()</code>函数用于输出图像到文件。</p><p>函数原型：<code>bool imwrite( const String&amp; filename, InputArray img, const std::vector&lt;int&gt;&amp; params = std::vector&lt;int&gt;());</code></p><ul><li>第一个参数，填需要写入的文件名，注意要带上后缀。</li><li>第二个参数，一般填一个Mat类型的图像数据。</li><li>第三个参数，标识为特定格式保存的参数编码，有默认值vector<int>，一般不用填写。如果要填写，需要了解以下内容：<br>1. 对于 JPEG 格式的图片，这个参数表示从0到100的图片质量，默认为95；<br>2. 对于 PNG 格式的图片，这个参数表示压缩级别，从0到9.较高的值意味着更小的尺寸和更长的压缩时间，默认值为3；<br>3. 对于 PPM, PGM 或 PBM 格式的图片，这个参数表示一个二进制格式标志，取值为0或1，默认值为1。</li></ul><p><code>imwrite</code>函数可保存的文件格式 和<code>imread</code>函数可读取格式相同。</p><h1 id="创建和使用滑动条"><a class="markdownIt-Anchor" href="#创建和使用滑动条"></a> 创建和使用滑动条</h1><p>滑动条可以动态调节参数，它依附于窗口而存在。</p><p>此外，OpenCV没有实现按钮的功能，所以很多时候，可以用仅含0和1的滑动条来实现按钮的按下和弹起效果。</p><h2 id="创建滑动条createtrackbar函数"><a class="markdownIt-Anchor" href="#创建滑动条createtrackbar函数"></a> 创建滑动条（createTrackbar()函数）</h2><p>此函数往往会和一个回调函数配合起来使用。</p><p>函数原型：<code>int createTrackbar(const String&amp; trackbarname, const String&amp; winname,int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0);</code></p><ul><li>第一个参数：轨迹条的名字。</li><li>第二个参数：窗口的名字，表示这个轨迹条会依附到哪个窗口上（对应前面用<code>namedWindow()</code>创建的窗口）。</li><li>第三个参数：一个指向整型的指针，表示滑块的位置。在创建时，滑块的初始位置就是该变量当前的值。</li><li>第四个参数：表示滑块可以达到的最大位置的值。滑块最小位置的值始终为0。</li><li>第五个参数：一个指向回调函数的指针，默认值为0。每次滑块位置改变时，这个函数都会进行回调。<br>回调函数的原型必须为<code>void XXXX(int, void*);</code>，其中第一个参数是轨迹条的位置，第二个参数是用户数据（见下面的第六个参数）。如果回调是NULL指针，则表示没有回调函数的调用，仅第三个参数value有变化。</li><li>第六个参数：void*类型的<code>userdata</code>，默认值为0。这个参数是用户传给回调函数的数据，用来处理轨迹条事件。如果使用的第三个参数的<code>value</code>是全局变量的话，完全可以不用管这个<code>userdata</code>参数。</li></ul><p><code>createTrackbar</code>函数要指定回调函数<code>onChange</code>，在轨迹条位置改变的时候来调用这个回调函数，并且创建的轨迹条显示在指定的<code>winname</code>所代表的窗口上。</p><p>示例代码：（Code by 毛星云）</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//--------------------------------------【程序说明】-------------------------------------------</span></span><br><span class="line"><span class="comment">//程序说明：《OpenCV3编程入门》OpenCV2版书本配套示例程序17</span></span><br><span class="line"><span class="comment">//程序描述：为程序界面添加滑动条</span></span><br><span class="line"><span class="comment">//开发测试所用IDE版本：Visual Studio 2010</span></span><br><span class="line"><span class="comment">//开发测试所用OpenCV版本：3.0 beta</span></span><br><span class="line"><span class="comment">//2014年11月 Created by @浅墨_毛星云</span></span><br><span class="line"><span class="comment">//2014年12月 Revised by @浅墨_毛星云</span></span><br><span class="line"><span class="comment">//------------------------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//---------------------------------【头文件、命名空间包含部分】-------------------------------</span></span><br><span class="line"><span class="comment">//描述：包含程序所使用的头文件和命名空间</span></span><br><span class="line"><span class="comment">//-------------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;opencv2/opencv.hpp&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;opencv2/highgui/highgui.hpp&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> cv;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">pragma</span> <span class="meta-keyword">warning</span>(disable:4996)</span></span><br><span class="line"><span class="comment">//-----------------------------------【宏定义部分】-------------------------------------------- </span></span><br><span class="line"><span class="comment">//  描述：定义一些辅助宏 </span></span><br><span class="line"><span class="comment">//------------------------------------------------------------------------------------------------ </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> WINDOW_NAME <span class="meta-string">"【滑动条的创建&amp;线性混合示例】"</span>        <span class="comment">//为窗口标题定义的宏 </span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//-----------------------------------【全局变量声明部分】--------------------------------------</span></span><br><span class="line"><span class="comment">//描述：全局变量声明</span></span><br><span class="line"><span class="comment">//-----------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> g_nMaxAlphaValue = <span class="number">100</span>;<span class="comment">//Alpha值的最大值</span></span><br><span class="line"><span class="keyword">int</span> g_nAlphaValueSlider;<span class="comment">//滑动条对应的变量</span></span><br><span class="line"><span class="keyword">double</span> g_dAlphaValue;</span><br><span class="line"><span class="keyword">double</span> g_dBetaValue;</span><br><span class="line"></span><br><span class="line"><span class="comment">//声明存储图像的变量</span></span><br><span class="line">Mat g_srcImage1;</span><br><span class="line">Mat g_srcImage2;</span><br><span class="line">Mat g_dstImage;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//-----------------------------------【on_Trackbar( )函数】--------------------------------</span></span><br><span class="line"><span class="comment">//描述：响应滑动条的回调函数</span></span><br><span class="line"><span class="comment">//------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">on_Trackbar</span><span class="params">(<span class="keyword">int</span>, <span class="keyword">void</span>*)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">//求出当前alpha值相对于最大值的比例</span></span><br><span class="line">g_dAlphaValue = (<span class="keyword">double</span>)g_nAlphaValueSlider / g_nMaxAlphaValue;</span><br><span class="line"><span class="comment">//则beta值为1减去alpha值</span></span><br><span class="line">g_dBetaValue = (<span class="number">1.0</span> - g_dAlphaValue);</span><br><span class="line"></span><br><span class="line"><span class="comment">//根据alpha和beta值进行线性混合</span></span><br><span class="line">addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, <span class="number">0.0</span>, g_dstImage);</span><br><span class="line"></span><br><span class="line"><span class="comment">//显示效果图</span></span><br><span class="line">imshow(WINDOW_NAME, g_dstImage);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//-----------------------------【ShowHelpText( )函数】--------------------------------------</span></span><br><span class="line"><span class="comment">//描述：输出帮助信息</span></span><br><span class="line"><span class="comment">//-------------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">//-----------------------------------【ShowHelpText( )函数】----------------------------------</span></span><br><span class="line"><span class="comment">//描述：输出一些帮助信息</span></span><br><span class="line"><span class="comment">//----------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowHelpText</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">//输出欢迎信息和OpenCV版本</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书！\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n\t\t\t此为本书OpenCV3版的第17个配套示例程序\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n\t\t\t   当前使用的OpenCV版本为："</span> CV_VERSION);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n  ----------------------------------------------------------------------------\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//--------------------------------------【main( )函数】-----------------------------------------</span></span><br><span class="line"><span class="comment">//描述：控制台应用程序的入口函数，我们的程序从这里开始执行</span></span><br><span class="line"><span class="comment">//-----------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span>** argv)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"></span><br><span class="line"><span class="comment">//显示帮助信息</span></span><br><span class="line">ShowHelpText();</span><br><span class="line"></span><br><span class="line"><span class="comment">//加载图像 (两图像的尺寸需相同)</span></span><br><span class="line">g_srcImage1 = imread(<span class="string">"1.jpg"</span>);</span><br><span class="line">g_srcImage2 = imread(<span class="string">"2.jpg"</span>);</span><br><span class="line"><span class="keyword">if</span> (!g_srcImage1.data) &#123; <span class="built_in">printf</span>(<span class="string">"读取第一幅图片错误，请确定目录下是否有imread函数指定图片存在~！ \n"</span>); <span class="keyword">return</span> <span class="number">-1</span>; &#125;</span><br><span class="line"><span class="keyword">if</span> (!g_srcImage2.data) &#123; <span class="built_in">printf</span>(<span class="string">"读取第二幅图片错误，请确定目录下是否有imread函数指定图片存在~！\n"</span>); <span class="keyword">return</span> <span class="number">-1</span>; &#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//设置滑动条初值为70</span></span><br><span class="line">g_nAlphaValueSlider = <span class="number">70</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//创建窗体</span></span><br><span class="line">namedWindow(WINDOW_NAME, <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//在创建的窗体中创建一个滑动条控件</span></span><br><span class="line"><span class="keyword">char</span> TrackbarName[<span class="number">50</span>];</span><br><span class="line"><span class="built_in">sprintf</span>(TrackbarName, <span class="string">"透明值 %d"</span>, g_nMaxAlphaValue);</span><br><span class="line"></span><br><span class="line">createTrackbar(TrackbarName, WINDOW_NAME, &amp;g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);</span><br><span class="line"></span><br><span class="line"><span class="comment">//结果在回调函数中显示</span></span><br><span class="line">on_Trackbar(g_nAlphaValueSlider, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//按任意键退出</span></span><br><span class="line">waitKey(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>运行效果：（分别为透明度0%、50%、100%的情况）<br /><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/opencv3-3/trackbar2.jpg" alt="trackbar2" /><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/opencv3-3/trackbar1.jpg" alt="trackbar1" /><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/opencv3-3/trackbar3.jpg" alt="trackbar3" /></p><h2 id="获取当前轨迹条的位置gettrackbarpos函数"><a class="markdownIt-Anchor" href="#获取当前轨迹条的位置gettrackbarpos函数"></a> 获取当前轨迹条的位置（getTrackbarPos()函数）</h2><p>函数原型：<code>int getTrackbarPos(const String&amp; trackbarname, const String&amp; winname);</code></p><ul><li>第一个参数：表示轨迹条的名字。</li><li>第二个参数：表示轨迹条的父窗口的名称。</li></ul><h1 id="鼠标操作"><a class="markdownIt-Anchor" href="#鼠标操作"></a> 鼠标操作</h1><p>和创建滑动条的函数类似，指定鼠标操作消息回调函数的函数为<code>setMouseCallback</code></p><p>函数原型：<code>setMouseCallback(const String&amp; winname, MouseCallback onMouse, void* userdata = 0);</code></p><ul><li>第一个参数：窗口的名字。</li><li>第二个参数：指定窗口里每次鼠标事件发生的时候，被调用的函数指针。<br>这个函数的原型大概是<code>void Foo(int event, int x, int y, int flags, void *param);</code>其中<code>event</code>变量enum值的定义见后文，x和y是<font color="red">鼠标</font>指针在图像坐标系中的坐标值，<code>flag</code>是的enum值的定义见后文。<code>param</code>是用户定义的传递到<code>setMouseCallback</code>函数调用的参数。</li><li>第三个参数：用户定义的传递到回调函数的参数，默认值为0。</li></ul><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//! Mouse Events see cv::MouseCallback</span></span><br><span class="line"><span class="keyword">enum</span> MouseEventTypes &#123;</span><br><span class="line">       EVENT_MOUSEMOVE      = <span class="number">0</span>, <span class="comment">//!&lt; indicates that the mouse pointer has moved over the window.</span></span><br><span class="line">       EVENT_LBUTTONDOWN    = <span class="number">1</span>, <span class="comment">//!&lt; indicates that the left mouse button is pressed.</span></span><br><span class="line">       EVENT_RBUTTONDOWN    = <span class="number">2</span>, <span class="comment">//!&lt; indicates that the right mouse button is pressed.</span></span><br><span class="line">       EVENT_MBUTTONDOWN    = <span class="number">3</span>, <span class="comment">//!&lt; indicates that the middle mouse button is pressed.</span></span><br><span class="line">       EVENT_LBUTTONUP      = <span class="number">4</span>, <span class="comment">//!&lt; indicates that left mouse button is released.</span></span><br><span class="line">       EVENT_RBUTTONUP      = <span class="number">5</span>, <span class="comment">//!&lt; indicates that right mouse button is released.</span></span><br><span class="line">       EVENT_MBUTTONUP      = <span class="number">6</span>, <span class="comment">//!&lt; indicates that middle mouse button is released.</span></span><br><span class="line">       EVENT_LBUTTONDBLCLK  = <span class="number">7</span>, <span class="comment">//!&lt; indicates that left mouse button is double clicked.</span></span><br><span class="line">       EVENT_RBUTTONDBLCLK  = <span class="number">8</span>, <span class="comment">//!&lt; indicates that right mouse button is double clicked.</span></span><br><span class="line">       EVENT_MBUTTONDBLCLK  = <span class="number">9</span>, <span class="comment">//!&lt; indicates that middle mouse button is double clicked.</span></span><br><span class="line">       EVENT_MOUSEWHEEL     = <span class="number">10</span>,<span class="comment">//!&lt; positive and negative values mean forward and backward scrolling, respectively.</span></span><br><span class="line">       EVENT_MOUSEHWHEEL    = <span class="number">11</span> <span class="comment">//!&lt; positive and negative values mean right and left scrolling, respectively.</span></span><br><span class="line">     &#125;;</span><br></pre></td></tr></table></figure><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//! Mouse Event Flags see cv::MouseCallback</span></span><br><span class="line"><span class="keyword">enum</span> MouseEventFlags &#123;</span><br><span class="line">       EVENT_FLAG_LBUTTON   = <span class="number">1</span>, <span class="comment">//!&lt; indicates that the left mouse button is down.</span></span><br><span class="line">       EVENT_FLAG_RBUTTON   = <span class="number">2</span>, <span class="comment">//!&lt; indicates that the right mouse button is down.</span></span><br><span class="line">       EVENT_FLAG_MBUTTON   = <span class="number">4</span>, <span class="comment">//!&lt; indicates that the middle mouse button is down.</span></span><br><span class="line">       EVENT_FLAG_CTRLKEY   = <span class="number">8</span>, <span class="comment">//!&lt; indicates that CTRL Key is pressed.</span></span><br><span class="line">       EVENT_FLAG_SHIFTKEY  = <span class="number">16</span>,<span class="comment">//!&lt; indicates that SHIFT Key is pressed.</span></span><br><span class="line">       EVENT_FLAG_ALTKEY    = <span class="number">32</span> <span class="comment">//!&lt; indicates that ALT Key is pressed.</span></span><br><span class="line">     &#125;;</span><br></pre></td></tr></table></figure><p>示例代码：（Code by 毛星云）</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//--------------------------------------【程序说明】-------------------------------------------</span></span><br><span class="line"><span class="comment">//程序说明：《OpenCV3编程入门》OpenCV2版书本配套示例程序18</span></span><br><span class="line"><span class="comment">//程序描述：HelloOpenCV</span></span><br><span class="line"><span class="comment">//开发测试所用IDE版本：Visual Studio 2010</span></span><br><span class="line"><span class="comment">//开发测试所用OpenCV版本：3.0 beta</span></span><br><span class="line"><span class="comment">//2014年11月 Created by @浅墨_毛星云</span></span><br><span class="line"><span class="comment">//2014年12月 Revised by @浅墨_毛星云</span></span><br><span class="line"><span class="comment">//------------------------------------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//---------------------------------【头文件、命名空间包含部分】-----------------------------</span></span><br><span class="line"><span class="comment">//描述：包含程序所使用的头文件和命名空间</span></span><br><span class="line"><span class="comment">//-------------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;opencv2/opencv.hpp&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> cv;</span><br><span class="line"></span><br><span class="line"><span class="comment">//-----------------------------------【宏定义部分】--------------------------------------------</span></span><br><span class="line"><span class="comment">//  描述：定义一些辅助宏 </span></span><br><span class="line"><span class="comment">//------------------------------------------------------------------------------------------------ </span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> WINDOW_NAME <span class="meta-string">"【程序窗口】"</span>        <span class="comment">//为窗口标题定义的宏 </span></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//-----------------------------------【全局函数声明部分】------------------------------------</span></span><br><span class="line"><span class="comment">//描述：全局函数的声明</span></span><br><span class="line"><span class="comment">//------------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">on_MouseHandle</span><span class="params">(<span class="keyword">int</span> event, <span class="keyword">int</span> x, <span class="keyword">int</span> y, <span class="keyword">int</span> flags, <span class="keyword">void</span>* param)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DrawRectangle</span><span class="params">(cv::Mat&amp; img, cv::Rect box)</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowHelpText</span><span class="params">()</span></span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//-----------------------------------【全局变量声明部分】-----------------------------------</span></span><br><span class="line"><span class="comment">//描述：全局变量的声明</span></span><br><span class="line"><span class="comment">//-----------------------------------------------------------------------------------------------</span></span><br><span class="line">Rect g_rectangle;</span><br><span class="line"><span class="keyword">bool</span> g_bDrawingBox = <span class="literal">false</span>;<span class="comment">//是否进行绘制</span></span><br><span class="line"><span class="function">RNG <span class="title">g_rng</span><span class="params">(<span class="number">12345</span>)</span></span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//-----------------------------------【main( )函数】--------------------------------------------</span></span><br><span class="line"><span class="comment">//描述：控制台应用程序的入口函数，我们的程序从这里开始执行</span></span><br><span class="line"><span class="comment">//-------------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">char</span>** argv)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">//【0】改变console字体颜色</span></span><br><span class="line">system(<span class="string">"color 9F"</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//【0】显示欢迎和帮助文字</span></span><br><span class="line">ShowHelpText();</span><br><span class="line"></span><br><span class="line"><span class="comment">//【1】准备参数</span></span><br><span class="line">g_rectangle = Rect(<span class="number">-1</span>, <span class="number">-1</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">Mat srcImage(600, 800, CV_8UC3), tempImage;</span><br><span class="line">srcImage.copyTo(tempImage);</span><br><span class="line">g_rectangle = Rect(<span class="number">-1</span>, <span class="number">-1</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">srcImage = Scalar::all(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">//【2】设置鼠标操作回调函数</span></span><br><span class="line">namedWindow(WINDOW_NAME);</span><br><span class="line">setMouseCallback(WINDOW_NAME, on_MouseHandle, (<span class="keyword">void</span>*)&amp;srcImage);</span><br><span class="line"></span><br><span class="line"><span class="comment">//【3】程序主循环，当进行绘制的标识符为真时，进行绘制</span></span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">srcImage.copyTo(tempImage);<span class="comment">//拷贝源图到临时变量</span></span><br><span class="line"><span class="keyword">if</span> (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle);<span class="comment">//当进行绘制的标识符为真，则进行绘制</span></span><br><span class="line">imshow(WINDOW_NAME, tempImage);</span><br><span class="line"><span class="keyword">if</span> (waitKey(<span class="number">10</span>) == <span class="number">27</span>) <span class="keyword">break</span>;<span class="comment">//按下ESC键，程序退出</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//--------------------------------【on_MouseHandle( )函数】-----------------------------</span></span><br><span class="line"><span class="comment">//描述：鼠标回调函数，根据不同的鼠标事件进行不同的操作</span></span><br><span class="line"><span class="comment">//-----------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">on_MouseHandle</span><span class="params">(<span class="keyword">int</span> event, <span class="keyword">int</span> x, <span class="keyword">int</span> y, <span class="keyword">int</span> flags, <span class="keyword">void</span>* param)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"></span><br><span class="line">Mat&amp; image = *(cv::Mat*) param;</span><br><span class="line"><span class="keyword">switch</span> (event)</span><br><span class="line">&#123;</span><br><span class="line"><span class="comment">//鼠标移动消息</span></span><br><span class="line"><span class="keyword">case</span> EVENT_MOUSEMOVE:</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (g_bDrawingBox)<span class="comment">//如果是否进行绘制的标识符为真，则记录下长和宽到RECT型变量中</span></span><br><span class="line">&#123;</span><br><span class="line">g_rectangle.width = x - g_rectangle.x;</span><br><span class="line">g_rectangle.height = y - g_rectangle.y;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//左键按下消息</span></span><br><span class="line"><span class="keyword">case</span> EVENT_LBUTTONDOWN:</span><br><span class="line">&#123;</span><br><span class="line">g_bDrawingBox = <span class="literal">true</span>;</span><br><span class="line">g_rectangle = Rect(x, y, <span class="number">0</span>, <span class="number">0</span>);<span class="comment">//记录起始点</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//左键抬起消息</span></span><br><span class="line"><span class="keyword">case</span> EVENT_LBUTTONUP:</span><br><span class="line">&#123;</span><br><span class="line">g_bDrawingBox = <span class="literal">false</span>;<span class="comment">//置标识符为false</span></span><br><span class="line"><span class="comment">//对宽和高小于0的处理</span></span><br><span class="line"><span class="keyword">if</span> (g_rectangle.width &lt; <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">g_rectangle.x += g_rectangle.width;</span><br><span class="line">g_rectangle.width *= <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (g_rectangle.height &lt; <span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">g_rectangle.y += g_rectangle.height;</span><br><span class="line">g_rectangle.height *= <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//调用函数进行绘制</span></span><br><span class="line">DrawRectangle(image, g_rectangle);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//-----------------------------------【DrawRectangle( )函数】------------------------------</span></span><br><span class="line"><span class="comment">//描述：自定义的矩形绘制函数</span></span><br><span class="line"><span class="comment">//-----------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">DrawRectangle</span><span class="params">(cv::Mat&amp; img, cv::Rect box)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">cv::rectangle(img, box.tl(), box.br(), cv::Scalar(g_rng.uniform(<span class="number">0</span>, <span class="number">255</span>), g_rng.uniform(<span class="number">0</span>, <span class="number">255</span>), g_rng.uniform(<span class="number">0</span>, <span class="number">255</span>)));<span class="comment">//随机颜色</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//-----------------------------------【ShowHelpText( )函数】-----------------------------</span></span><br><span class="line"><span class="comment">//          描述：输出一些帮助信息</span></span><br><span class="line"><span class="comment">//----------------------------------------------------------------------------------------------</span></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">ShowHelpText</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="comment">//输出欢迎信息和OpenCV版本</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书！\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n\t\t\t此为本书OpenCV3版的第18个配套示例程序\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n\t\t\t   当前使用的OpenCV版本为："</span> CV_VERSION);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n  ----------------------------------------------------------------------------\n"</span>);</span><br><span class="line"><span class="comment">//输出一些帮助信息</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n\n\t欢迎来到【鼠标交互演示】示例程序\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n\n\t请在窗口中点击鼠标左键并拖动以绘制矩形\n"</span>);</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>运行结果：<br /><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/opencv3-3/mouse.jpg" alt="mouse" /></p><h1 id="总结"><a class="markdownIt-Anchor" href="#总结"></a> 总结</h1><p>前面几张比较基础，学得比较细致。虽然现在还在入门，但是已经学到了许多其他的知识，比如C++的一些以前没有理解或者不知道的操作。学习，重在坚持，希望能够坚持下去。后面要看算法了，可能花在这上面的时间不会太多。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Computer Vision" scheme="http://lemonaaaaa.com/categories/Code-life/Computer-Vision/"/>
    
    
      <category term="计算机视觉" scheme="http://lemonaaaaa.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/"/>
    
      <category term="C++" scheme="http://lemonaaaaa.com/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>OpenCV 3 第一章 学习笔记</title>
    <link href="http://lemonaaaaa.com/2020/06/opencv3-1/"/>
    <id>http://lemonaaaaa.com/2020/06/opencv3-1/</id>
    <published>2020-06-26T07:52:52.000Z</published>
    <updated>2020-06-26T08:05:39.907Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="前言"><a class="markdownIt-Anchor" href="#前言"></a> 前言</h1><p>如果能够生活，那就好好生活。</p><p>如果能够学习，那就好好学习。</p><p>永远怀揣梦想，永远不要放弃。</p><h1 id="简述"><a class="markdownIt-Anchor" href="#简述"></a> 简述</h1><p>这一章主要是配置 OpenCV 和展示了一些示例，先敲出来感受一下。</p><p>与书配套的的 GitHub 仓库:<a href="https://github.com/QianMo/OpenCV3-Intro-Book-Src" target="_blank" rel="noopener">https://github.com/QianMo/OpenCV3-Intro-Book-Src</a></p><h1 id="图像腐蚀"><a class="markdownIt-Anchor" href="#图像腐蚀"></a> 图像腐蚀</h1><p>用图像中的暗色部分“腐蚀掉”图像中的高亮部分。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;opencv2\opencv.hpp&gt;  </span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> cv;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">Mat srcImage = imread(<span class="string">"2.jpg"</span>);  <span class="comment">//载入原图</span></span><br><span class="line">imshow(<span class="string">"src"</span>, srcImage);  <span class="comment">//显示原图</span></span><br><span class="line">Mat element = getStructuringElement(MORPH_RECT, Size(<span class="number">15</span>, <span class="number">15</span>));  <span class="comment">//进行腐蚀操作</span></span><br><span class="line">Mat dstImage;</span><br><span class="line">erode(srcImage, dstImage, element);  <span class="comment">//显示效果图</span></span><br><span class="line">imshow(<span class="string">"output"</span>, dstImage);</span><br><span class="line">waitKey(<span class="number">0</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/opencv3-1/fushi.jpg" alt="camera_canny" /></p><h1 id="摄像头操作"><a class="markdownIt-Anchor" href="#摄像头操作"></a> 摄像头操作</h1><p>通过摄像头调用来配合canny边缘检测，得到canny边缘检测并高斯模糊后的摄像头采集视频</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> <span class="meta-string">&lt;opencv2\opencv.hpp&gt;  </span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> cv;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="function">VideoCapture <span class="title">capture</span><span class="params">(<span class="number">0</span>)</span></span>;</span><br><span class="line">Mat edges;</span><br><span class="line"><span class="keyword">while</span> (<span class="number">1</span>)</span><br><span class="line">&#123;</span><br><span class="line">Mat frame;  <span class="comment">//用于存储每一帧的图像</span></span><br><span class="line">capture &gt;&gt; frame;  <span class="comment">//读取当前帧</span></span><br><span class="line">cvtColor(frame, edges, COLOR_BGR2GRAY);  <span class="comment">//转换BGR彩色图为灰度图像</span></span><br><span class="line">blur(edges, edges, Size(<span class="number">7</span>, <span class="number">7</span>));  <span class="comment">//进行模糊，使用3x3内核降噪</span></span><br><span class="line">Canny(edges, edges, <span class="number">0</span>, <span class="number">30</span>, <span class="number">3</span>);  <span class="comment">//进行canny边缘检测并显示</span></span><br><span class="line">imshow(<span class="string">"output"</span>, edges);  <span class="comment">//显示当前帧</span></span><br><span class="line"><span class="keyword">if</span> (waitKey(<span class="number">30</span>) &gt;= <span class="number">0</span>) <span class="keyword">break</span>;  <span class="comment">//延时30ms</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/opencv3-1/camera_canny.jpg" alt="camera_canny" /></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Computer Vision" scheme="http://lemonaaaaa.com/categories/Code-life/Computer-Vision/"/>
    
    
      <category term="计算机视觉" scheme="http://lemonaaaaa.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/"/>
    
      <category term="C++" scheme="http://lemonaaaaa.com/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>雨下整夜</title>
    <link href="http://lemonaaaaa.com/2020/05/music-2020520/"/>
    <id>http://lemonaaaaa.com/2020/05/music-2020520/</id>
    <published>2020-05-20T15:46:02.000Z</published>
    <updated>2020-05-20T15:57:28.190Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script>        <div id="aplayer-XGHXXbez" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;">            <pre class="aplayer-lrc-content"></pre>        </div>        <script>          var ap = new APlayer({            element: document.getElementById("aplayer-XGHXXbez"),            narrow: false,            autoplay: true,            showlrc: 3,            music: {              title: "七里香",              author: "周杰伦",              url: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/qilixiang.mp3",              pic: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/qilixiang.jpg",              lrc: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/qilixiang.lrc"            }          });          window.aplayers || (window.aplayers = []);          window.aplayers.push(ap);        </script><center>窗外的麻雀在电线杆上多嘴<br>你说这一句很有夏天的感觉<br>手中的铅笔在纸上来来回回<br>我用几行字形容你是我的谁<br>秋刀鱼的滋味猫跟你都想了解<br>初恋的香味就这样被我们寻回<br>那温暖的阳光像刚摘的鲜艳草莓<br>你说你舍不得吃掉这一种感觉<br>雨下整夜我的爱溢出就像雨水<br>院子落叶跟我的思念厚厚一叠<br>几句是非也无法将我的热情冷却<br>你出现在我诗的每一页<br>雨下整夜我的爱溢出就像雨水<br>窗台蝴蝶像诗里纷飞的美丽章节<br>我接着写<br>把永远爱你写进诗的结尾<br>你是我唯一想要的了解<br>雨下整夜我的爱溢出就像雨水<br>院子落叶跟我的思念厚厚一叠<br>几句是非也无法将我的热情冷却<br>你出现在我诗的每一页<br>那饱满的稻穗幸福了这个季节<br>而你的脸颊像田里熟透的蕃茄<br>你突然对我说七里香的名字很美<br>我此刻却只想亲吻你倔强的嘴<br>雨下整夜我的爱溢出就像雨水<br>院子落叶跟我的思念厚厚一叠<br>几句是非也无法将我的热情冷却<br>你出现在我诗的每一页<br>整夜我的爱溢出就像雨水<br>窗台蝴蝶像诗里纷飞的美丽章节<br>我接着写<br>把永远爱你写进诗的结尾<br>你是我唯一想要的了解<br></center>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Essay" scheme="http://lemonaaaaa.com/categories/Essay/"/>
    
      <category term="Others" scheme="http://lemonaaaaa.com/categories/Essay/Others/"/>
    
    
      <category term="music" scheme="http://lemonaaaaa.com/tags/music/"/>
    
      <category term="love" scheme="http://lemonaaaaa.com/tags/love/"/>
    
  </entry>
  
  <entry>
    <title>git pull 之后本地恢复到之前版本</title>
    <link href="http://lemonaaaaa.com/2020/05/git-pull-recall/"/>
    <id>http://lemonaaaaa.com/2020/05/git-pull-recall/</id>
    <published>2020-05-10T03:08:59.000Z</published>
    <updated>2020-05-10T03:18:55.322Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="第一步"><a class="markdownIt-Anchor" href="#第一步"></a> 第一步</h1><p><code>git reflog</code> 查看历史变更记录</p><h1 id="第二步"><a class="markdownIt-Anchor" href="#第二步"></a> 第二步</h1><p><code>git reset --hard HEAD@{n}</code> 回退到引用位置<code>n</code></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Tools" scheme="http://lemonaaaaa.com/categories/Code-life/Tools/"/>
    
    
      <category term="git" scheme="http://lemonaaaaa.com/tags/git/"/>
    
      <category term="github" scheme="http://lemonaaaaa.com/tags/github/"/>
    
      <category term="tools" scheme="http://lemonaaaaa.com/tags/tools/"/>
    
  </entry>
  
  <entry>
    <title>计算机系统基础 知识点梳理</title>
    <link href="http://lemonaaaaa.com/2020/05/introduction-to-computer-systems/"/>
    <id>http://lemonaaaaa.com/2020/05/introduction-to-computer-systems/</id>
    <published>2020-05-02T15:41:15.000Z</published>
    <updated>2020-05-04T04:05:58.602Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>计算机系统基础 第一章到第三章 知识点梳理</p>        <div id="aplayer-DTQrRexk" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;">            <pre class="aplayer-lrc-content"></pre>        </div>        <script>          var ap = new APlayer({            element: document.getElementById("aplayer-DTQrRexk"),            narrow: false,            autoplay: true,            showlrc: 3,            music: {              title: "蝴蝶之夏",              author: "房东的猫",              url: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/hudiezhixia.mp3",              pic: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/hudiezhixia.jpg",              lrc: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/hudiezhixia.lrc"            }          });          window.aplayers || (window.aplayers = []);          window.aplayers.push(ap);        </script><h1 id="center第一章-系统概述centerh1"><a class="markdownIt-Anchor" href="#center第一章-系统概述centerh1"></a> <center>第一章 系统概述</center></h1></h1><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/1-1.png" alt="1-1" /></p><p>这张图说的真的好，虽然和知识没有什么关系，最初看到也觉得没什么，但是学了大半学期再倒回来看这些话，我认为是十分正确的。同样的代码，不同的写法，效率可能差上成百上千倍。然后就是特别是通过<code>bomb lab</code>，做了之后我对整个C语言的理解都不一样了。知其然，更要知其所以然，可能这就是系统的魅力吧！</p><h2 id="为什么要学习计算机系统"><a class="markdownIt-Anchor" href="#为什么要学习计算机系统"></a> 为什么要学习计算机系统</h2><ul><li>为了编程序的时候少出错（逻辑性，准确性，内存溢出等）</li><li>为了在程序出错的时候很快找到出错的地方（gdb调试，或者直接查看汇编指令，找到错误）</li><li>为了明白程序是怎样在计算机上执行的（利用程序执行的原理，可以编写出更快的程序）</li><li>作为计算机专业的同学应该具有的底层意识。</li></ul><h2 id="计算机基本工作原理"><a class="markdownIt-Anchor" href="#计算机基本工作原理"></a> 计算机基本工作原理</h2><p>一些基本的概念。</p><h3 id="冯诺依曼体系"><a class="markdownIt-Anchor" href="#冯诺依曼体系"></a> 冯·诺依曼体系</h3><p>冯·诺依曼结构最重要的思想是<font color="red">存储程序</font>。</p><ol><li>计算机的基本部件：控制器、存储器、运算器、输入设备和输出设备。<s>（计导必考题目！！）</s></li><li><font color="red">存储器</font>不仅能存放数据，而且也能存放指令，形式上两者 没有区别，但计算机应能区分数据还是指令。</li><li><font color="red">控制器</font>应能自动取出指令来执行。</li><li><font color="red">运算器</font>应能进行加/减/乘/除四种基本算术运算，并且也 能进行一些逻辑运算和附加运算。</li><li>操作人员可以通过<font color="red">输入设备、输出设备</font>和主机进行通信。</li><li>内部以<font color="red">二进制表示</font>指令和数据。每条指令由<font color="red">操作码和地址码</font>两部分组成。操作码指出操作类型，地址码指出操作数的地址。由一串指令组成程序。</li><li>采用<font color="red">“存储程序”</font>工作方式。</li></ol><h3 id="计算机是如何工作的"><a class="markdownIt-Anchor" href="#计算机是如何工作的"></a> 计算机是如何工作的</h3><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/1-1-2.png" alt="1-1-2" /></p><p>图中的部件解释：</p><ul><li><code>CPU</code>：中央处理器</li><li><code>PC</code>：程序计数器</li><li><code>MAR</code>：存储器地址寄存器</li><li><code>ALU</code>：算术逻辑部件</li><li><code>IR</code>：指令寄存器</li><li><code>MDR</code>：存储器数据寄存器</li><li><code>GPRs</code>：通用寄存器组（由若干通用寄存器组成，早期就是累加器）</li></ul><p><font color="red">程序执行前：</font></p><p>数据和指令事先存放在存储器中，每条指令和每个数据都有地址，指令按序存放，指令由<code>OP</code>、<code>ADDR</code>字段组成，程序起始地址置<code>PC</code></p><p><font color="red">注意：</font></p><ol><li>程序启动前，指令和数据都存放在存储器中，<font color="red">形式上没有差别，都是0/1序列</font></li><li>采用”存储程序“工作方式：程序由指令组成，程序被启动后，计算机能自动取出一条一条指令执行，在执行过程中无需人的干预。</li><li><font color="red">指令中需要给出的信息：</font><br>(1) 操作性质（操作码）<br>(2) 源操作数1 或/和源操作数2（立即数、寄存器编号、存储地址）<br>(3) 目的操作数地址（寄存器编号、存储地址）</li></ol><p><font color="red">开始执行程序：</font></p><ul><li>第一步：根据<code>PC</code>取指令</li><li>第二步：指令译码</li><li>第三步：取操作数</li><li>第四步：指令执行</li><li>第五步：回写结果</li><li>第六步：修改<code>PC</code>的值</li><li>继续执行下一条指令</li></ul><h2 id="程序的开发和执行"><a class="markdownIt-Anchor" href="#程序的开发和执行"></a> 程序的开发和执行</h2><h3 id="机器语言"><a class="markdownIt-Anchor" href="#机器语言"></a> 机器语言</h3><p>机器语言就是0/1代码啦！在计算机科学导论中我们也动手写了图灵机的操作（虽然我们班好像没有要求，但因为某种原因我写过几份，现在回想起来也挺有趣的）。感觉机器语言和图灵机有点类似，通过读写纸带和打孔之类的。</p><p><font color="red">但是，如果要修改，或者打错了，那么就要从头再来，非常地崩溃，可读性也非常差。</font></p><h3 id="汇编语言"><a class="markdownIt-Anchor" href="#汇编语言"></a> 汇编语言</h3><ul><li>用助记符表示操作码</li><li>用标号表示位置</li><li>用助记符表示寄存器</li></ul><p>优点：</p><ul><li>不会因为增减指令而需要修改其他指令</li><li>不需记忆指令编码，编写方便</li><li>可读性比机器语言强</li></ul><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/1-2-2.png" alt="1-2-2" /></p><h3 id="高级语言"><a class="markdownIt-Anchor" href="#高级语言"></a> 高级语言</h3><ul><li>它们与具体机器结构无关</li><li>面向算法描述，比机器级语言描述能力强得多</li><li>高级语言中一条语句对应几条、几十条甚至几百条指令</li><li>有“面向过程”和“面向对象”的语言之分</li><li>处理逻辑分为三种结构：顺序结构、选择结构、循环结构</li><li>有两种转换方式：“编译”和“解释” <br>• 编译程序(Complier)：将高级语言源程序转换为机器级目标程序，执行时只要启动目标程序即可，比如C++、C、Java等<br>• 解释程序(Interpreter )：将高级语言语句逐条翻译成机器指令并立即执行，不生成目标文件，比如Python等</li></ul><h3 id="源代码的处理"><a class="markdownIt-Anchor" href="#源代码的处理"></a> 源代码的处理</h3><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/1-2-3-1.png" alt="1-2-3-1" /></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/1-2-3-2.png" alt="1-2-3-2" /></p><h2 id="计算机的层次结构"><a class="markdownIt-Anchor" href="#计算机的层次结构"></a> 计算机的层次结构</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/1-3-1.png" alt="1-3-1" /></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/1-3-2.png" alt="1-3-2" /></p><h2 id="计算机性能的定义"><a class="markdownIt-Anchor" href="#计算机性能的定义"></a> 计算机性能的定义</h2><p>这部分在书上有，mooc上没有。其主要指标为<code>吞吐率(throughput)</code>和<code>响应时间(response time)</code></p><ol><li>吞吐率：在单位时间内所完成的工作量。</li><li>响应时间：从作业提交开始到作业完成所用的时间。</li></ol><h1 id="center第二章-数据的机器级表示与处理center"><a class="markdownIt-Anchor" href="#center第二章-数据的机器级表示与处理center"></a> <center>第二章 数据的机器级表示与处理</center></h1><h2 id="数制和编码"><a class="markdownIt-Anchor" href="#数制和编码"></a> 数制和编码</h2><ul><li>十进制、二进制、十六进制、八进制……</li><li>定/浮点表示</li></ul><h3 id="数制"><a class="markdownIt-Anchor" href="#数制"></a> 数制</h3><ol><li>十进制(Decimal)：结尾加<code>D</code>表示。</li><li>二进制(Binary)：结尾加<code>B</code>表示。</li><li>八进制(Octal)：结尾加<code>O</code>表示。</li><li>十六进制(Hexadecimal)：结尾加<code>H</code>表示或者前缀加<code>0x</code>表示。</li></ol><p>进制转换：</p><p>整数部分：除基取余，上左下右<br />小数部分：乘基取整，上左下右</p><h3 id="定点数和浮点数"><a class="markdownIt-Anchor" href="#定点数和浮点数"></a> 定点数和浮点数</h3><p>计算机中只能通过约定小数点的位置来表示小数点</p><ul><li>小数点位置约定在固定位置的数称为定点数</li><li>小数点位置约定为可浮动的数称为浮点数</li></ul><p>实数的定义：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>X</mi><mo>=</mo><mo stretchy="false">(</mo><mo>−</mo><mn>1</mn><msup><mo stretchy="false">)</mo><mi>s</mi></msup><mo>×</mo><mi>M</mi><mo>×</mo><msup><mi>R</mi><mi>E</mi></msup></mrow><annotation encoding="application/x-tex">X=(-1)^s \times M \times R^E</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 mathdefault" style="margin-right:0.07847em;">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="mopen">(</span><span class="mord">−</span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.664392em;"><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 mathdefault mtight">s</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.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" 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.8413309999999999em;vertical-align:0em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413309999999999em;"><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 mathdefault mtight" style="margin-right:0.05764em;">E</span></span></span></span></span></span></span></span></span></span></span><br />其中<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05764em;">S</span></span></span></span>取值为<span class="katex"><span class="katex-mathml"><math><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><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><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 mathdefault" style="margin-right:0.07847em;">X</span></span></span></span>的符号；<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.10903em;">M</span></span></span></span>是尾数，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</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 mathdefault" style="margin-right:0.05764em;">E</span></span></span></span>是阶/指数。<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>R</mi></mrow><annotation encoding="application/x-tex">R</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 mathdefault" style="margin-right:0.00773em;">R</span></span></span></span>是基数。</p><h3 id="定点数的编码"><a class="markdownIt-Anchor" href="#定点数的编码"></a> 定点数的编码</h3><p>原码、补码、移码、反码</p><ol><li>原码：最高位的<span class="katex"><span class="katex-mathml"><math><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><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><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><semantics><mrow><mi>a</mi><mo>&lt;</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">a&lt;b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span>时候，实现<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>−</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">a-b</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 mathdefault">a</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.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span>比较困难。</li><li>补码（从50年代以来整数采用的编码方式）：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mi>X</mi><msub><mo stretchy="false">]</mo><mtext>补</mtext></msub><mo>=</mo><msup><mn>2</mn><mi>n</mi></msup><mo>+</mo><mi>X</mi></mrow><annotation encoding="application/x-tex">[X]_\text{补}=2^n + X</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 mathdefault" style="margin-right:0.07847em;">X</span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><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 text mtight"><span class="mord cjk_fallback mtight">补</span></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.747722em;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.664392em;"><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 mathdefault mtight">n</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07847em;">X</span></span></span></span>。同时补码实现了加和减的统一。<br>结论一：一个负数的补码等于<font color="red">模减该负数的绝对值</font><br>结论二：对于某一确定的模，某数减去小于模的另一数，总可以用该数加上另一数负数的补码来代替<font color="red">实现了加法和减法的统一</font>。 <br><font color="red">变形补码</font>：采用双符号位存放可能溢出的中间结果。<br>负数的补码的简便求法：从右至左遇到的第一个<span class="katex"><span class="katex-mathml"><math><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><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>）</li><li>移码：<font color="red">将每一个数值加上一个偏置常数<code>bias</code>。</font><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-1-3-1.png" alt="2-1-3-1" /></li><li>反码：直接将二进制按位取反，一般没什么用。</li></ol><h2 id="c语言中的数"><a class="markdownIt-Anchor" href="#c语言中的数"></a> C语言中的数</h2><h3 id="整数"><a class="markdownIt-Anchor" href="#整数"></a> 整数</h3><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-2-1-1.png" alt="2-2-1-1" /></p><p>其中整数类型分为带符号整数和无符号整数。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-2-1-2.png" alt="2-2-1-2" /></p><p>整数表示比较简单，大概熟悉C语言的程序员都掌握的比较好。</p><h3 id="浮点数"><a class="markdownIt-Anchor" href="#浮点数"></a> 浮点数</h3><p>浮点数的表示就很复杂了，编码上有许多细节。</p><p>首先是对科学计数法的概念：</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-2-2-1.png" alt="2-2-2-1" /></p><ul><li>浮点数的表示范围：</li></ul><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-2-2-2.png" alt="2-2-2-2" /></p><p>第0位数符S；第1-8位为8位移码表示阶码<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">E</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 mathdefault" style="margin-right:0.05764em;">E</span></span></span></span>（偏置常数为128）<br />第9～31位为24位二进制原码小数表示的尾数<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.10903em;">M</span></span></span></span>。规格化尾数的小数点后第一位总是1，故规定第一位默认的“1”不明显表示出来。这样可用23个 数位表示24位尾数</p><p>最大正数：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>0.11</mn><mo>…</mo><mn>1</mn><mo>×</mo><msup><mn>2</mn><mrow><mn>11</mn><mo>…</mo><mn>11</mn></mrow></msup><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>24</mn></mrow></msup><mo stretchy="false">)</mo><mo>×</mo><msup><mn>2</mn><mn>127</mn></msup></mrow><annotation encoding="application/x-tex">0.11 \dots 1 \times 2^{11 \dots 11} = (1-2^{-24}) \times 2 ^{127}</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">0</span><span class="mord">.</span><span class="mord">1</span><span class="mord">1</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="mord">1</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"><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">1</span><span class="minner mtight">…</span><span class="mord mtight">1</span><span class="mord mtight">1</span></span></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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</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:1.064108em;vertical-align:-0.25em;"></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">−</span><span class="mord mtight">2</span><span class="mord mtight">4</span></span></span></span></span></span></span></span></span><span class="mclose">)</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"><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">2</span><span class="mord mtight">7</span></span></span></span></span></span></span></span></span></span></span></span><br />最小正数：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>0.10</mn><mo>…</mo><mn>0</mn><mo>×</mo><msup><mn>2</mn><mrow><mn>00</mn><mo>…</mo><mn>0</mn></mrow></msup><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mi mathvariant="normal">/</mi><mn>2</mn><mo stretchy="false">)</mo><mo>×</mo><msup><mn>2</mn><mrow><mo>−</mo><mn>128</mn></mrow></msup></mrow><annotation encoding="application/x-tex">0.10 \dots 0 \times 2^{00 \dots 0} = (1/2) \times 2^{-128}</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">0</span><span class="mord">.</span><span class="mord">1</span><span class="mord">0</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="mord">0</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"><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">0</span><span class="mord mtight">0</span><span class="minner mtight">…</span><span class="mord mtight">0</span></span></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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mord">/</span><span class="mord">2</span><span class="mclose">)</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"><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">−</span><span class="mord mtight">1</span><span class="mord mtight">2</span><span class="mord mtight">8</span></span></span></span></span></span></span></span></span></span></span></span></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-2-2-3.png" alt="2-2-2-3" /></p><ul><li>IEEE 754 标准<font color="red">(重点)</font></li></ul><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-2-2-4.png" alt="2-2-2-4" /></p><ul><li>规格化数</li></ul><table><thead><tr><th style="text-align:center">Exponent</th><th style="text-align:center">Significand</th><th style="text-align:center"></th></tr></thead><tbody><tr><td style="text-align:center">1-254</td><td style="text-align:center">任意小数点前隐含1</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">+/-0</td></tr><tr><td style="text-align:center">255</td><td style="text-align:center">0</td><td style="text-align:center">+/-inf</td></tr><tr><td style="text-align:center">255</td><td style="text-align:center">nonzero</td><td style="text-align:center">NaN</td></tr></tbody></table><ul><li>非规格化数</li></ul><p>当 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>E</mi><mi>x</mi><mi>p</mi><mi>o</mi><mi>n</mi><mi>e</mi><mi>n</mi><mi>t</mi><mo>=</mo><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">Exponent == 0</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 mathdefault" style="margin-right:0.05764em;">E</span><span class="mord mathdefault">x</span><span class="mord mathdefault">p</span><span class="mord mathdefault">o</span><span class="mord mathdefault">n</span><span class="mord mathdefault">e</span><span class="mord mathdefault">n</span><span class="mord mathdefault">t</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></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><semantics><mrow><mi>S</mi><mi>i</mi><mi>g</mi><mi>n</mi><mi>i</mi><mi>f</mi><mi>i</mi><mi>c</mi><mi>a</mi><mi>n</mi><mi>d</mi><mo stretchy="false">!</mo><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">Significand != 0</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 mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.03588em;">g</span><span class="mord mathdefault">n</span><span class="mord mathdefault">i</span><span class="mord mathdefault" style="margin-right:0.10764em;">f</span><span class="mord mathdefault">i</span><span class="mord mathdefault">c</span><span class="mord mathdefault">a</span><span class="mord mathdefault">n</span><span class="mord mathdefault">d</span><span class="mclose">!</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> 时，用来表示非规格化数。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-2-2-5.png" alt="2-2-2-5" /></p><h2 id="非数值表示"><a class="markdownIt-Anchor" href="#非数值表示"></a> 非数值表示</h2><h3 id="西文字符"><a class="markdownIt-Anchor" href="#西文字符"></a> 西文字符</h3><p><font color="red"><center>ASCII控制字符</center></font></p><table width="100%" border="0" cellpadding="0" cellspacing="0" class="bx"><thead><tr valign="bottom"><th>二进制</th><th>十进制</th><th>十六进制</th><th>缩写</th><th>可以显示的表示法</th><th>名称/意义</th></tr></thead><tbody><tr><td>0000&nbsp;0000</td><td align="center">0</td><td align="center">00</td><td align="center">NUL</td><td align="center" class="xianshi">␀</td><td>空字符（Null）</td></tr><tr><td>0000&nbsp;0001</td><td align="center">1</td><td align="center">01</td><td align="center">SOH</td><td align="center" class="xianshi">␁</td><td>标题开始</td></tr><tr><td>0000&nbsp;0010</td><td align="center">2</td><td align="center">02</td><td align="center">STX</td><td align="center" class="xianshi">␂</td><td>本文开始</td></tr><tr><td>0000&nbsp;0011</td><td align="center">3</td><td align="center">03</td><td align="center">ETX</td><td align="center" class="xianshi">␃</td><td>本文结束</td></tr><tr><td>0000&nbsp;0100</td><td align="center">4</td><td align="center">04</td><td align="center">EOT</td><td align="center" class="xianshi">␄</td><td>传输结束</td></tr><tr><td>0000&nbsp;0101</td><td align="center">5</td><td align="center">05</td><td align="center">ENQ</td><td align="center" class="xianshi">␅</td><td>请求</td></tr><tr><td>0000&nbsp;0110</td><td align="center">6</td><td align="center">06</td><td align="center">ACK</td><td align="center" class="xianshi">␆</td><td>确认回应</td></tr><tr><td>0000&nbsp;0111</td><td align="center">7</td><td align="center">07</td><td align="center">BEL</td><td align="center" class="xianshi">␇</td><td>响铃</td></tr><tr><td>0000&nbsp;1000</td><td align="center">8</td><td align="center">08</td><td align="center">BS</td><td align="center" class="xianshi">␈</td><td>退格</td></tr><tr><td>0000&nbsp;1001</td><td align="center">9</td><td align="center">09</td><td align="center">HT</td><td align="center" class="xianshi">␉</td><td>水平定位符号</td></tr><tr><td>0000&nbsp;1010</td><td align="center">10</td><td align="center">0A</td><td align="center">LF</td><td align="center" class="xianshi">␊</td><td>换行键</td></tr><tr><td>0000&nbsp;1011</td><td align="center">11</td><td align="center">0B</td><td align="center">VT</td><td align="center" class="xianshi">␋</td><td>垂直定位符号</td></tr><tr><td>0000&nbsp;1100</td><td align="center">12</td><td align="center">0C</td><td align="center">FF</td><td align="center" class="xianshi">␌</td><td>换页键</td></tr><tr><td>0000&nbsp;1101</td><td align="center">13</td><td align="center">0D</td><td align="center">CR</td><td align="center" class="xianshi">␍</td><td>归位键</td></tr><tr><td>0000&nbsp;1110</td><td align="center">14</td><td align="center">0E</td><td align="center">SO</td><td align="center" class="xianshi">␎</td><td>取消变换（Shift out）</td></tr><tr><td>0000&nbsp;1111</td><td align="center">15</td><td align="center">0F</td><td align="center">SI</td><td align="center" class="xianshi">␏</td><td>启用变换（Shift in）</td></tr><tr><td>0001&nbsp;0000</td><td align="center">16</td><td align="center">10</td><td align="center">DLE</td><td align="center" class="xianshi">␐</td><td>跳出数据通讯</td></tr><tr><td>0001&nbsp;0001</td><td align="center">17</td><td align="center">11</td><td align="center">DC1</td><td align="center" class="xianshi">␑</td><td>设备控制一（XON 启用软件速度控制）</td></tr><tr><td>0001&nbsp;0010</td><td align="center">18</td><td align="center">12</td><td align="center">DC2</td><td align="center" class="xianshi">␒</td><td>设备控制二</td></tr><tr><td>0001&nbsp;0011</td><td align="center">19</td><td align="center">13</td><td align="center">DC3</td><td align="center" class="xianshi">␓</td><td>设备控制三（XOFF 停用软件速度控制）</td></tr><tr><td>0001&nbsp;0100</td><td align="center">20</td><td align="center">14</td><td align="center">DC4</td><td align="center" class="xianshi">␔</td><td>设备控制四</td></tr><tr><td>0001&nbsp;0101</td><td align="center">21</td><td align="center">15</td><td align="center">NAK</td><td align="center" class="xianshi">␕</td><td>确认失败回应</td></tr><tr><td>0001&nbsp;0110</td><td align="center">22</td><td align="center">16</td><td align="center">SYN</td><td align="center" class="xianshi">␖</td><td>同步用暂停</td></tr><tr><td>0001&nbsp;0111</td><td align="center">23</td><td align="center">17</td><td align="center">ETB</td><td align="center" class="xianshi">␗</td><td>区块传输结束</td></tr><tr><td>0001&nbsp;1000</td><td align="center">24</td><td align="center">18</td><td align="center">CAN</td><td align="center" class="xianshi">␘</td><td>取消</td></tr><tr><td>0001&nbsp;1001</td><td align="center">25</td><td align="center">19</td><td align="center">EM</td><td align="center" class="xianshi">␙</td><td>连接介质中断</td></tr><tr><td>0001&nbsp;1010</td><td align="center">26</td><td align="center">1A</td><td align="center">SUB</td><td align="center" class="xianshi">␚</td><td>替换</td></tr><tr><td>0001&nbsp;1011</td><td align="center">27</td><td align="center">1B</td><td align="center">ESC</td><td align="center" class="xianshi">␛</td><td>跳出</td></tr><tr><td>0001&nbsp;1100</td><td align="center">28</td><td align="center">1C</td><td align="center">FS</td><td align="center" class="xianshi">␜</td><td>文件分割符</td></tr><tr><td>0001&nbsp;1101</td><td align="center">29</td><td align="center">1D</td><td align="center">GS</td><td align="center" class="xianshi">␝</td><td>组群分隔符</td></tr><tr><td>0001&nbsp;1110</td><td align="center">30</td><td align="center">1E</td><td align="center">RS</td><td align="center" class="xianshi">␞</td><td>记录分隔符</td></tr><tr><td>0001&nbsp;1111</td><td align="center">31</td><td align="center">1F</td><td align="center">US</td><td align="center" class="xianshi">␟</td><td>单元分隔符</td></tr><tr><td>0111&nbsp;1111</td><td align="center">127</td><td align="center">7F</td><td align="center">DEL</td><td align="center" class="xianshi">␡</td><td>删除</td></tr></tbody></table><p><font color="red"><center>ASCII可显示字符</center></font></p><table width="100%" border="0" cellspacing="0" cellpadding="0"><tbody><tr valign="top"><td><table width="100%" border="0" cellpadding="0" cellspacing="0" class="bx"><thead><tr valign="bottom"><th>二进制</th><th>十进制</th><th>十六进制</th><th>图形</th></tr></thead><tbody><tr><td>0010&nbsp;0000</td><td align="center">32</td><td align="center">20</td><td align="center">（空格）(␠)</td></tr><tr><td>0010&nbsp;0001</td><td align="center">33</td><td align="center">21</td><td align="center">!</td></tr><tr><td>0010&nbsp;0010</td><td align="center">34</td><td align="center">22</td><td align="center">"</td></tr><tr><td>0010&nbsp;0011</td><td align="center">35</td><td align="center">23</td><td align="center">#</td></tr><tr><td>0010&nbsp;0100</td><td align="center">36</td><td align="center">24</td><td align="center">$</td></tr><tr><td>0010&nbsp;0101</td><td align="center">37</td><td align="center">25</td><td align="center">&nbsp;%</td></tr><tr><td>0010&nbsp;0110</td><td align="center">38</td><td align="center">26</td><td align="center">&amp;</td></tr><tr><td>0010&nbsp;0111</td><td align="center">39</td><td align="center">27</td><td align="center">'</td></tr><tr><td>0010&nbsp;1000</td><td align="center">40</td><td align="center">28</td><td align="center">(</td></tr><tr><td>0010&nbsp;1001</td><td align="center">41</td><td align="center">29</td><td align="center">)</td></tr><tr><td>0010&nbsp;1010</td><td align="center">42</td><td align="center">2A</td><td align="center">*</td></tr><tr><td>0010&nbsp;1011</td><td align="center">43</td><td align="center">2B</td><td align="center">+</td></tr><tr><td>0010&nbsp;1100</td><td align="center">44</td><td align="center">2C</td><td align="center">,</td></tr><tr><td>0010&nbsp;1101</td><td align="center">45</td><td align="center">2D</td><td align="center">-</td></tr><tr><td>0010&nbsp;1110</td><td align="center">46</td><td align="center">2E</td><td align="center">.</td></tr><tr><td>0010&nbsp;1111</td><td align="center">47</td><td align="center">2F</td><td align="center">/</td></tr><tr><td>0011&nbsp;0000</td><td align="center">48</td><td align="center">30</td><td align="center">0</td></tr><tr><td>0011&nbsp;0001</td><td align="center">49</td><td align="center">31</td><td align="center">1</td></tr><tr><td>0011&nbsp;0010</td><td align="center">50</td><td align="center">32</td><td align="center">2</td></tr><tr><td>0011&nbsp;0011</td><td align="center">51</td><td align="center">33</td><td align="center">3</td></tr><tr><td>0011&nbsp;0100</td><td align="center">52</td><td align="center">34</td><td align="center">4</td></tr><tr><td>0011&nbsp;0101</td><td align="center">53</td><td align="center">35</td><td align="center">5</td></tr><tr><td>0011&nbsp;0110</td><td align="center">54</td><td align="center">36</td><td align="center">6</td></tr><tr><td>0011&nbsp;0111</td><td align="center">55</td><td align="center">37</td><td align="center">7</td></tr><tr><td>0011&nbsp;1000</td><td align="center">56</td><td align="center">38</td><td align="center">8</td></tr><tr><td>0011&nbsp;1001</td><td align="center">57</td><td align="center">39</td><td align="center">9</td></tr><tr><td>0011&nbsp;1010</td><td align="center">58</td><td align="center">3A</td><td align="center">:</td></tr><tr><td>0011&nbsp;1011</td><td align="center">59</td><td align="center">3B</td><td align="center">;</td></tr><tr><td>0011&nbsp;1100</td><td align="center">60</td><td align="center">3C</td><td align="center">&lt;</td></tr><tr><td>0011&nbsp;1101</td><td align="center">61</td><td align="center">3D</td><td align="center">=</td></tr><tr><td>0011&nbsp;1110</td><td align="center">62</td><td align="center">3E</td><td align="center">&gt;</td></tr><tr><td>0011&nbsp;1111</td><td align="center">63</td><td align="center">3F</td><td align="center">?</td></tr></tbody></table></td><td>&nbsp;</td><td><table width="100%" border="0" cellpadding="0" cellspacing="0" class="bx"><thead><tr valign="bottom"><th>二进制</th><th>十进制</th><th>十六进制</th><th>图形</th></tr></thead><tbody><tr><td>0100&nbsp;0000</td><td align="center">64</td><td align="center">40</td><td align="center">@</td></tr><tr><td>0100&nbsp;0001</td><td align="center">65</td><td align="center">41</td><td align="center">A</td></tr><tr><td>0100&nbsp;0010</td><td align="center">66</td><td align="center">42</td><td align="center">B</td></tr><tr><td>0100&nbsp;0011</td><td align="center">67</td><td align="center">43</td><td align="center">C</td></tr><tr><td>0100&nbsp;0100</td><td align="center">68</td><td align="center">44</td><td align="center">D</td></tr><tr><td>0100&nbsp;0101</td><td align="center">69</td><td align="center">45</td><td align="center">E</td></tr><tr><td>0100&nbsp;0110</td><td align="center">70</td><td align="center">46</td><td align="center">F</td></tr><tr><td>0100&nbsp;0111</td><td align="center">71</td><td align="center">47</td><td align="center">G</td></tr><tr><td>0100&nbsp;1000</td><td align="center">72</td><td align="center">48</td><td align="center">H</td></tr><tr><td>0100&nbsp;1001</td><td align="center">73</td><td align="center">49</td><td align="center">I</td></tr><tr><td>0100&nbsp;1010</td><td align="center">74</td><td align="center">4A</td><td align="center">J</td></tr><tr><td>0100&nbsp;1011</td><td align="center">75</td><td align="center">4B</td><td align="center">K</td></tr><tr><td>0100&nbsp;1100</td><td align="center">76</td><td align="center">4C</td><td align="center">L</td></tr><tr><td>0100&nbsp;1101</td><td align="center">77</td><td align="center">4D</td><td align="center">M</td></tr><tr><td>0100&nbsp;1110</td><td align="center">78</td><td align="center">4E</td><td align="center">N</td></tr><tr><td>0100&nbsp;1111</td><td align="center">79</td><td align="center">4F</td><td align="center">O</td></tr><tr><td>0101&nbsp;0000</td><td align="center">80</td><td align="center">50</td><td align="center">P</td></tr><tr><td>0101&nbsp;0001</td><td align="center">81</td><td align="center">51</td><td align="center">Q</td></tr><tr><td>0101&nbsp;0010</td><td align="center">82</td><td align="center">52</td><td align="center">R</td></tr><tr><td>0101&nbsp;0011</td><td align="center">83</td><td align="center">53</td><td align="center">S</td></tr><tr><td>0101&nbsp;0100</td><td align="center">84</td><td align="center">54</td><td align="center">T</td></tr><tr><td>0101&nbsp;0101</td><td align="center">85</td><td align="center">55</td><td align="center">U</td></tr><tr><td>0101&nbsp;0110</td><td align="center">86</td><td align="center">56</td><td align="center">V</td></tr><tr><td>0101&nbsp;0111</td><td align="center">87</td><td align="center">57</td><td align="center">W</td></tr><tr><td>0101&nbsp;1000</td><td align="center">88</td><td align="center">58</td><td align="center">X</td></tr><tr><td>0101&nbsp;1001</td><td align="center">89</td><td align="center">59</td><td align="center">Y</td></tr><tr><td>0101&nbsp;1010</td><td align="center">90</td><td align="center">5A</td><td align="center">Z</td></tr><tr><td>0101&nbsp;1011</td><td align="center">91</td><td align="center">5B</td><td align="center">[</td></tr><tr><td>0101&nbsp;1100</td><td align="center">92</td><td align="center">5C</td><td align="center">\</td></tr><tr><td>0101&nbsp;1101</td><td align="center">93</td><td align="center">5D</td><td align="center">]</td></tr><tr><td>0101&nbsp;1110</td><td align="center">94</td><td align="center">5E</td><td align="center">^</td></tr><tr><td>0101&nbsp;1111</td><td align="center">95</td><td align="center">5F</td><td align="center">_</td></tr></tbody></table></td><td>&nbsp;</td><td><table width="100%" border="0" cellpadding="0" cellspacing="0" class="bx"><thead><tr valign="bottom"><th>二进制</th><th>十进制</th><th>十六进制</th><th>图形</th></tr></thead><tbody><tr><td>0110&nbsp;0000</td><td align="center">96</td><td align="center">60</td><td align="center">`</td></tr><tr><td>0110&nbsp;0001</td><td align="center">97</td><td align="center">61</td><td align="center">a</td></tr><tr><td>0110&nbsp;0010</td><td align="center">98</td><td align="center">62</td><td align="center">b</td></tr><tr><td>0110&nbsp;0011</td><td align="center">99</td><td align="center">63</td><td align="center">c</td></tr><tr><td>0110&nbsp;0100</td><td align="center">100</td><td align="center">64</td><td align="center">d</td></tr><tr><td>0110&nbsp;0101</td><td align="center">101</td><td align="center">65</td><td align="center">e</td></tr><tr><td>0110&nbsp;0110</td><td align="center">102</td><td align="center">66</td><td align="center">f</td></tr><tr><td>0110&nbsp;0111</td><td align="center">103</td><td align="center">67</td><td align="center">g</td></tr><tr><td>0110&nbsp;1000</td><td align="center">104</td><td align="center">68</td><td align="center">h</td></tr><tr><td>0110&nbsp;1001</td><td align="center">105</td><td align="center">69</td><td align="center">i</td></tr><tr><td>0110&nbsp;1010</td><td align="center">106</td><td align="center">6A</td><td align="center">j</td></tr><tr><td>0110&nbsp;1011</td><td align="center">107</td><td align="center">6B</td><td align="center">k</td></tr><tr><td>0110&nbsp;1100</td><td align="center">108</td><td align="center">6C</td><td align="center">l</td></tr><tr><td>0110&nbsp;1101</td><td align="center">109</td><td align="center">6D</td><td align="center">m</td></tr><tr><td>0110&nbsp;1110</td><td align="center">110</td><td align="center">6E</td><td align="center">n</td></tr><tr><td>0110&nbsp;1111</td><td align="center">111</td><td align="center">6F</td><td align="center">o</td></tr><tr><td>0111&nbsp;0000</td><td align="center">112</td><td align="center">70</td><td align="center">p</td></tr><tr><td>0111&nbsp;0001</td><td align="center">113</td><td align="center">71</td><td align="center">q</td></tr><tr><td>0111&nbsp;0010</td><td align="center">114</td><td align="center">72</td><td align="center">r</td></tr><tr><td>0111&nbsp;0011</td><td align="center">115</td><td align="center">73</td><td align="center">s</td></tr><tr><td>0111&nbsp;0100</td><td align="center">116</td><td align="center">74</td><td align="center">t</td></tr><tr><td>0111&nbsp;0101</td><td align="center">117</td><td align="center">75</td><td align="center">u</td></tr><tr><td>0111&nbsp;0110</td><td align="center">118</td><td align="center">76</td><td align="center">v</td></tr><tr><td>0111&nbsp;0111</td><td align="center">119</td><td align="center">77</td><td align="center">w</td></tr><tr><td>0111&nbsp;1000</td><td align="center">120</td><td align="center">78</td><td align="center">x</td></tr><tr><td>0111&nbsp;1001</td><td align="center">121</td><td align="center">79</td><td align="center">y</td></tr><tr><td>0111&nbsp;1010</td><td align="center">122</td><td align="center">7A</td><td align="center">z</td></tr><tr><td>0111&nbsp;1011</td><td align="center">123</td><td align="center">7B</td><td align="center">{</td></tr><tr><td>0111&nbsp;1100</td><td align="center">124</td><td align="center">7C</td><td align="center">|</td></tr><tr><td>0111&nbsp;1101</td><td align="center">125</td><td align="center">7D</td><td align="center">}</td></tr><tr><td>0111&nbsp;1110</td><td align="center">126</td><td align="center">7E</td><td align="center">~</td></tr></tbody></table></td></tr></tbody></table><h3 id="汉字"><a class="markdownIt-Anchor" href="#汉字"></a> 汉字</h3><ul><li>汉字的区位码：由94行、94列组成，行号为区号，列号为位号。</li><li>汉字的国标码：将区号和位号各自加上32(20H)。国标码中区号和位号各占7位。在计算机内部，为方便处理与存储，前面添一个0，构成一个字节。</li><li>至少需要2个字节才能表示一个汉字内码（因为汉字总数超过6万个）</li></ul><h2 id="数据宽度和储存容量"><a class="markdownIt-Anchor" href="#数据宽度和储存容量"></a> 数据宽度和储存容量</h2><h3 id="容量单位"><a class="markdownIt-Anchor" href="#容量单位"></a> 容量单位</h3><table><thead><tr><th style="text-align:center">中文</th><th style="text-align:center">表示</th><th style="text-align:center">转化</th></tr></thead><tbody><tr><td style="text-align:center">千字节</td><td style="text-align:center"><font color="red">K</font>B</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mi>K</mi><mi>B</mi><mo>=</mo><msup><mn>2</mn><mn>10</mn></msup><mtext>字节</mtext><mo>=</mo><mn>1024</mn><mi>B</mi></mrow><annotation encoding="application/x-tex">1KB = 2^{10} \text{字节} = 1024 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">1</span><span class="mord mathdefault" style="margin-right:0.07153em;">K</span><span class="mord mathdefault" 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.8141079999999999em;vertical-align:0em;"></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">0</span></span></span></span></span></span></span></span></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.68333em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></td></tr><tr><td style="text-align:center">兆字节</td><td style="text-align:center">MB</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mi>M</mi><mi>B</mi><mo>=</mo><msup><mn>2</mn><mn>20</mn></msup><mtext>字节</mtext><mo>=</mo><mn>1024</mn><mi>K</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">1MB = 2^{20} \text{字节} = 1024 KB</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">1</span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord mathdefault" 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.8141079999999999em;vertical-align:0em;"></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">2</span><span class="mord mtight">0</span></span></span></span></span></span></span></span></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.68333em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mord mathdefault" style="margin-right:0.07153em;">K</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></td></tr><tr><td style="text-align:center">千兆字节</td><td style="text-align:center">GB</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mi>G</mi><mi>B</mi><mo>=</mo><msup><mn>2</mn><mn>30</mn></msup><mtext>字节</mtext><mo>=</mo><mn>1024</mn><mi>M</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">1GB = 2^{30} \text{字节} = 1024 MB</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">1</span><span class="mord mathdefault">G</span><span class="mord mathdefault" 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.8141079999999999em;vertical-align:0em;"></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">0</span></span></span></span></span></span></span></span></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.68333em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></td></tr><tr><td style="text-align:center">兆兆字节</td><td style="text-align:center">TB</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mi>T</mi><mi>B</mi><mo>=</mo><msup><mn>2</mn><mn>40</mn></msup><mtext>字节</mtext><mo>=</mo><mn>1024</mn><mi>G</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">1TB = 2^{40} \text{字节} =1024 GB</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">1</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault" 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.8141079999999999em;vertical-align:0em;"></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">4</span><span class="mord mtight">0</span></span></span></span></span></span></span></span></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.68333em;vertical-align:0em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">2</span><span class="mord">4</span><span class="mord mathdefault">G</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></td></tr></tbody></table><h3 id="通信中的带宽单位"><a class="markdownIt-Anchor" href="#通信中的带宽单位"></a> 通信中的带宽单位</h3><table><thead><tr><th style="text-align:center">中文</th><th style="text-align:center">表示</th><th style="text-align:center">转化</th></tr></thead><tbody><tr><td style="text-align:center">千比特/秒</td><td style="text-align:center"><font color="red">k</font>b/s</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mi>k</mi><mi>b</mi><mi>p</mi><mi>s</mi><mo>=</mo><mn>1</mn><msup><mn>0</mn><mn>3</mn></msup><mi>b</mi><mi mathvariant="normal">/</mi><mi>s</mi><mo>=</mo><mn>1000</mn><mi>b</mi><mi>p</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">1kbps = 10^{3} b/s = 1000 bps</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">1</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">b</span><span class="mord mathdefault">p</span><span class="mord mathdefault">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:1.064108em;vertical-align:-0.25em;"></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"><span class="mord mtight">3</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">b</span><span class="mord">/</span><span class="mord mathdefault">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.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord mathdefault">b</span><span class="mord mathdefault">p</span><span class="mord mathdefault">s</span></span></span></span></td></tr><tr><td style="text-align:center">兆比特/秒</td><td style="text-align:center">Mb/s</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mi>M</mi><mi>b</mi><mi mathvariant="normal">/</mi><mi>s</mi><mo>=</mo><mn>1</mn><msup><mn>0</mn><mn>6</mn></msup><mi>b</mi><mi mathvariant="normal">/</mi><mi>s</mi><mo>=</mo><mn>1000</mn><mi>k</mi><mi>b</mi><mi>p</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">1Mb/s = 10^{6} b/s = 1000 kbps</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">1</span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord mathdefault">b</span><span class="mord">/</span><span class="mord mathdefault">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:1.064108em;vertical-align:-0.25em;"></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"><span class="mord mtight">6</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">b</span><span class="mord">/</span><span class="mord mathdefault">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.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord mathdefault" style="margin-right:0.03148em;">k</span><span class="mord mathdefault">b</span><span class="mord mathdefault">p</span><span class="mord mathdefault">s</span></span></span></span></td></tr><tr><td style="text-align:center">千兆比特/秒</td><td style="text-align:center">Gb/s</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mi>G</mi><mi>b</mi><mi mathvariant="normal">/</mi><mi>s</mi><mo>=</mo><mn>1</mn><msup><mn>0</mn><mn>9</mn></msup><mi>b</mi><mi mathvariant="normal">/</mi><mi>s</mi><mo>=</mo><mn>1000</mn><mi>M</mi><mi>b</mi><mi>p</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">1Gb/s = 10^{9} b/s = 1000 Mbps</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">1</span><span class="mord mathdefault">G</span><span class="mord mathdefault">b</span><span class="mord">/</span><span class="mord mathdefault">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:1.064108em;vertical-align:-0.25em;"></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"><span class="mord mtight">9</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">b</span><span class="mord">/</span><span class="mord mathdefault">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.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord mathdefault" style="margin-right:0.10903em;">M</span><span class="mord mathdefault">b</span><span class="mord mathdefault">p</span><span class="mord mathdefault">s</span></span></span></span></td></tr><tr><td style="text-align:center">兆兆比特/秒</td><td style="text-align:center">Tb/s</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>1</mn><mi>T</mi><mi>b</mi><mi mathvariant="normal">/</mi><mi>s</mi><mo>=</mo><mn>1</mn><msup><mn>0</mn><mn>12</mn></msup><mi>b</mi><mi mathvariant="normal">/</mi><mi>s</mi><mo>=</mo><mn>1000</mn><mi>G</mi><mi>b</mi><mi>p</mi><mi>s</mi></mrow><annotation encoding="application/x-tex">1Tb/s = 10^{12} b/s =1000 Gbps</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">1</span><span class="mord mathdefault" style="margin-right:0.13889em;">T</span><span class="mord mathdefault">b</span><span class="mord">/</span><span class="mord mathdefault">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:1.064108em;vertical-align:-0.25em;"></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"><span class="mord mtight">1</span><span class="mord mtight">2</span></span></span></span></span></span></span></span></span><span class="mord mathdefault">b</span><span class="mord">/</span><span class="mord mathdefault">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.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">0</span><span class="mord">0</span><span class="mord mathdefault">G</span><span class="mord mathdefault">b</span><span class="mord mathdefault">p</span><span class="mord mathdefault">s</span></span></span></span></td></tr></tbody></table><p><font color="red">注意：容量单位和带宽单位里面明显大小写有一些不一样，因为表示的含义不同，一个是1000，一个1024.</font></p><h3 id="c语言中数据类型的宽度"><a class="markdownIt-Anchor" href="#c语言中数据类型的宽度"></a> C语言中数据类型的宽度</h3><table><thead><tr><th style="text-align:center">C声明</th><th style="text-align:center">典型32位机器(单位：字节)</th><th style="text-align:center">典型64位机器(单位：字节)</th></tr></thead><tbody><tr><td style="text-align:center">char</td><td style="text-align:center">1</td><td style="text-align:center">1</td></tr><tr><td style="text-align:center">short int</td><td style="text-align:center">2</td><td style="text-align:center">2</td></tr><tr><td style="text-align:center">int</td><td style="text-align:center">4</td><td style="text-align:center">4</td></tr><tr><td style="text-align:center">long int</td><td style="text-align:center">4</td><td style="text-align:center">8</td></tr><tr><td style="text-align:center">char*</td><td style="text-align:center">4</td><td style="text-align:center">8</td></tr><tr><td style="text-align:center">float</td><td style="text-align:center">4</td><td style="text-align:center">4</td></tr><tr><td style="text-align:center">double</td><td style="text-align:center">8</td><td style="text-align:center">8</td></tr></tbody></table><p>long double 的确切精度没有规定，所以对于不同平台来说，有的是8字节，有的是10字节，有的是12字节或者16字节。</p><h2 id="数据的存储和排列顺序"><a class="markdownIt-Anchor" href="#数据的存储和排列顺序"></a> 数据的存储和排列顺序</h2><p>80年代开始，几乎所有通用计算机都采用字节编址。在高级语言中声明的基本数据类型有char、short、int、long、long long、float、double、long double等各种不同长度数据，一个基本数据可能会占用多个存储单元。所以有一些问题我们还需要考虑，比如说：变量的地址是其最大地址还是最小地址？多个字节在存储单元中存放的顺序如何？</p><h3 id="大小端方式"><a class="markdownIt-Anchor" href="#大小端方式"></a> 大/小端方式</h3><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-5-1-1.png" alt="2-5-1-1" /></p><p>测试代码：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstdio &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstring &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; algorithm &amp;gt;</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">union</span> NUM</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> a;</span><br><span class="line"><span class="keyword">char</span> b;</span><br><span class="line">&#125; num;</span><br><span class="line">num.a=<span class="number">0x12345678</span>;</span><br><span class="line"><span class="keyword">if</span>(num.b==<span class="number">0x12</span>) <span class="built_in">printf</span>(<span class="string">"Big Endian\n"</span>);</span><br><span class="line"><span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"Little Endian\n"</span>);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"num.b=0x%X\n"</span>,num.b);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>在我的机器上运行的结果：</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-5-1-2.png" alt="2-5-1-2" /></p><p><font color="red">大小端非常重要，因为在看指令的时候，大小端不同，表示的值就不同。<br />注意：IA-32采用的是小端方式。</font></p><h2 id="数字逻辑电路"><a class="markdownIt-Anchor" href="#数字逻辑电路"></a> 数字逻辑电路</h2><h3 id="布尔代数"><a class="markdownIt-Anchor" href="#布尔代数"></a> 布尔代数</h3><table><thead><tr><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math><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 mathdefault">A</span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>⋅</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">A \cdot 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 mathdefault">A</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>+</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">A+B</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 mathdefault">A</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mover accent="true"><mi>A</mi><mo>ˉ</mo></mover></mrow><annotation encoding="application/x-tex">\bar{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8201099999999999em;vertical-align:0em;"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8201099999999999em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathdefault">A</span></span></span><span style="top:-3.25233em;"><span class="pstrut" style="height:3em;"></span><span class="accent-body" style="left:-0.11110999999999999em;">ˉ</span></span></span></span></span></span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mo>⊕</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">A \oplus B</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 mathdefault">A</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span></span></span></span></th></tr></thead><tbody><tr><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">1</td><td style="text-align:center">0</td></tr><tr><td style="text-align:center">0</td><td style="text-align:center">1</td><td style="text-align:center">0</td><td style="text-align:center">1</td><td style="text-align:center">1</td><td style="text-align:center">1</td></tr><tr><td style="text-align:center">1</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">1</td><td style="text-align:center">0</td><td style="text-align:center">1</td></tr><tr><td style="text-align:center">1</td><td style="text-align:center">1</td><td style="text-align:center">1</td><td style="text-align:center">1</td><td style="text-align:center">0</td><td style="text-align:center">0</td></tr></tbody></table><h3 id="全加器一位加法器"><a class="markdownIt-Anchor" href="#全加器一位加法器"></a> 全加器(一位加法器)</h3><p>两个加数为<span class="katex"><span class="katex-mathml"><math><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 mathdefault">A</span></span></span></span>和<span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span>，低位进位为<code>Cin</code>，和为<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi></mrow><annotation encoding="application/x-tex">F</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 mathdefault" style="margin-right:0.13889em;">F</span></span></span></span>，向高位的进位为<code>Cout</code>。<br />化简之后，逻辑表达式如下：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>F</mi><mo>=</mo><mi>A</mi><mo>⊕</mo><mi>B</mi><mo>⊕</mo><mi>C</mi><mi>i</mi><mi>n</mi></mrow><annotation encoding="application/x-tex">F=A \oplus B \oplus Cin</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 mathdefault" style="margin-right:0.13889em;">F</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.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">A</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.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mi>o</mi><mi>u</mi><mi>t</mi><mo>=</mo><mi>A</mi><mo>⋅</mo><mi>B</mi><mo>+</mo><mi>A</mi><mo>⋅</mo><mi>C</mi><mi>i</mi><mi>n</mi><mo>+</mo><mi>B</mi><mo>⋅</mo><mi>C</mi><mi>i</mi><mi>n</mi></mrow><annotation encoding="application/x-tex">Cout=A \cdot B + A \cdot Cin + B \cdot Cin</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 mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">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 mathdefault">A</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.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</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.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">i</span><span class="mord mathdefault">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.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span></span></span></span></span></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-6-2.png" alt="2-6-2" /></p><h3 id="n位加法器"><a class="markdownIt-Anchor" href="#n位加法器"></a> n位加法器</h3><p>n位加法器可用n个全加器实现</p><h4 id="无符号整数加"><a class="markdownIt-Anchor" href="#无符号整数加"></a> 无符号整数加</h4><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-6-3-1-1.png" alt="2-6-3-1-1" /></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-6-3-1-2.png" alt="2-6-3-1-2" /></p><h4 id="带符号整数加"><a class="markdownIt-Anchor" href="#带符号整数加"></a> 带符号整数加</h4><ul><li>溢出标志OF：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mi>F</mi><mo>=</mo><msub><mi>C</mi><mi>n</mi></msub><mo>⊕</mo><msub><mi>C</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">OF=C_n \oplus C_{n-1}</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 mathdefault" style="margin-right:0.02778em;">O</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</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 mathdefault" 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.151392em;"><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 mathdefault 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 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.891661em;vertical-align:-0.208331em;"></span><span class="mord"><span class="mord mathdefault" 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.301108em;"><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 mtight"><span class="mord mathdefault mtight">n</span><span class="mbin mtight">−</span><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.208331em;"><span></span></span></span></span></span></span></span></span></span></li><li>符号标志SF：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>S</mi><mi>F</mi><mo>=</mo><msub><mi>F</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">SF=F_{n-1}</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 mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</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.891661em;vertical-align:-0.208331em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.13889em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.301108em;"><span style="top:-2.5500000000000003em;margin-left:-0.13889em;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 mathdefault mtight">n</span><span class="mbin mtight">−</span><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.208331em;"><span></span></span></span></span></span></span></span></span></span></li><li>零标志ZF：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>Z</mi><mi>F</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">ZF=1</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 mathdefault" style="margin-right:0.07153em;">Z</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</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><semantics><mrow><mi>F</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">F=0</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 mathdefault" style="margin-right:0.13889em;">F</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></li><li>进位/借位标志CF：<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi><mi>F</mi><mo>=</mo><mi>C</mi><mi>o</mi><mi>u</mi><mi>t</mi><mo>⊕</mo><mi>C</mi><mi>i</mi><mi>n</mi></mrow><annotation encoding="application/x-tex">CF=Cout \oplus Cin</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 mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault" style="margin-right:0.13889em;">F</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.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">o</span><span class="mord mathdefault">u</span><span class="mord mathdefault">t</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mord mathdefault">i</span><span class="mord mathdefault">n</span></span></span></span></li></ul><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-6-3-2-1.png" alt="2-6-3-2-1" /></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-6-3-2-2.png" alt="2-6-3-2-2" /></p><h3 id="n位整数加减运算器"><a class="markdownIt-Anchor" href="#n位整数加减运算器"></a> n位整数加/减运算器</h3><p><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mi>A</mi><mo>+</mo><mi>B</mi><msub><mo stretchy="false">]</mo><mtext>补</mtext></msub><mo>=</mo><mo stretchy="false">[</mo><mi>A</mi><msub><mo stretchy="false">]</mo><mtext>补</mtext></msub><mo>+</mo><mo stretchy="false">[</mo><mi>B</mi><msub><mo stretchy="false">]</mo><mtext>补</mtext></msub><mo stretchy="false">(</mo><mi>m</mi><mi>o</mi><mi>d</mi><mtext>  </mtext><mtext>  </mtext><msup><mn>2</mn><mi>n</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[A+B]_{\text{补}} = [A]_{\text{补}} + [B]_{\text{补}} (mod\;\;2^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="mopen">[</span><span class="mord mathdefault">A</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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><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 text mtight"><span class="mord cjk_fallback mtight">补</span></span></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:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathdefault">A</span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><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 text mtight"><span class="mord cjk_fallback mtight">补</span></span></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.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><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 text mtight"><span class="mord cjk_fallback mtight">补</span></span></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="mopen">(</span><span class="mord mathdefault">m</span><span class="mord mathdefault">o</span><span class="mord mathdefault">d</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></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.664392em;"><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 mathdefault mtight">n</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><br /><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo stretchy="false">[</mo><mi>A</mi><mo>−</mo><mi>B</mi><msub><mo stretchy="false">]</mo><mtext>补</mtext></msub><mo>=</mo><mo stretchy="false">[</mo><mi>A</mi><msub><mo stretchy="false">]</mo><mtext>补</mtext></msub><mo>+</mo><mo stretchy="false">[</mo><mo>−</mo><mi>B</mi><msub><mo stretchy="false">]</mo><mtext>补</mtext></msub><mo stretchy="false">(</mo><mi>m</mi><mi>o</mi><mi>d</mi><mtext>  </mtext><mtext>  </mtext><msup><mn>2</mn><mi>n</mi></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">[A-B]_{\text{补}} = [A]_{\text{补}} + [-B]_{\text{补}} (mod\;\;2^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="mopen">[</span><span class="mord mathdefault">A</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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><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 text mtight"><span class="mord cjk_fallback mtight">补</span></span></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:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathdefault">A</span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><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 text mtight"><span class="mord cjk_fallback mtight">补</span></span></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.2222222222222222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222222222222222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord">−</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose"><span class="mclose">]</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.32833099999999993em;"><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 text mtight"><span class="mord cjk_fallback mtight">补</span></span></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="mopen">(</span><span class="mord mathdefault">m</span><span class="mord mathdefault">o</span><span class="mord mathdefault">d</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mspace" style="margin-right:0.2777777777777778em;"></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.664392em;"><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 mathdefault mtight">n</span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-6-4-1.png" alt="2-6-4-1" /></p><ul><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">Sub</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 mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault">u</span><span class="mord mathdefault">b</span></span></span></span>为<span class="katex"><span class="katex-mathml"><math><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>时，做减法。</li><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>S</mi><mi>u</mi><mi>b</mi></mrow><annotation encoding="application/x-tex">Sub</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 mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault">u</span><span class="mord mathdefault">b</span></span></span></span>为<span class="katex"><span class="katex-mathml"><math><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>时，做加法。</li></ul><p><code>算术逻辑部件ALU</code>：</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/2-6-4-2.png" alt="2-6-4-2" /></p><h2 id="数据的运算"><a class="markdownIt-Anchor" href="#数据的运算"></a> 数据的运算</h2><p>高级语言程序中涉及的运算（以C语言为例）</p><ul><li>整数算术运算、浮点数算术运算</li><li>按位、逻辑、移位、位扩展和位截断等运算</li></ul><p>指令集中涉及到的运算：</p><p><code>涉及到的定点数运算</code>：</p><p>算术运算：</p><ul><li>带符号整数：取负/ 符号扩展/ 加/ 减/ 乘/ 除 / 算术移位</li><li>无符号整数：0扩展/ 加/ 减/ 乘/ 除/ 逻辑左移/ 逻辑右移</li></ul><p>逻辑运算：</p><ul><li>逻辑操作：与/ 或/ 非/ …</li></ul><p><code>涉及到的浮点数运算</code>：加、减、乘、除</p><p>指令中的运算操作在运算电路中进行</p><ul><li>基本运算部件ALU、通用寄存器组，以及其他部件</li></ul><h2 id="整数的加减运算"><a class="markdownIt-Anchor" href="#整数的加减运算"></a> 整数的加减运算</h2><ol><li>计算机中所有运算都基于加法器实现。</li><li>加法器不知道所运算的是带符号数还是无符号数。</li><li>加法器不判定对错，总是取低n位作为结果，并生成标志信息。</li></ol><h3 id="无符号数"><a class="markdownIt-Anchor" href="#无符号数"></a> 无符号数</h3><p>加法：</p><ul><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>&lt;</mo><msup><mn>2</mn><mi>n</mi></msup><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>+</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x+y &lt; 2^n, result=x+y</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 mathdefault">x</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.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></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.664392em;"><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 mathdefault mtight">n</span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></li><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup><mo>≤</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo>&lt;</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo>−</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n \leq x+y &lt; 2^{n+1}, result=x+y-2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.800362em;vertical-align:-0.13597em;"></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.664392em;"><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 mathdefault mtight">n</span></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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.008548em;vertical-align:-0.19444em;"></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 mathdefault mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</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.664392em;vertical-align:0em;"></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.664392em;"><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 mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span></li></ul><p>减法：</p><ul><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>−</mo><mi>y</mi><mo>&lt;</mo><mn>0</mn><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>−</mo><mi>y</mi><mo>+</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">x-y&lt;0, result=x-y+2^n</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 mathdefault">x</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.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</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.664392em;vertical-align:0em;"></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.664392em;"><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 mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span></li><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>−</mo><mi>y</mi><mo>≥</mo><mn>0</mn><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>−</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">x-y \geq 0, result=x-y</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 mathdefault">x</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.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" 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.8888799999999999em;vertical-align:-0.19444em;"></span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span></li></ul><h3 id="带符号数"><a class="markdownIt-Anchor" href="#带符号数"></a> 带符号数</h3><p>加法：</p><ul><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>&lt;</mo><mo>−</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo>+</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">x+y&lt;-2^{n-1}, result=x+y+2^n</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 mathdefault">x</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.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.008548em;vertical-align:-0.19444em;"></span><span class="mord">−</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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</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.664392em;vertical-align:0em;"></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.664392em;"><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 mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span>，负溢出</li><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>−</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>≤</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo>&lt;</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>+</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">-2^{n-1} \leq x+y &lt; 2^{n-1}, result=x+y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.950078em;vertical-align:-0.13597em;"></span><span class="mord">−</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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.008548em;vertical-align:-0.19444em;"></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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>，正常</li><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>≥</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>+</mo><mi>y</mi><mo>−</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">x+y \geq 2^{n-1}, result=x+y-2^n</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 mathdefault">x</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.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" 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:1.008548em;vertical-align:-0.19444em;"></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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</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.664392em;vertical-align:0em;"></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.664392em;"><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 mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span>，正溢出</li></ul><p>减法：</p><ul><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>−</mo><mi>y</mi><mo>&lt;</mo><mo>−</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>−</mo><mi>y</mi><mo>+</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">x-y&lt;-2^{n-1}, result=x-y+2^n</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 mathdefault">x</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.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.008548em;vertical-align:-0.19444em;"></span><span class="mord">−</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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</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.664392em;vertical-align:0em;"></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.664392em;"><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 mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span>，负溢出</li><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mo>−</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>≤</mo><mi>x</mi><mo>−</mo><mi>y</mi><mo>&lt;</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>−</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">-2^{n-1} \leq x-y &lt;2^{n-1}, result=x-y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.950078em;vertical-align:-0.13597em;"></span><span class="mord">−</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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.7335400000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:1.008548em;vertical-align:-0.19444em;"></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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.625em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</span></span></span></span>，正常</li><li>当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>x</mi><mo>−</mo><mi>y</mi><mo>≥</mo><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo separator="true">,</mo><mi>r</mi><mi>e</mi><mi>s</mi><mi>u</mi><mi>l</mi><mi>t</mi><mo>=</mo><mi>x</mi><mo>−</mo><mi>y</mi><mo>−</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">x-y \geq 2^{n-1}, result=x-y-2^n</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 mathdefault">x</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.8304100000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" 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:1.008548em;vertical-align:-0.19444em;"></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 mathdefault mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">u</span><span class="mord mathdefault" style="margin-right:0.01968em;">l</span><span class="mord mathdefault">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.66666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">x</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.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.03588em;">y</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.664392em;vertical-align:0em;"></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.664392em;"><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 mathdefault mtight">n</span></span></span></span></span></span></span></span></span></span></span>，正溢出</li></ul><h1 id="center第三章-程序的转换及机器级表示center"><a class="markdownIt-Anchor" href="#center第三章-程序的转换及机器级表示center"></a> <center>第三章 程序的转换及机器级表示</center></h1><h2 id="概述"><a class="markdownIt-Anchor" href="#概述"></a> 概述</h2><p>机器级指令和汇编指令一一对应，都是机器级指令。</p><ul><li>机器指令是一个0/1序列，由若干字段组成。<br> <img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-1.png" alt="3-1" /></li><li>汇编指令是机器指令的符号表示，在不同机器上格式可以不同<br>比如说：Intel格式：<code>mov [bx+di-6],cl</code><br>AT&amp;T格式：<code>movb %cl, -6(%bx,%di)</code><br>这两条指令的功能其实都是表示<code>M[R[bx]+R[di]-6]←R[cl]</code>，其中<code>R</code>表示的是寄存器内容，<code>M</code>表示的是存储单元内容。</li></ul><h2 id="ia-32-指令系统"><a class="markdownIt-Anchor" href="#ia-32-指令系统"></a> IA-32 指令系统</h2><h3 id="概述-2"><a class="markdownIt-Anchor" href="#概述-2"></a> 概述</h3><h4 id="寄存器组织"><a class="markdownIt-Anchor" href="#寄存器组织"></a> 寄存器组织</h4><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-2-1-1.png" alt="3-2-1-1" /></p><table><thead><tr><th style="text-align:center">编号</th><th style="text-align:center">8位寄存器</th><th style="text-align:center">16位寄存器</th><th style="text-align:center">32位寄存器</th><th style="text-align:center">64位寄存器</th><th style="text-align:center">128位寄存器</th></tr></thead><tbody><tr><td style="text-align:center">000</td><td style="text-align:center">AL</td><td style="text-align:center">AX</td><td style="text-align:center">EAX</td><td style="text-align:center">MM0/ST(0)</td><td style="text-align:center">XMM0</td></tr><tr><td style="text-align:center">001</td><td style="text-align:center">CL</td><td style="text-align:center">CX</td><td style="text-align:center">ECX</td><td style="text-align:center">MM1/ST(1)</td><td style="text-align:center">XMM1</td></tr><tr><td style="text-align:center">010</td><td style="text-align:center">DL</td><td style="text-align:center">DX</td><td style="text-align:center">EDX</td><td style="text-align:center">MM2/ST(2)</td><td style="text-align:center">XMM2</td></tr><tr><td style="text-align:center">011</td><td style="text-align:center">BL</td><td style="text-align:center">BX</td><td style="text-align:center">EBX</td><td style="text-align:center">MM3/ST(3)</td><td style="text-align:center">XMM3</td></tr><tr><td style="text-align:center">100</td><td style="text-align:center">AH</td><td style="text-align:center">SP</td><td style="text-align:center">ESP</td><td style="text-align:center">MM4/ST(4)</td><td style="text-align:center">XMM4</td></tr><tr><td style="text-align:center">101</td><td style="text-align:center">CH</td><td style="text-align:center">BP</td><td style="text-align:center">EBP</td><td style="text-align:center">MM5/ST(5)</td><td style="text-align:center">XMM5</td></tr><tr><td style="text-align:center">110</td><td style="text-align:center">DH</td><td style="text-align:center">SI</td><td style="text-align:center">ESI</td><td style="text-align:center">MM6/ST(6)</td><td style="text-align:center">XMM6</td></tr><tr><td style="text-align:center">111</td><td style="text-align:center">BH</td><td style="text-align:center">DI</td><td style="text-align:center">EDI</td><td style="text-align:center">MM7/ST(7)</td><td style="text-align:center">XMM7</td></tr></tbody></table><p>字长不断扩充，指令保持兼容，<code>ST(0)</code> - <code>ST(7)</code>是80位，<code>MM0</code> - <code>MM7</code>使用其低64位</p><p><code>IA-32中寄存器名称的含义</code>：</p><ul><li><code>CS</code> —— 代码段寄存器（Code Segment）</li><li><code>SS</code> —— 栈段寄存器（Stack Segment）</li><li><code>DS</code> —— 数据段寄存器（Data Segment）</li><li><code>ES</code> —— 扩展段寄存器（Extended Segment）</li><li><code>FS，GS</code> —— 数据段寄存器</li><li><code>EAX</code> —— 累加寄存器（Extended Accumulator Register）</li><li><code>ECX</code> —— 计数寄存器（Extended Counter Register）</li><li><code>EDX</code> —— 数据寄存器（Extended Data Register）</li><li><code>EBX</code> —— 指向数据段（DS）的指针（Extended Base Register）</li><li><code>ESI</code> —— 指向数据段（DS）的指针，表示字符串操作的源（Extended Source Index）</li><li><code>EDI</code> —— 指向数据段（ES）的指针，表示字符串操作的目标（Extended Destination Index）</li><li><code>EBP</code> —— 指向栈（SS）的指针，一般表示当前栈帧的底部（Extended Base Pointer）</li><li><code>ESP</code> —— 指向栈（SS）顶的指针（Extended Stack Pointer）</li><li><code>EIP</code> —— 指令寄存器（Enhanced Instruction Pointer）</li><li><code>EFLAG</code> —— 标志位寄存器</li></ul><h4 id="标志寄存器"><a class="markdownIt-Anchor" href="#标志寄存器"></a> 标志寄存器</h4><ul><li>6个条件标志</li></ul><ol><li><code>OF</code>、<code>SF</code>、<code>ZF</code>、<code>CF</code>，功能在前文已经介绍，这里不再赘述</li><li><code>AF</code>：辅助进位标志（在BCD码运算时才有意义）</li><li><code>PF</code>：奇偶标志</li></ol><ul><li>3个控制标志</li></ul><ol><li><code>DF</code>（Direction Flag）：方向标志（自动变址方向是增还是减）</li><li><code>IF</code>（Interrupt Flag）：中断允许标志（仅对外部可屏蔽中断有用）</li><li><code>TF</code>（Trap Flag）：陷阱标志（是否是单步跟踪状态）</li></ol><h4 id="保护模式下的寻址方式"><a class="markdownIt-Anchor" href="#保护模式下的寻址方式"></a> 保护模式下的寻址方式</h4><table><thead><tr><th style="text-align:left">寻址方式</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left">立即寻址</td><td style="text-align:left">指令直接给出操作数</td></tr><tr><td style="text-align:left">寄存器寻址</td><td style="text-align:left">指定的寄存器R的内容为操作数</td></tr><tr><td style="text-align:left">位移</td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>A</mi><mo>=</mo><mo stretchy="false">(</mo><mi>S</mi><mi>R</mi><mo stretchy="false">)</mo><mo>+</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">LA=(SR)+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 mathdefault">L</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span></td></tr><tr><td style="text-align:left">基址寻址</td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>A</mi><mo>=</mo><mo stretchy="false">(</mo><mi>S</mi><mi>R</mi><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">LA=(SR)+(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 mathdefault">L</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">)</span></span></span></span></td></tr><tr><td style="text-align:left">基址加位移</td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>A</mi><mo>=</mo><mo stretchy="false">(</mo><mi>S</mi><mi>R</mi><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo><mo>+</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">LA=(SR)+(B)+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 mathdefault">L</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">)</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span></td></tr><tr><td style="text-align:left">比例变址加位移</td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>A</mi><mo>=</mo><mo stretchy="false">(</mo><mi>S</mi><mi>R</mi><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>I</mi><mo stretchy="false">)</mo><mo>×</mo><mi>S</mi><mo>+</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">LA=(SR)+(I) \times S + 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 mathdefault">L</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mclose">)</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.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span></td></tr><tr><td style="text-align:left">基址加变址加位移</td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>A</mi><mo>=</mo><mo stretchy="false">(</mo><mi>S</mi><mi>R</mi><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>I</mi><mo stretchy="false">)</mo><mo>+</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">LA=(SR)+(B)+(I)+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 mathdefault">L</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">)</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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mclose">)</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span></td></tr><tr><td style="text-align:left">基址加比例变址加位移</td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>A</mi><mo>=</mo><mo stretchy="false">(</mo><mi>S</mi><mi>R</mi><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>B</mi><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mi>I</mi><mo stretchy="false">)</mo><mo>×</mo><mi>S</mi><mo>+</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">LA=(SR)+(B)+(I) \times S + 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 mathdefault">L</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05764em;">S</span><span class="mord mathdefault" style="margin-right:0.00773em;">R</span><span class="mclose">)</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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.05017em;">B</span><span class="mclose">)</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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.07847em;">I</span><span class="mclose">)</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.76666em;vertical-align:-0.08333em;"></span><span class="mord mathdefault" style="margin-right:0.05764em;">S</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span></td></tr><tr><td style="text-align:left">相对寻址</td><td style="text-align:left"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>L</mi><mi>A</mi><mo>=</mo><mo stretchy="false">(</mo><mi>P</mi><mi>C</mi><mo stretchy="false">)</mo><mo>+</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">LA=(PC)+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 mathdefault">L</span><span class="mord mathdefault">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:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathdefault" style="margin-right:0.13889em;">P</span><span class="mord mathdefault" style="margin-right:0.07153em;">C</span><span class="mclose">)</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">A</span></span></span></span> 跳转目标指令地址</td></tr></tbody></table><p>注：<code>LA</code>:线性地址，<code>(X)</code>：X的内容，<code>SR</code>：段寄存器，<code>PC</code>：程序计数器，<code>R</code>：寄存器，<code>A</code>：指令中给定地址段的位移量，<code>B</code>：基址寄存器，<code>I</code>：变址寄存器，<code>S</code>：比例系数</p><ul><li>举例说明：</li></ul><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> x;</span><br><span class="line"><span class="keyword">float</span> a[<span class="number">100</span>];</span><br><span class="line">short b[<span class="number">4</span>][<span class="number">4</span>];</span><br><span class="line"><span class="keyword">char</span> c;</span><br><span class="line"><span class="keyword">double</span> d[<span class="number">10</span>];</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-2-1-3.png" alt="3-2-1-3" /></p><ol><li>如何计算<code>a[i]</code>的地址？<br><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>104</mn><mo>+</mo><mi>i</mi><mo>×</mo><mn>4</mn></mrow><annotation encoding="application/x-tex">104+i \times 4</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">1</span><span class="mord">0</span><span class="mord">4</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.74285em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">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">4</span></span></span></span>，当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mo>=</mo><mn>99</mn></mrow><annotation encoding="application/x-tex">i=99</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 mathdefault">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.64444em;vertical-align:0em;"></span><span class="mord">9</span><span class="mord">9</span></span></span></span>时，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>d</mi><mi>d</mi><mi>r</mi><mi>e</mi><mi>s</mi><mi>s</mi><mo>=</mo><mn>104</mn><mo>+</mo><mn>99</mn><mo>×</mo><mn>4</mn><mo>=</mo><mn>500</mn></mrow><annotation encoding="application/x-tex">Address=104+99 \times 4 = 500</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 mathdefault">A</span><span class="mord mathdefault">d</span><span class="mord mathdefault">d</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">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.72777em;vertical-align:-0.08333em;"></span><span class="mord">1</span><span class="mord">0</span><span class="mord">4</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.72777em;vertical-align:-0.08333em;"></span><span class="mord">9</span><span class="mord">9</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">4</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></span></span></li><li>如何计算<code>b[i][j]</code>的地址？<br><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>504</mn><mo>+</mo><mi>i</mi><mo>×</mo><mn>8</mn><mo>+</mo><mi>j</mi><mo>×</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">504 + i \times 8 + j \times 2</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">5</span><span class="mord">0</span><span class="mord">4</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.74285em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">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.72777em;vertical-align:-0.08333em;"></span><span class="mord">8</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.85396em;vertical-align:-0.19444em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</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><semantics><mrow><mi>i</mi><mo>=</mo><mn>3</mn><mo separator="true">,</mo><mi>j</mi><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">i=3,j=2</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 mathdefault">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.85396em;vertical-align:-0.19444em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault" style="margin-right:0.05724em;">j</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>时，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>d</mi><mi>d</mi><mi>r</mi><mi>e</mi><mi>s</mi><mi>s</mi><mo>=</mo><mn>504</mn><mo>+</mo><mn>24</mn><mo>+</mo><mn>4</mn><mo>=</mo><mn>532</mn></mrow><annotation encoding="application/x-tex">Address=504+24+4=532</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 mathdefault">A</span><span class="mord mathdefault">d</span><span class="mord mathdefault">d</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">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.72777em;vertical-align:-0.08333em;"></span><span class="mord">5</span><span class="mord">0</span><span class="mord">4</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.72777em;vertical-align:-0.08333em;"></span><span class="mord">2</span><span class="mord">4</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">4</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">3</span><span class="mord">2</span></span></span></span></li><li>如何计算<code>d[i]</code>的地址？<br><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>544</mn><mo>+</mo><mi>i</mi><mo>×</mo><mn>8</mn></mrow><annotation encoding="application/x-tex">544+i \times 8</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">5</span><span class="mord">4</span><span class="mord">4</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.74285em;vertical-align:-0.08333em;"></span><span class="mord mathdefault">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">8</span></span></span></span>，当<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>i</mi><mo>=</mo><mn>9</mn></mrow><annotation encoding="application/x-tex">i=9</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 mathdefault">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.64444em;vertical-align:0em;"></span><span class="mord">9</span></span></span></span>时，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>A</mi><mi>d</mi><mi>d</mi><mi>r</mi><mi>e</mi><mi>s</mi><mi>s</mi><mo>=</mo><mn>544</mn><mo>+</mo><mn>9</mn><mo>×</mo><mn>8</mn><mo>=</mo><mn>500</mn></mrow><annotation encoding="application/x-tex">Address=544+9 \times 8 = 500</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 mathdefault">A</span><span class="mord mathdefault">d</span><span class="mord mathdefault">d</span><span class="mord mathdefault" style="margin-right:0.02778em;">r</span><span class="mord mathdefault">e</span><span class="mord mathdefault">s</span><span class="mord mathdefault">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.72777em;vertical-align:-0.08333em;"></span><span class="mord">5</span><span class="mord">4</span><span class="mord">4</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.72777em;vertical-align:-0.08333em;"></span><span class="mord">9</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">8</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></span></span></li></ol><h4 id="机器指令格式"><a class="markdownIt-Anchor" href="#机器指令格式"></a> 机器指令格式</h4><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-2-1-4.png" alt="3-2-1-4" /></p><h3 id="指令类型"><a class="markdownIt-Anchor" href="#指令类型"></a> 指令类型</h3><h4 id="传送指令"><a class="markdownIt-Anchor" href="#传送指令"></a> 传送指令</h4><p>1.通用数据传送指令</p><ul><li><code>MOV</code>：一般传送，包括<code>movb</code>、<code>movw</code>和<code>movz</code>等</li><li><code>MOVS</code>：符号扩展传送，如<code>movsbw</code>、<code>movswl</code>等</li><li><code>MOVZ</code>：零扩展传送，如<code>movzwl</code>、<code>movzbl</code>等</li><li><code>XCHG</code>：数据交换</li><li><code>PUSH/POP</code>：入栈/出栈，如<code>pushl</code>、<code>pushw</code>、<code>popl</code>、<code>popw</code>等</li></ul><p>2.地址传送指令</p><ul><li><code>LEA</code>：加载有效地址，如<code>leal (%edx,%eax), %eax</code>的功能为<code>R[eax]←R[edx]+R[eax]</code>，执行前，若<code>R[edx]=i，R[eax]=j</code>，则指令执行后，<code>R[eax]=i+j</code></li></ul><p>3.输入输出指令</p><ul><li><code>IN</code>和<code>OUT</code>：I/O端口与寄存器之间的交换</li></ul><p>4.标志传送指令</p><ul><li><code>PUSHF</code>、<code>POPF</code>：将<code>EFLAG</code>压栈，或将栈顶内容送<code>EFLAG</code></li></ul><p>入栈 <code>pushw %ax</code></p><ol><li>栈（Stack）是一种采用“先进后出”方式进行访问的一块存储区，用于嵌套过程调用。<font color="red">从高地址向低地址增长</font></li><li>“栈”不等于“堆栈”（由“堆”和“栈”组成）</li></ol><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-2-2-1-1.png" alt="3-2-2-1-1" /></p><p>出栈 <code>popw %ax</code></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-2-2-1-2.png" alt="3-2-2-1-2" /></p><h4 id="定点算术指令"><a class="markdownIt-Anchor" href="#定点算术指令"></a> 定点算术指令</h4><ul><li>加/减运算（影响标志、不区分无/带符号）<br><code>ADD</code>：加，包括<code>addb</code>、<code>addw</code>、<code>addl</code>等<br><code>SUB</code>：减，包括<code>subb</code>、<code>subw</code>、<code>subl</code>等</li><li>增1/减1运算（影响除CF以外的标志、不区分无/带符号）<br><code>INC</code>：加，包括<code>incb</code>、<code>incw</code>、<code>incl</code>等<br><code>DEC</code>：减，包括<code>decb</code>、<code>decw</code>、<code>decl</code>等</li><li>取负运算（影响标志、若对0取负，则结果为0且CF清0，否则CF置1）<br><code>NEG</code>：取负，包括<code>negb</code>、<code>negw</code>、<code>negl</code>等</li><li>比较运算（做减法得到标志、不区分无/带符号）<br><code>CMP</code>：比较，包括<code>cmpb</code>、<code>cmpw</code>、<code>cmpl</code>等</li><li>乘/除运算（不影响标志、区分无/带符号）<br><code>MUL</code>/<code>IMUL</code>：无符号乘/带符号乘<code>DIV</code>/<code>IDIV</code>：带无符号除/带符号除</li></ul><p><strong>1.乘法指令：</strong></p><ul><li>指令中只给出一个操作数<code>SRC</code>：则另一个源操作数隐含在<code>AL</code>/<code>AX</code>/<code>EAX</code>中，将<code>SRC</code>和累加器内容相乘，结果存放在<code>AX</code>（16位）或<code>DX-AX</code>（32位）或 <code>EDX-EAX</code>（64位）中。<code>DX-AX</code>表示32位乘积的高、低16位分别在<code>DX</code>和<code>AX</code>中。<br>得到的结果的位数：<font color="red"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mtext>位</mtext><mo>×</mo><mi>n</mi><mtext>位</mtext><mo>=</mo><mn>2</mn><mi>n</mi><mtext>位</mtext></mrow><annotation encoding="application/x-tex">n\text{位}\times n\text{位}=2n\text{位}</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 mathdefault">n</span><span class="mord text"><span class="mord cjk_fallback">位</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">n</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.68333em;vertical-align:0em;"></span><span class="mord">2</span><span class="mord mathdefault">n</span><span class="mord text"><span class="mord cjk_fallback">位</span></span></span></span></span></font></li><li>指令中给出两个操作数<code>DST</code>和<code>SRC</code>，则将<code>DST</code>和<code>SRC</code>相乘，结果在<code>DST</code>中。<br>得到的结果的位数：<font color="red"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mtext>位</mtext><mo>×</mo><mi>n</mi><mtext>位</mtext><mo>=</mo><mi>n</mi><mtext>位</mtext></mrow><annotation encoding="application/x-tex">n\text{位}\times n\text{位}=n\text{位}</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 mathdefault">n</span><span class="mord text"><span class="mord cjk_fallback">位</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">n</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">n</span><span class="mord text"><span class="mord cjk_fallback">位</span></span></span></span></span></font></li><li>指令中给出三个操作数<code>REG</code>、<code>SRC</code>和<code>IMM</code>，则将<code>SRC</code>和立即数<code>IMM</code>相乘，结果在<code>REG</code>中。<br>得到的结果的位数：<font color="red"><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>n</mi><mtext>位</mtext><mo>×</mo><mi>n</mi><mtext>位</mtext><mo>=</mo><mi>n</mi><mtext>位</mtext></mrow><annotation encoding="application/x-tex">n\text{位}\times n\text{位}=n\text{位}</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 mathdefault">n</span><span class="mord text"><span class="mord cjk_fallback">位</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">n</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.68333em;vertical-align:0em;"></span><span class="mord mathdefault">n</span><span class="mord text"><span class="mord cjk_fallback">位</span></span></span></span></span></font></li></ul><p><strong>2.除法指令</strong></p><p>只明显指出除数，用<code>EDX-EAX</code>中内容除以指定的除数</p><ul><li>若为8位，则16位被除数在<code>AX</code>寄存器中，商送回<code>AL</code>，余数在<code>AH</code></li><li>若为16位，则32位被除数在<code>DX-AX</code>寄存器中，商送回<code>AX</code>，余数在<code>DX</code></li><li>若为32位，则被除数在<code>EDX-EAX</code>寄存器中，商送<code>EAX</code>，余数在<code>EDX</code></li></ul><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-2-2-2-1.png" alt="3-2-2-2-1" /></p><h4 id="按位运算"><a class="markdownIt-Anchor" href="#按位运算"></a> 按位运算</h4><p><strong>1.移位运算</strong><font color="red">（左/右移时，最高/最低位送CF）</font></p><ul><li><code>SHL</code>/<code>SHR</code>: 逻辑左/右移，包括<code>shlb</code>、<code>shrw</code>、<code>shrl</code>等</li><li><code>SAL</code>/<code>SAR</code>: 算术左/右移，左移判溢出，右移高位补符（移位前、后符号位发生变化，则<code>OF</code>=1 ）包括<code>salb</code>、<code>sarw</code>、<code>sarl</code>等</li><li><code>ROL</code>/<code>ROR</code>: 循环左/右移，包括<code>rolb</code>、<code>rorw</code>、<code>roll</code>等</li><li><code>RCL</code>/<code>RCR</code>: 带进位循环左/右移，即：将<code>CF</code>作为操作数 一部分循环移位，包括<code>rclb</code>、<code>rcrw</code>、<code>rcll</code>等 <br><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-2-2-3-1.png" alt="3-2-2-3-1" /></li></ul><p><font color="red">注</font>：<code>sarw $1,%ax</code>可简写成<code>sarw %ax</code></p><p><strong>2.逻辑运算</strong></p><ul><li><code>NOT</code>：非，包括<code>notb</code>、<code>notw</code>、<code>notl</code>等</li><li><code>AND</code>：与，包括<code>andb</code>、<code>andw</code>、<code>andl</code>等</li><li><code>OR</code>：或，包括<code>orb</code>、<code>orw</code>、<code>orl</code>等</li><li><code>XOR</code>：异或，包括<code>xorb</code>、<code>xorw</code>、<code>xorl</code>等</li><li><code>TEST</code>：做“与”操作测试，仅影响标志</li></ul><p><font color="red">仅<code>NOT</code>不影响标志，其他指令<code>OF</code>=<code>CF</code>=0，而<code>ZF</code>和<code>SF</code>则根据结果设置：若全0，则<code>ZF</code>=1；若最高位为1，则<code>SF</code>=1</font></p><h4 id="控制转移指令"><a class="markdownIt-Anchor" href="#控制转移指令"></a> 控制转移指令</h4><p>指令执行可<font color="red">按顺序</font>或<font color="red">跳转到转移目标指令处</font>执行</p><ul><li>无条件转移指令<br><code>JMP DST</code>：无条件转移到目标指令<code>DST</code>处执行</li><li>条件转移<br><code>Jcc DST</code>：<code>cc</code>为条件码，根据标志（条件码）判断是否满足条件，若满足，则转移到目标指令<code>DST</code>处执行，否则按顺序执行</li><li>条件设置<br><code>SETcc DST</code>：按条件码<code>cc</code>判断的结果保存到<code>DST</code>（是一个8位寄存器）</li><li>调用和返回指令（用于过程调用）<br><code>CALL DST</code>：返回地址<code>RA</code>入栈，转<code>DST</code>处执行<br><code>RET</code>：从栈中取出返回地址<code>RA</code>，转到<code>RA</code>处执行</li><li>中断指令</li></ul><p><font color="red">这里我们可以注意到，调用的函数返回地址是<code>RA</code>，这非常重要</font></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-2-2-4.png" alt="3-2-2-4" /></p><h2 id="c语言程序的机器级表示"><a class="markdownIt-Anchor" href="#c语言程序的机器级表示"></a> C语言程序的机器级表示</h2><h3 id="过程调用的机器级表示"><a class="markdownIt-Anchor" href="#过程调用的机器级表示"></a> 过程调用的机器级表示</h3><h4 id="过程调用的执行步骤"><a class="markdownIt-Anchor" href="#过程调用的执行步骤"></a> 过程调用的执行步骤</h4><p>过程调用的执行步骤(<code>P</code>为调用者，<code>Q</code>为被调用者)</p><ol><li><code>P</code>将入口参数（实参）放到<code>Q</code>能访问到的地方；</li><li><code>P</code>保存返回地址，然后将控制转移到<code>Q</code>； <font color="red">（CALL指令）</font></li><li><code>Q</code>保存<code>P</code>的现场，并为自己的非静态局部变量分配空间；</li><li>执行<code>Q</code>的过程体（函数体）；</li><li><code>Q</code>恢复<code>P</code>的现场，释放局部变量空间；</li><li><code>Q</code>取出返回地址，将控制转移到<code>P</code>。<font color="red">（RET指令）</font></li></ol><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-3-1-1.png" alt="3-3-1-1" /></p><h4 id="ia-32的寄存器使用约定"><a class="markdownIt-Anchor" href="#ia-32的寄存器使用约定"></a> IA-32的寄存器使用约定</h4><ul><li>调用者保存寄存器：<code>EAX</code>、<code>EDX</code>、<code>ECX</code><br />当过程<code>P</code>调用过程<code>Q</code>时，<code>Q</code>可以直接使用这三个寄存器，不用将它们的值保存到栈中。如果<code>P</code>在从<code>Q</code>返回后还要用这三个寄存器的话，<code>P</code>应在转到<code>Q</code>之前先保存，并在从<code>Q</code>返回后先恢复它们的值再使用。</li><li>被调用者保存寄存器：<code>EBX</code>、<code>ESI</code>、<code>EDI</code><br /><code>Q</code>必须先将它们的值保存到栈中再使用它们，并在返回<code>P</code>之前恢复它们的值。</li><li><code>EBP</code>和<code>ESP</code>分别是帧指针寄存器和栈指针寄存器，分别用来指向当前栈帧的<font color="red">底部</font>和<font color="red">顶部</font>。</li></ul><p><font color="red">注意</font>：</p><ol><li>所以为了减少准备和结束阶段的开销，每个过程应该先使用<code>EAX</code>、<code>ECX</code>、<code>EDX</code>，这样就不用存栈。</li><li>返回参数总在<code>EAX</code>中</li></ol><h4 id="过程函数的结构"><a class="markdownIt-Anchor" href="#过程函数的结构"></a> 过程（函数）的结构</h4><p>一个C过程的大致结构如下：<br /><font color="red">准备阶段</font>：</p><ul><li>形成帧底：<code>push</code>指令 和<code>mov</code>指令</li><li>生成栈帧（如果需要的话）：<code>sub</code>指令或<code>and</code>指令</li><li>保存现场（如果有被调用者保存寄存器）：<code>mov</code>指令<font color="red">（为什么？因为所有过程共享一套GPRs）</font></li></ul><p><font color="red">过程（函数）体</font>：</p><ul><li>分配局部变量空间，并赋值</li><li>具体处理逻辑，如果遇到函数调用时，<br>(1) 准备参数：将实参送栈帧入口参数处<br>(2) <code>CALL</code>指令：保存返回地址并转被调用函数</li><li>在<code>EAX</code>中准备返回参数</li></ul><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-3-1-3.png" alt="3-3-1-3" /></p><p>第一个入口参数在<code>EBP+8</code>的位置（<code>EBP</code>存<code>EBP</code>在<code>Caller</code>中的旧值，<code>EBP+4</code>存返回地址）</p><p><font color="red">结束阶段</font>：</p><ul><li>退栈：<code>leave</code>指令或<code>pop</code>指令</li><li>取返回地址返回：<code>ret</code>指令</li></ul><h4 id="选择和循环语句"><a class="markdownIt-Anchor" href="#选择和循环语句"></a> 选择和循环语句</h4><p><strong>1.switch-case语句</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">movl    8(%ebp),%eax</span><br><span class="line">subl    $10,%eax</span><br><span class="line">cmpl    $7,%eax</span><br><span class="line">ja      .L5</span><br><span class="line">jmp     *.L8(,%eax,4)</span><br><span class="line">.L1</span><br><span class="line">...</span><br><span class="line">.L2</span><br><span class="line">...</span><br><span class="line">.L3</span><br><span class="line">...</span><br><span class="line">.L4</span><br><span class="line">...</span><br><span class="line">.L5</span><br><span class="line">...</span><br><span class="line">.L7</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>跳转表在目标文件的只读节中，按4字节边界对齐。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-3-1-4-1.png" alt="3-3-1-4-1" /></p><p><strong>2.循环结构与递归结构的比较</strong></p><p>循环结构一般使用的都是简单变量，直接保存到寄存器中。而递归结构每次都要分配栈空间，时间和空间的开销都非常得大。（比如递归写法的快速幂和迭代写法的快速幂，速度会差几十倍至几十倍（取决于数据范围）。<font color="red">所以，为了提高程序性能，能使用非递归方式执行则最好用非递归结构。</font></p><h2 id="复杂数据类型的分配和访问"><a class="markdownIt-Anchor" href="#复杂数据类型的分配和访问"></a> 复杂数据类型的分配和访问</h2><h3 id="数组"><a class="markdownIt-Anchor" href="#数组"></a> 数组</h3><table><thead><tr><th style="text-align:center">数组定义</th><th style="text-align:center">数组名</th><th style="text-align:center">数组元素类型</th><th style="text-align:center">数组元素大小(B)</th><th style="text-align:center">数组大小(B)</th><th style="text-align:center">起始地址</th><th style="text-align:center">元素i的地址</th></tr></thead><tbody><tr><td style="text-align:center">char S[10]</td><td style="text-align:center">S</td><td style="text-align:center">char</td><td style="text-align:center">1</td><td style="text-align:center">10</td><td style="text-align:center">&amp;S[0]</td><td style="text-align:center">&amp;S[0]+i</td></tr><tr><td style="text-align:center">char* SA[10]</td><td style="text-align:center">SA</td><td style="text-align:center">char*</td><td style="text-align:center">4</td><td style="text-align:center">40</td><td style="text-align:center">&amp;SA[0]</td><td style="text-align:center">&amp;SA[0]+4*i</td></tr><tr><td style="text-align:center">double D[10]</td><td style="text-align:center">D</td><td style="text-align:center">double</td><td style="text-align:center">8</td><td style="text-align:center">80</td><td style="text-align:center">&amp;D[0]</td><td style="text-align:center">&amp;D[0]+8*i</td></tr><tr><td style="text-align:center">double* DA[10]</td><td style="text-align:center">DA</td><td style="text-align:center">double*</td><td style="text-align:center">4</td><td style="text-align:center">40</td><td style="text-align:center">&amp;DA[0]</td><td style="text-align:center">&amp;DA[0]+4*i</td></tr></tbody></table><p><strong>数组元素和指针变量的表达式计算示例：</strong></p><table><thead><tr><th style="text-align:center">序号</th><th style="text-align:center">表达式</th><th style="text-align:center">类型</th><th style="text-align:center">值的计算方式</th><th style="text-align:center">汇编代码</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td style="text-align:center">A</td><td style="text-align:center">int*</td><td style="text-align:center">SA</td><td style="text-align:center">leal (%ecx),%eax</td></tr><tr><td style="text-align:center">2</td><td style="text-align:center">A[0]</td><td style="text-align:center">int</td><td style="text-align:center">M[SA]</td><td style="text-align:center">movl (%ecx),%eax</td></tr><tr><td style="text-align:center">3</td><td style="text-align:center">A[i]</td><td style="text-align:center">int</td><td style="text-align:center">M[SA+4*i]</td><td style="text-align:center">movl (%ecx,%edx,4),%eax</td></tr><tr><td style="text-align:center">4</td><td style="text-align:center">&amp;A[3]</td><td style="text-align:center">int*</td><td style="text-align:center">SA+12</td><td style="text-align:center">leal 12(%ecx),%eax</td></tr><tr><td style="text-align:center">5</td><td style="text-align:center">&amp;A[i]-A</td><td style="text-align:center">int</td><td style="text-align:center">(SA+4*i-SA)/4=i</td><td style="text-align:center">movl %edx,%eax</td></tr><tr><td style="text-align:center">6</td><td style="text-align:center">*(A+i)</td><td style="text-align:center">int</td><td style="text-align:center">M[SA+4*i]</td><td style="text-align:center">movl (%ecx,%edx,4),%eax</td></tr><tr><td style="text-align:center">7</td><td style="text-align:center">*(&amp;A[0]+i-1)</td><td style="text-align:center">int</td><td style="text-align:center">M[SA+4*i-4]</td><td style="text-align:center">movl -4(%ecx,edx,4),%eax</td></tr><tr><td style="text-align:center">8</td><td style="text-align:center">A+i</td><td style="text-align:center">int*</td><td style="text-align:center">SA+4*i</td><td style="text-align:center">leal (%ecx,%edx,4),%eax</td></tr></tbody></table><p><strong>指针数组和多维数组：</strong></p><ul><li>由若干指向同类目标的指针变量组成的数组称为指针数组。<br />其定义的一般形式如下：<br /><code>存储类型 数据类型 *指针数组名[元素个数]</code><br />例如，<code>int *a[10];</code>定义了一个指针数组<code>a</code>，它有10个元素，每个元素都是一个指向int型数据的指针。</li><li>一个指针数组可以实现一个二维数组</li></ul><h3 id="结构体和联合体"><a class="markdownIt-Anchor" href="#结构体和联合体"></a> 结构体和联合体</h3><h4 id="结构体成员在内存的存放和访问"><a class="markdownIt-Anchor" href="#结构体成员在内存的存放和访问"></a> 结构体成员在内存的存放和访问</h4><ul><li>分配在栈中的auto结构型变量的首地址由<code>EBP</code>或<code>ESP</code>来定位</li><li>分配在静态区的结构型变量首地址是一个确定的静态区地址</li><li>结构型变量 x 各成员首址可用“基址加偏移量”的寻址方式</li></ul><p><strong>结构体数据作为入口参数：</strong></p><p>首先，当结构体变量需要作为一个函数的形参时，形参和调用函数中的实参应具有相同结构。</p><p>然后，其传递有两种方式：</p><ul><li>若采用按值传递，则结构成员都要复制到栈中参数区，这既增加时间开销又增加空间开销，且更新后的数据无法在调用过程使用</li><li><font color="red">通常应按地址传递</font>，即：在执行CALL指令前，仅需传递指向结构体的指针而不需复制每个成员到栈中</li></ul><h4 id="联合体数据的分配和访问"><a class="markdownIt-Anchor" href="#联合体数据的分配和访问"></a> 联合体数据的分配和访问</h4><p>联合体各成员共享存储空间，按最大长度成员所需空间大小为目标</p><p>注：联合体通常用于特殊场合，如，当事先知道某种数据结构中的不同字段的使用时间是互斥的，就可将这些字段声明为联合，以减少空间。<font color="red">但有时会得不偿失，可能只会减少少量空间却大大增加处理复杂性。</font></p><h3 id="数据的对齐存放"><a class="markdownIt-Anchor" href="#数据的对齐存放"></a> 数据的对齐存放</h3><h4 id="为什么要对齐"><a class="markdownIt-Anchor" href="#为什么要对齐"></a> 为什么要对齐</h4><p>各种不同长度的数据存放时，有两种处理方式:</p><ul><li>按边界对齐（若一个字为32位）<br />字地址：4的倍数(低两位为0)<br />半字地址：2的倍数(低位为0)<br />字节地址：任意</li><li>不按边界对齐<br />坏处：可能会增加访存次数</li></ul><h4 id="对齐方式的设定"><a class="markdownIt-Anchor" href="#对齐方式的设定"></a> 对齐方式的设定</h4><p><code>#pragma pack(n)</code></p><ul><li>为编译器指定结构体或类内部的成员变量的对齐方式。</li><li>当自然边界（如int型按4字节、short型按2字节、float按4字节）比n大时，按n字节对齐。</li><li>缺省或<code>#pragma pack()</code> ，按自然边界对齐。</li></ul><p><code>__attribute__((aligned(m)))</code></p><ul><li>为编译器指定一个结构体或类或联合体或一个单独的变量(对象)的对齐方式。</li><li>按m字节对齐(m必须是2的幂次方)，且其占用空间大小也是m的整数倍，以保证在申请连续存储空间时各元素也按m字节对齐。</li></ul><p><code>__attribute__((packed))</code></p><ul><li>不按边界对齐，称为紧凑方式。</li></ul><h3 id="越界访问和缓冲区溢出"><a class="markdownIt-Anchor" href="#越界访问和缓冲区溢出"></a> 越界访问和缓冲区溢出</h3><p><strong>先看一个例子直观感受：</strong></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/introduction-to-computer-systems/3-4-4-4.png" alt="3-4-4-4" /></p><p>当<code>i&gt;1</code>的时候，就出现了问题，因为数组访问越界了，影响到了其他位置的值甚至直接爆栈。</p><p><strong>C语言程序中对数组的访问可能会有意或无意地超越数组存储区范围而无法发现。</strong></p><p>数组存储区可看成是一个缓冲区，超越数组存储区范围的写入操作<br />称为缓冲区溢出。<br /><strong>例如</strong>，对于一个有10个元素的char型数组，其定义的缓冲区有10个字节。若写一个字符串到这个缓冲区，那么只要写入的字符串多于9个字符（结束符‘\0’占一个字节），就会发生“写溢出”。</p><p><strong>带来的破坏：</strong></p><ul><li>缓冲区溢出是一种非常普遍、非常危险的漏洞，在各种操作系统、<br />应用软件中广泛存在。</li><li>缓冲区溢出攻击是利用缓冲区溢出漏洞所进行的攻击。利用缓冲区<br />溢出攻击，可导致程序运行失败、系统关机、重新启动等后果。</li></ul><h2 id="x86-64-体系"><a class="markdownIt-Anchor" href="#x86-64-体系"></a> x86-64 体系</h2><h3 id="x86-64操作数格式"><a class="markdownIt-Anchor" href="#x86-64操作数格式"></a> x86-64操作数格式</h3><p>操作数的寻址有如下方式：</p><ul><li>立即数，用来表示常数值，书写方式为’$'加标准C表示法表示的整数，如$-577或$0x1F。</li><li>寄存器，<code>R[ra]</code>表示<code>ra</code>寄存器的内容。</li><li>内存引用，<code>M[Addr]</code>表示地址为<code>Addr</code>的存储单元内的值</li></ul><p>立即数<code>Imm</code>、基址寄存器<code>rb</code>、变址寄存器<code>ri</code>、比例因子<code>s</code>（其值为1、2、4、8）。</p><table><thead><tr><th style="text-align:left">类型</th><th style="text-align:left">格式</th><th style="text-align:left">操作数值</th><th style="text-align:left">名称</th></tr></thead><tbody><tr><td style="text-align:left">立即数</td><td style="text-align:left">$Imm</td><td style="text-align:left">Imm</td><td style="text-align:left">立即数寻址</td></tr><tr><td style="text-align:left">寄存器</td><td style="text-align:left">ra</td><td style="text-align:left">R[ra]</td><td style="text-align:left">寄存器寻址</td></tr><tr><td style="text-align:left">存储器</td><td style="text-align:left">Imm</td><td style="text-align:left">M[Imm]</td><td style="text-align:left">绝对寻址</td></tr><tr><td style="text-align:left">存储器</td><td style="text-align:left">(ra)</td><td style="text-align:left">M[R[ra]]</td><td style="text-align:left">间接寻址</td></tr><tr><td style="text-align:left">存储器</td><td style="text-align:left">Imm(rb)</td><td style="text-align:left">M[Imm+R[rb]]</td><td style="text-align:left">（基址+偏移量）寻址</td></tr><tr><td style="text-align:left">存储器</td><td style="text-align:left">(rb,ri)</td><td style="text-align:left">M[R[rb]+R[ri]]</td><td style="text-align:left">变址寻址</td></tr><tr><td style="text-align:left">存储器</td><td style="text-align:left">Imm(rb,ri)</td><td style="text-align:left">M[Imm+R[rb]+R[ri]]</td><td style="text-align:left">变址寻址</td></tr><tr><td style="text-align:left">存储器</td><td style="text-align:left">(,ri,s)</td><td style="text-align:left">M[R[ri]*s]</td><td style="text-align:left">比例变址寻址</td></tr><tr><td style="text-align:left">存储器</td><td style="text-align:left">Imm(,ri,s)</td><td style="text-align:left">M[Imm+R[ri]*s]</td><td style="text-align:left">比例变址寻址</td></tr><tr><td style="text-align:left">存储器</td><td style="text-align:left">(rb,ri,s)</td><td style="text-align:left">M[R[rb]+R[ri]*s]</td><td style="text-align:left">比例变址寻址</td></tr><tr><td style="text-align:left">存储器</td><td style="text-align:left">Imm(rb,ri,s)</td><td style="text-align:left">M[Imm+R[rb]+R[ri]*s]</td><td style="text-align:left">比例变址寻址</td></tr></tbody></table><h3 id="x86-64寄存器"><a class="markdownIt-Anchor" href="#x86-64寄存器"></a> x86-64寄存器</h3><p><strong>X86-64有16个64位寄存器</strong>，分别是：<code>rax</code>，<code>rbx</code>，<code>rcx</code>，<code>rdx</code>，<code>esi</code>，<code>edi</code>，<code>rbp</code>，<code>rsp</code>，<code>r8</code>，<code>r9</code>，<code>r10</code>，<code>r11</code>，<code>r12</code>，<code>r13</code>，<code>r14</code>，<code>r15</code>。其中：</p><ul><li><code>rax</code> 作为函数返回值使用。</li><li><code>rsp</code> 栈指针寄存器，指向栈顶</li><li><code>rdi</code>，<code>rsi</code>，<code>rdx</code>，<code>rcx</code>，<code>r8</code>，<code>r9</code> 用作函数参数，依次对应第1参数，第2参数……</li><li><code>rbx</code>，<code>rbp</code>，<code>r12</code>，<code>r13</code>，<code>r14</code>，<code>r15</code> 用作数据存储，遵循被调用者使用规则，简单说就是随便用，调用子函数之前要备份它，以防他被修改</li><li><code>r10</code>，<code>r11</code> 用作数据存储，遵循调用者使用规则，简单说就是使用之前要先保存原值</li></ul><p><font color="red">注：</font></p><ul><li>最多有六个整形或指针型参数通过寄存器传递，超过六个只能通过栈来传递<font color="red">（所以在传递参数的时候尽量保证传递的参数个数在6个以内，如果是数组就用传递指针，这样可以提高程序的运行效率）</font></li><li>在函数中尽量使用<code>rax</code>,<code>r10</code>，<code>r11</code>，若使用<code>rbx</code>,<code>rbp</code>,<code>r12</code>，<code>r13</code>，<code>r14</code>,<code>r15</code>则需要将它们先保存在栈中在使用，最后返回前再恢复其值</li></ul><table><thead><tr><th>63~0位</th><th>31~0位</th><th>15~0位</th><th>7~0位</th><th>用途</th></tr></thead><tbody><tr><td>%rax</td><td>%eax</td><td>%ax</td><td>%al</td><td>返回值</td></tr><tr><td>%rbx</td><td>%ebx</td><td>%bx</td><td>%bl</td><td>被调用者保存</td></tr><tr><td>%rcx</td><td>%ecx</td><td>%cx</td><td>%cl</td><td>第4个参数</td></tr><tr><td>%rdx</td><td>%edx</td><td>%dx</td><td>%dl</td><td>第3个参数</td></tr><tr><td>%rsi</td><td>%esi</td><td>%si</td><td>%sil</td><td>第2个参数</td></tr><tr><td>%rdi</td><td>%edi</td><td>%di</td><td>%dil</td><td>第1个参数</td></tr><tr><td>%rbp</td><td>%ebp</td><td>%bp</td><td>%bpl</td><td>被调用者保存</td></tr><tr><td>%rsp</td><td>%esp</td><td>%sp</td><td>%spl</td><td>栈指针</td></tr><tr><td>%r8</td><td>%r8d</td><td>%r8w</td><td>%r8b</td><td>第5个参数</td></tr><tr><td>%r9</td><td>%r9d</td><td>%r9w</td><td>%r9b</td><td>第6个参数</td></tr><tr><td>%r10</td><td>%r10d</td><td>%r10w</td><td>%r10b</td><td>调用者保存</td></tr><tr><td>%r11</td><td>%r11d</td><td>%r11w</td><td>%r11b</td><td>调用者保存</td></tr><tr><td>%r12</td><td>%r12d</td><td>%r12w</td><td>%r12b</td><td>被调用者保存</td></tr><tr><td>%r13</td><td>%r13d</td><td>%r13w</td><td>%r13b</td><td>被调用者保存</td></tr><tr><td>%r14</td><td>%r14d</td><td>%r14w</td><td>%r14b</td><td>被调用者保存</td></tr><tr><td>%r15</td><td>%r15d</td><td>%r15w</td><td>%r15b</td><td>被调用者保存</td></tr></tbody></table>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="System" scheme="http://lemonaaaaa.com/categories/Code-life/System/"/>
    
    
      <category term="系统" scheme="http://lemonaaaaa.com/tags/%E7%B3%BB%E7%BB%9F/"/>
    
      <category term="汇编" scheme="http://lemonaaaaa.com/tags/%E6%B1%87%E7%BC%96/"/>
    
      <category term="笔记" scheme="http://lemonaaaaa.com/tags/%E7%AC%94%E8%AE%B0/"/>
    
      <category term="计算机基础" scheme="http://lemonaaaaa.com/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80/"/>
    
  </entry>
  
  <entry>
    <title>常见的一些User-Agent</title>
    <link href="http://lemonaaaaa.com/2020/04/user-agent/"/>
    <id>http://lemonaaaaa.com/2020/04/user-agent/</id>
    <published>2020-04-21T15:15:34.000Z</published>
    <updated>2020-05-10T03:11:22.850Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>User-Agent我们一般在抓包的时候用，因为要将Python（举例）伪装成正常的用户上网操作，让服务器识别为正常操作返回正常的数据给你。同时，这个也可以去评论其他博客（比如说Valine这种评论系统就会显示你的操作系统和浏览器，你可以修改，让对方感到迷惑：<s>什么年代了都还在用Windows 98？？？</s>）</p><h1 id="操作系统标识"><a class="markdownIt-Anchor" href="#操作系统标识"></a> 操作系统标识</h1><h2 id="freebsd"><a class="markdownIt-Anchor" href="#freebsd"></a> FreeBSD</h2><p>X11; FreeBSD (version no.) i386</p><p>X11; FreeBSD (version no.) AMD64</p><h2 id="linux"><a class="markdownIt-Anchor" href="#linux"></a> Linux</h2><p>X11; Linux ppc</p><p>X11; Linux ppc64</p><p>X11; Linux i686</p><p>X11; Linux x86_64</p><h2 id="mac"><a class="markdownIt-Anchor" href="#mac"></a> Mac</h2><p>Macintosh; PPC Mac OS X</p><p>Macintosh; Intel Mac OS X</p><h2 id="solaris"><a class="markdownIt-Anchor" href="#solaris"></a> Solaris</h2><p>X11; SunOS i86pc</p><p>X11; SunOS sun4u</p><h2 id="windows"><a class="markdownIt-Anchor" href="#windows"></a> Windows</h2><p>Windows NT 10.0 对应操作系统 windows 10</p><p>windows NT 6.2 对应操作系统 windows 8</p><p>Windows NT 6.1 对应操作系统 windows 7</p><p>Windows NT 6.0 对应操作系统 windows vista</p><p>Windows NT 5.2 对应操作系统 windows 2003</p><p>Windows NT 5.1 对应操作系统 windows xp</p><p>Windows NT 5.0 对应操作系统 windows 2000</p><p>Windows ME</p><p>Windows 98 (Windows NT 98)</p><h1 id="常用浏览器"><a class="markdownIt-Anchor" href="#常用浏览器"></a> 常用浏览器</h1><p>safari 5.1 – MAC<br />User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50</p><p>safari 5.1 – Windows<br />User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50</p><p>IE 9.0<br />User-Agent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;<br />IE 8.0<br />User-Agent:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)<br />IE 7.0<br />User-Agent:Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)<br />IE 6.0<br />User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)</p><p>Firefox 4.0.1 – MAC<br />User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1<br />Firefox 4.0.1 – Windows<br />User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1</p><p>Opera 11.11 – MAC<br />User-Agent:Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11<br />Opera 11.11 – Windows<br />User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11</p><p>Chrome 17.0 – MAC<br />User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11</p><h1 id="国产浏览器"><a class="markdownIt-Anchor" href="#国产浏览器"></a> 国产浏览器</h1><p>Maxthon<br />User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)<br />TT<br />User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)</p><p>The World 2.x<br />User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)</p><p>The World 3.x<br />User-Agent:?Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)</p><p>搜狗浏览器 1.x<br />User-Agent:?Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)</p><p>360SE<br />User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)</p><p>Avant<br />User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)</p><p>Green Browser<br />User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)</p><h1 id="移动设备端"><a class="markdownIt-Anchor" href="#移动设备端"></a> 移动设备端</h1><p>safari iOS 4.33 – iPhone<br />User-Agent:Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5<br />safari iOS 4.33 – iPod Touch<br />User-Agent:Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5<br />safari iOS 4.33 – iPad<br />User-Agent:Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8J2 Safari/6533.18.5<br />Android N1<br />User-Agent: Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1<br />Android QQ For android<br />User-Agent: MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1<br />Android Opera Mobile<br />User-Agent: Opera/9.80 (Android 2.3.4; Linux; Opera Mobi/build-1107180945; U; en-GB) Presto/2.8.149 Version/11.10<br />Android Pad Moto Xoom<br />User-Agent: Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13<br />BlackBerry<br />User-Agent: Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1+ (KHTML, like Gecko) Version/6.0.0.337 Mobile Safari/534.1+<br />WebOS HP Touchpad<br />User-Agent: Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.0; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/233.70 Safari/534.6 TouchPad/1.0<br />Nokia N97<br />User-Agent: Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/20.0.019; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) BrowserNG/7.1.18124<br />Windows Phone Mango<br />User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; HTC; Titan)</p><p>UC标准<br />User-Agent: NOKIA5700/ UCWEB7.0.2.37/28/999</p><p>UCOpenwave<br />User-Agent: Openwave/ UCWEB7.0.2.37/28/999</p><p>UC Opera<br />User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; ) Opera/UCWEB7.0.2.37/28/999</p>        <div id="aplayer-dAygYzRz" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;">            <pre class="aplayer-lrc-content"></pre>        </div>        <script>          var ap = new APlayer({            element: document.getElementById("aplayer-dAygYzRz"),            narrow: false,            autoplay: true,            showlrc: 3,            music: {              title: "Contact",              author: "Lulleaux/Giang Pham",              url: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/contact.mp3",              pic: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/contact.jpg",              lrc: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/contact.lrc"            }          });          window.aplayers || (window.aplayers = []);          window.aplayers.push(ap);        </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Internet Technology" scheme="http://lemonaaaaa.com/categories/Code-life/Internet-Technology/"/>
    
    
      <category term="爬虫" scheme="http://lemonaaaaa.com/tags/%E7%88%AC%E8%99%AB/"/>
    
      <category term="抓包" scheme="http://lemonaaaaa.com/tags/%E6%8A%93%E5%8C%85/"/>
    
  </entry>
  
  <entry>
    <title>UML 自学笔记</title>
    <link href="http://lemonaaaaa.com/2020/04/uml-notes/"/>
    <id>http://lemonaaaaa.com/2020/04/uml-notes/</id>
    <published>2020-04-18T03:20:56.000Z</published>
    <updated>2020-04-18T03:20:56.583Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h1 id="uml-简介"><a class="markdownIt-Anchor" href="#uml-简介"></a> UML 简介</h1><p>1997年，<font color=red>OMG</font>（<s>难道是Oh My God？</s>） 组织（Object Management Group对象管理组织）发布了<font color=red>统一建模语言（Unified Modeling Language，UML）</font>。UML 是一种编制软蓝图的标准化语言，它的目标之一就是为开发团队提供标准通用的设计语言来开发和构建计算机应用。UML 提出了一套 IT 专业人员期待多年的统一的标准建模符号。通过使用UML，这些人员能够阅读和交流系统架构和设计规划。UML支持面向对象的技术，能够准确的方便地表达面向对像的概念，体现面向对象的分析和设计风格。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/uml.jpg" alt="UML" /></p><h1 id="uml-模型"><a class="markdownIt-Anchor" href="#uml-模型"></a> UML 模型</h1><ul><li>事物(Things)：UML模型中最基本的构成元素，是具有代表性的成分的抽象</li><li>关系(Relationships)：关系把事物紧密联系在一起</li><li>图(Diagrams )：图是事物和关系的可视化表示</li></ul><h1 id="uml-特点"><a class="markdownIt-Anchor" href="#uml-特点"></a> UML 特点</h1><ul><li>面向对象</li><li>可视化，表达能力强</li><li>独立于过程</li><li>独立于程序设计</li><li>容易掌握使用</li></ul><h1 id="uml-概述"><a class="markdownIt-Anchor" href="#uml-概述"></a> UML 概述</h1><ul><li>UML 是 OMG 在1997年1月提出了创建由对象管理组和 UML1.0 规范草案；</li><li>UML 是一种为面向对象开发系统的产品进行说明、可视化、和编制文档的标准语言；</li><li>UML 作为一种模型语言，它使开发人员专注于建立产品的模型和结构，而不是选用什么程序语言和算法实现；</li><li>UML 是不同于其他常见的编程语言，如C + +，Java中，COBOL等，它是一种绘画语言，用来做软件蓝图；</li><li>UML 不是一种编程语言，但工具可用于生成各种语言的代码中使用UML图；</li><li>UML 可以用来建模非软件系统的处理流程，以及像在一个制造单元等.</li></ul><h1 id="uml-构建模块"><a class="markdownIt-Anchor" href="#uml-构建模块"></a> UML 构建模块</h1><h2 id="构建块的定义"><a class="markdownIt-Anchor" href="#构建块的定义"></a> 构建块的定义</h2><ul><li>事物</li><li>关系</li><li>图</li></ul><h3 id="事物"><a class="markdownIt-Anchor" href="#事物"></a> 事物</h3><ul><li>结构事物</li><li>行为事物</li><li>分组事物</li><li>注释事物</li></ul><h4 id="结构事物"><a class="markdownIt-Anchor" href="#结构事物"></a> 结构事物</h4><p>结构事物是模型中的静态部分，用以呈现概念或实体的表现元素，是软件建模中最常见的元素</p><ul><li>1.类</li></ul><p>类是指具有相同属性、方法、关系和语义的对象的集合。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/lei.png" alt="类" /></p><ul><li>2.接口</li></ul><p>接口是指类或组件所提供的服务（操作），描述了类或组件对外可见的动作。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/jiekou.png" alt="接口" /></p><ul><li>3.协作</li></ul><p>协作定义元素之间的相互作用。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/xiezuo.png" alt="协作" /></p><ul><li>4.用例</li></ul><p>用例定义了执行者（在系统外部和系统交互的人）和被考虑的系统之间的交互来实现的一个业务目标。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/yongli.png" alt="用例" /></p><ul><li>5.组件</li></ul><p>组件描述物理系统的一部分。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/zujian.png" alt="组件" /></p><ul><li>6.节点</li></ul><p>一个节点可以被定义为在运行时存在的物理元素。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/jiedian.png" alt="节点" /></p><h4 id="行为事物"><a class="markdownIt-Anchor" href="#行为事物"></a> 行为事物</h4><p>行为事物指的是 UML 模型中的动态部分，代表语句里的 “动词”，表示模型里随着时空不断变化的部分</p><ul><li>1.交互</li></ul><p>交互被定义为一种行为，包括一组元素之间的消息交换来完成特定的任务。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/jiaohu.png" alt="交互" /></p><ul><li>2.状态机</li></ul><p>状态机由一系列对象的状态组成，它是有用的，一个对象在其生命周期的状态是很重要的。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/zhuangtaiji.png" alt="状态机" /></p><h4 id="分组事物"><a class="markdownIt-Anchor" href="#分组事物"></a> 分组事物</h4><p>可以把分组事物看成是一个&quot;盒子&quot;，模型可以在其中被分解。目前只有一种分组事物，即包（package）。结构事物、动作事物甚至分组事物都有可能放在一个包中。包纯粹是概念上的，只存在于开发阶段，而组件在运行时存在。</p><ul><li>包</li></ul><p>封装是唯一一个分组事物可收集结构和行为的东西。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/bao.png" alt="包" /><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/baobiaoshi.png" alt="包" /></p><h4 id="注释事物"><a class="markdownIt-Anchor" href="#注释事物"></a> 注释事物</h4><p>注释事物可以被定义为一种机制来捕捉UML模型元素的言论，说明和注释。注释是唯一一个注释事物。</p><ul><li>注释</li></ul><p>注释用于渲染意见，约束等的UML元素。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/zhushi.png" alt="注释" /><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/zhushibiaoshi.png" alt="注释" /></p><h3 id="关系"><a class="markdownIt-Anchor" href="#关系"></a> 关系</h3><p>关系是另一个最重要的构建块UML，它显示元素是如何彼此相关联，此关联描述的一个应用程序的功能，UML中定义了依赖、协作、泛化、实现四种关系。</p><ul><li>1.依赖关系</li></ul><p>依赖是两件事物之间的语义联系，其中一个事物的变化也影响到另一个事物。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/yilai.png" alt="依赖" /></p><ul><li>2.协作</li></ul><p>一种描述一组对象之间连接的结构关系，如聚合关系（描述了整体和部分间的结构关系）。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/xiezuo2.png" alt="协作" /></p><ul><li>3.泛化</li></ul><p>泛化可以被定义为一个专门的元件连接关系与一个广义的元素，它基本上描述了在对象世界中的继承关系，是一种一般化-特殊化的关系。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/fanhua.png" alt="泛化" /></p><ul><li>4.实现</li></ul><p>类之间的语义关系，其中的一个类指定了由另一个类保证执行的契约。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/shixian.png" alt="实现" /></p><h3 id="图"><a class="markdownIt-Anchor" href="#图"></a> 图</h3><p>UML 图的整个讨论的最终输出所有要素，关系用于使一个完整的UML图，图中表示的系统。<br />UML 图的视觉效果是整个过程中最重要的部分。<br />图是事物集合的分类，UML 中包含多种图。</p><ol><li>类图：类图描述系统所包含的类、类的内部结构及类之间的关系；</li><li>对象图：对象图是类图的一个具体实例；</li><li>用例图：用例图从用户的角度出发描述系统的功能、需求，展示系统外部的各类角色与系统内部的各种用例之间的关系；</li><li>顺序图：顺序图表示对象之间动态合作的关系；</li><li>协作图：协作图描述对象之间的协作关系；</li><li>活动图：活动图描述系统中各种活动的执行顺序。</li><li>状态图：状态图描述一类对象的所有可能的状态以及事件发生时状态的转移条件；</li><li>部署关系图：部署关系图定义系统中软硬件的物理体系结构；</li><li>组件图：组件图描述代码部件的物理结构以及各部件之间的依赖关系；</li></ol><h1 id="uml-类图"><a class="markdownIt-Anchor" href="#uml-类图"></a> UML 类图</h1><blockquote><p>因为博主主要是学习<code>C++</code>面向对象程序设计，所以接下来，主要介绍UML图形标识中的类图。一个类图是由类和与之相关的各种静态关系共同组成的图形。类图展示的是软件模型的静态结构、类的内部结构以及和其他类的关系。通过类图，能够描述一部分面向对象的相关概念（如类、模板等）以及它们的相互关系。</p></blockquote><h2 id="类和对象"><a class="markdownIt-Anchor" href="#类和对象"></a> 类和对象</h2><p>类图中最基本的是要图形化描述类，要表示类的名称、数据成员和函数成员，以及各成员的访问控制属性。</p><p>在UML语言中，用一个由上而下分为3段的矩形来表示一个类。类名写在顶部区域，数据成员（UML中称为属性）在中间区域，函数成员（UML中称为操作）在底部区域。</p><p>比如说：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Clock</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"><span class="keyword">int</span> hour;</span><br><span class="line"><span class="keyword">int</span> minute;</span><br><span class="line"><span class="keyword">int</span> second;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">showTime</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">setTime</span><span class="params">(<span class="keyword">int</span> newH=<span class="number">0</span>,<span class="keyword">int</span> newM=<span class="number">0</span>,<span class="keyword">int</span> newS=<span class="number">0</span>)</span></span>;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/clocklei.png" alt="以clock类举例" /></p><h3 id="数据成员"><a class="markdownIt-Anchor" href="#数据成员"></a> 数据成员</h3><p>根据图的详细程度，每个数据成员可以包括其访问控制属性、名称、类型、默认值和约束特性，最简单的情况是只表示出它的名字，其余部分都是可选的。UML规定语法如下：<br /><code>[访问控制属性] 名称 [重数] [:类型] [=默认值] [{约束特性}]</code></p><p>至少指定数据成员的名称，其余都是可选的。</p><p>其中的访问控制属性可分为<code>Public</code>, <code>Private</code> 和 <code>Protected</code> 三种，分别对应于 UML 中的“<code>+</code>”、“<code>-</code>”和“<code>#</code>”。</p><h3 id="函数成员"><a class="markdownIt-Anchor" href="#函数成员"></a> 函数成员</h3><p>每个函数成员可以包括其访问控制属性、名称、参数表、返回类型和约束特性，最简单的情况是只表示出它的名字，其余部分都是可选的。UML规定语法如下：<br /><code>[访问控制属性] 名称 [(参数表)] [:返回类型] [{约束特性}]</code></p><p>至少指定函数成员的名称，其余都是可选的。</p><p>其中的访问控制属性可分为<code>Public</code>, <code>Private</code> 和 <code>Protected</code> 三种，分别对应于 UML 中的“<code>+</code>”、“<code>-</code>”和“<code>#</code>”。</p><h3 id="对象"><a class="markdownIt-Anchor" href="#对象"></a> 对象</h3><p>在UML语言中，用一个矩形来表示一个对象。对象的名字要加下划线。对象的全名写在图形的上部区域，由类名和对象名组成，其间用冒号隔开，表示方式为“对象名:类名”。在一些情况下，可以不出现对象名或类名。数据成员及其值表示在下面区域，数据成员是可选的。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/myclockduixiang.png" alt="以myClock对象举例" /></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/studentlei.png" alt="以student类举例" /> <img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/studentduixiang.png" alt="以student对象举例" /></p><h2 id="几种关系的图形标识"><a class="markdownIt-Anchor" href="#几种关系的图形标识"></a> 几种关系的图形标识</h2><h3 id="依赖关系"><a class="markdownIt-Anchor" href="#依赖关系"></a> 依赖关系</h3><p>类或对象之间的依赖描述了一个事物的变化可能会影响到使用它的另一个事物,反之不成立。当要表明一个类使用另一个类作为它的函数成员参数时，就使用依赖关系。通常类之间的调用关系.友元、类的实例化都属于这类关系。对于大多数依赖关系而言,简单的.不加修饰的依赖关系就足够了。然而,为了详述其含义的细微差别,UML定义了一些可以用于依赖关系的构造型。最常用的构造型是使用&lt;&lt; use &gt;&gt;。当需要表示两个类之间的使用关系时,要使用&lt;&lt; use &gt;&gt;构造型。</p><p>图4-6说明了如何表示类间的依赖关系,UML图形把依赖绘成一条指向被依赖的事物的虚线。图中的“类A”是源，“类B”是目标,表示“类A”使用了“类B”,或称“类A&quot;依赖“类B&quot;。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/yilaiguanxi.png" alt="依赖关系" /></p><h3 id="作用关系关联"><a class="markdownIt-Anchor" href="#作用关系关联"></a> 作用关系——关联</h3><p>关联用于表述一个类的对象和另一个类的对象之间相互作用的连接。在UML语言中,用实线来表示的两个类(或同一个类)之间的关联,在线段两端通常包含多重性(或称重数)。多重性可说是关联最重要的特性,关联一端的多重性表明:关联另一端类的每个对象要求与本端类的多少个对象发生作用。图4-7说明了在UML中对关联的表示。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/zuoyongguanxi.png" alt="作用关系" /></p><p>图中的“重数A&quot;决定了类B的每个对象与类A的多少个对象发生作用,同样“重数B”决定了类A的每个对象与类B的多少个对象发生作用。重数标记的形式和含义均列于表4-1中。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/chongshu.png" alt="重数" /></p><h3 id="包含关系聚集和组合"><a class="markdownIt-Anchor" href="#包含关系聚集和组合"></a> 包含关系——聚集和组合</h3><p>类或对象之间的包含关系在UML中由聚集和组合两个概念描述,它们是一种特殊的关联。UML中的聚集表示类之间的关系是整体与部分的关系，“包含”、“组成”、“分为…部分”等都是聚集关系。一条直线段有两个端点,这是聚集的一个例子。聚集可以进一步划分成共享聚集和组成聚集(简称组合)。</p><ul><li>例如,课题组包含许多成员,但是每个成员又可以是另一个课题组的成员,即部分可以参加多个整体,称之为共享聚集。</li><li>另一种情况是整体拥有各部分,部分与整体共存,如整体不存在了,部分也会随之消失,这称为组合。组合是一种简单聚集形式,但是它具有更强的拥有关系。例如，打开一个视窗口,它就由标题、外框和显示区所组成。在UML中,聚集表示为空心菱形,组合表示为实心菱形。</li></ul><p>图4-8说明了如何表示类的聚合和组合。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/jujihezuhe.png" alt="聚集和组合" /></p><h3 id="继承关系泛化"><a class="markdownIt-Anchor" href="#继承关系泛化"></a> 继承关系——泛化</h3><p>类之间的继承关系在UML中称为泛化,使用带有三角形标识的直线段表示这种继承关系，三角的一个尖指向父类,其对边上的线指向子类。图4-10说明了泛化关系。子类1说明单继承，子类2说明多继承。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/fanhuaguanxi.png" alt="泛化关系" /></p><h2 id="注释"><a class="markdownIt-Anchor" href="#注释"></a> 注释</h2><p>为了更生动地描述类、对象以及它们之间的关系,除了上述最基本的图形符号外，UMI还有一些辅助性的图形符号，下面介绍注释。</p><p>UML的注释是一种最重要的能够独立存在的修饰符号。注释是附加在元素或元素集上用来表示说明的图形符号。用注释可以为模型附加一些诸如说明、评述和注解等的信息。在UML图形上,注释表示为带有褶角的矩形,然后用虚线连接到UML的其他元素上,它是一种用于在图中附加文字注释的机制。</p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/uml-notes/zhushili.png" alt="注释" /></p><h1 id="结语"><a class="markdownIt-Anchor" href="#结语"></a> 结语</h1><p>引用其他博主的一句话：</p><p>UML的一切实际上就是为了交流。先编码后修复是错误的，先设计再纠错是正确的。</p><p>UML图是用来画出来找错误的，而不是要画一个完美的图形，无论是否正确，画图是用来记录和构思你的想法的，而不是一开始就是要画一个正确的图。</p>        <div id="aplayer-dVObqPcQ" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;">            <pre class="aplayer-lrc-content"></pre>        </div>        <script>          var ap = new APlayer({            element: document.getElementById("aplayer-dVObqPcQ"),            narrow: false,            autoplay: true,            showlrc: 3,            music: {              title: "All of the stars",              author: "Ed Sheeran",              url: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/allofthestars.mp3",              pic: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/x.jpg",              lrc: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/allofthestars.lrc"            }          });          window.aplayers || (window.aplayers = []);          window.aplayers.push(ap);        </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Object Oriented" scheme="http://lemonaaaaa.com/categories/Code-life/Object-Oriented/"/>
    
    
      <category term="UML" scheme="http://lemonaaaaa.com/tags/UML/"/>
    
      <category term="面向对象" scheme="http://lemonaaaaa.com/tags/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/"/>
    
  </entry>
  
  <entry>
    <title>2020 年的春天 油菜花照常开放</title>
    <link href="http://lemonaaaaa.com/2020/03/canola-flowers-2020/"/>
    <id>http://lemonaaaaa.com/2020/03/canola-flowers-2020/</id>
    <published>2020-03-01T05:29:11.000Z</published>
    <updated>2020-03-01T05:29:11.150Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>愿疫情早日结束……</p>        <div id="aplayer-cTRHgMEC" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;">            <pre class="aplayer-lrc-content"></pre>        </div>        <script>          var ap = new APlayer({            element: document.getElementById("aplayer-cTRHgMEC"),            narrow: false,            autoplay: true,            showlrc: 3,            music: {              title: "至此",              author: "房东的猫",              url: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/zhici.mp3",              pic: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/zhici.jpg",              lrc: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/zhici.lrc"            }          });          window.aplayers || (window.aplayers = []);          window.aplayers.push(ap);        </script><h1 id="蓝天"><a class="markdownIt-Anchor" href="#蓝天"></a> 蓝天</h1><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/20200301/1.jpg" alt="1" /></p><h1 id="花朵"><a class="markdownIt-Anchor" href="#花朵"></a> 花朵</h1><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/20200301/2.jpg" alt="2" /></p><h1 id="一望无际"><a class="markdownIt-Anchor" href="#一望无际"></a> 一望无际</h1><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/20200301/3.jpg" alt="3" /></p><h1 id="白房子"><a class="markdownIt-Anchor" href="#白房子"></a> 白房子</h1><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/20200301/4.jpg" alt="4" /></p><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/20200301/5.jpg" alt="5" /></p><h1 id="小船"><a class="markdownIt-Anchor" href="#小船"></a> 小船</h1><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/20200301/6.jpg" alt="6" /></p><h1 id="远方"><a class="markdownIt-Anchor" href="#远方"></a> 远方</h1><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/essay/20200301/7.jpg" alt="7" /></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Essay" scheme="http://lemonaaaaa.com/categories/Essay/"/>
    
      <category term="Travel" scheme="http://lemonaaaaa.com/categories/Essay/Travel/"/>
    
    
      <category term="风景" scheme="http://lemonaaaaa.com/tags/%E9%A3%8E%E6%99%AF/"/>
    
      <category term="油菜花" scheme="http://lemonaaaaa.com/tags/%E6%B2%B9%E8%8F%9C%E8%8A%B1/"/>
    
      <category term="旅行" scheme="http://lemonaaaaa.com/tags/%E6%97%85%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>Codeforces Round 624 (Div. 3) 题解</title>
    <link href="http://lemonaaaaa.com/2020/02/codeforces-round-624-div3/"/>
    <id>http://lemonaaaaa.com/2020/02/codeforces-round-624-div3/</id>
    <published>2020-02-25T15:56:24.000Z</published>
    <updated>2020-04-17T12:59:30.116Z</updated>
    
    <content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>还是div. 3比较适合我这种菜，不过最后一道题一个细节没调出来真的可惜了。</p><h1 id="a-add-odd-or-subtract-even"><a class="markdownIt-Anchor" href="#a-add-odd-or-subtract-even"></a> A. Add Odd or Subtract Even</h1><blockquote><p><a href="https://codeforces.com/contest/1311/problem/A" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文"><a class="markdownIt-Anchor" href="#题目原文"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1311A.jpg" alt="1311A" /></p><h2 id="题目大意"><a class="markdownIt-Anchor" href="#题目大意"></a> 题目大意</h2><p>给出 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">a</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math><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.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span> 两个正整数。每一次操作，你可以将 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">a</span></span></span></span> 做以下两种操作之一：</p><ul><li>任选一个正奇数 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">x</span></span></span></span> ，将 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">a</span></span></span></span> 加上 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">x</span></span></span></span> 。</li><li>任选一个正偶数 <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03588em;">y</span></span></span></span> ，将 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">a</span></span></span></span> 减去 <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.03588em;">y</span></span></span></span> 。</li></ul><p>问至少操作多少次，可以使 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">a</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math><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.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span> 的值相等。</p><h2 id="思路"><a class="markdownIt-Anchor" href="#思路"></a> 思路</h2><p>容易发现，有以下几种情况：</p><ol><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>=</mo><mo>=</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">a==b</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 mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">=</span></span><span class="base"><span class="strut" style="height:0.36687em;vertical-align:0em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span> ，答案为 <span class="katex"><span class="katex-mathml"><math><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> 。</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>&lt;</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">a&lt;b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span> 。如果 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">a</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math><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.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span> 的差值是奇数，那么直接加上一个正奇数就可，答案为 <span class="katex"><span class="katex-mathml"><math><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><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> ，加两次正奇数或者加一次正奇数再减一次正偶数。</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>a</mi><mo>&gt;</mo><mi>b</mi></mrow><annotation encoding="application/x-tex">a&gt;b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mord mathdefault">a</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.69444em;vertical-align:0em;"></span><span class="mord mathdefault">b</span></span></span></span> 。与2.同理且相反。</li></ol><h2 id="代码"><a class="markdownIt-Anchor" href="#代码"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstdio &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstring &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; algorithm &amp;gt;</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> T,x,y;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld%lld"</span>,&amp;x,&amp;y);</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans;</span><br><span class="line"><span class="keyword">if</span>(x==y) ans=<span class="number">0</span>;</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span>(x &amp;lt; y)</span><br><span class="line">  &#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> temp=y-x;</span><br><span class="line"><span class="keyword">if</span>(temp&amp;<span class="number">1</span>) ans=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">else</span> ans=<span class="number">2</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> temp=x-y;</span><br><span class="line"><span class="keyword">if</span>(temp&amp;<span class="number">1</span>) ans=<span class="number">2</span>;</span><br><span class="line"><span class="keyword">else</span> ans=<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="b-weirdsort"><a class="markdownIt-Anchor" href="#b-weirdsort"></a> B. WeirdSort</h1><blockquote><p><a href="https://codeforces.com/contest/1311/problem/B" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-2"><a class="markdownIt-Anchor" href="#题目原文-2"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1311B.jpg" alt="1311B" /></p><h2 id="题目大意-2"><a class="markdownIt-Anchor" href="#题目大意-2"></a> 题目大意</h2><p>给出 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span> 个数和 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">m</span></span></span></span> 个位置 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>p</mi><mi>o</mi><msub><mi>s</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">pos_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 mathdefault">p</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault">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 mathdefault 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><semantics><mrow><mi>p</mi><mi>o</mi><msub><mi>s</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">pos_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 mathdefault">p</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault">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 mathdefault 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><semantics><mrow><mi>p</mi><mi>o</mi><msub><mi>s</mi><mi>i</mi></msub><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">pos_i+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7777700000000001em;vertical-align:-0.19444em;"></span><span class="mord mathdefault">p</span><span class="mord mathdefault">o</span><span class="mord"><span class="mord mathdefault">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 mathdefault 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.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><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 mathdefault">n</span></span></span></span> 个数以非递减顺序排列。</p><h2 id="思路-2"><a class="markdownIt-Anchor" href="#思路-2"></a> 思路</h2><p>最开始还没有思路，把C题做了回来一想，因为冒泡排序的思想，所以同一块（可以交换的连通块）中的顺序是任意的，所以直接对每一内部可以互相交换的块内部排序，最后验证序列是否非递减即可。</p><h2 id="代码-2"><a class="markdownIt-Anchor" href="#代码-2"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstdio &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstring &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; algorithm &amp;gt;</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">105</span>;</span><br><span class="line"><span class="keyword">int</span> T,n,m,p[maxn],a[maxn];</span><br><span class="line"><span class="keyword">bool</span> vis[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">memset</span>(vis,<span class="literal">false</span>,<span class="keyword">sizeof</span>(vis));</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;n,&amp;m);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i]);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,x;i&lt;=m;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;x);</span><br><span class="line">vis[x]=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> s=i,t=i;</span><br><span class="line"><span class="keyword">while</span>(vis[t]) t++;</span><br><span class="line">sort(a+s,a+t+<span class="number">1</span>);</span><br><span class="line">i=t;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">bool</span> flag=<span class="literal">false</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">2</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(a[i]&lt;a[i<span class="number">-1</span>]) flag=<span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(flag) <span class="built_in">printf</span>(<span class="string">"NO\n"</span>);</span><br><span class="line"><span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">"YES\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="c-perform-the-combo"><a class="markdownIt-Anchor" href="#c-perform-the-combo"></a> C. Perform the Combo</h1><blockquote><p><a href="https://codeforces.com/contest/1311/problem/C" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-3"><a class="markdownIt-Anchor" href="#题目原文-3"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1311C.jpg" alt="1311C" /></p><h2 id="题目大意-3"><a class="markdownIt-Anchor" href="#题目大意-3"></a> 题目大意</h2><p>给出一个字符串，要求枚举一遍该字符串，再给出 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">m</span></span></span></span> 个错误操作，每次遇到错误操作就会从头开始重新枚举。求最后执行完 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">m</span></span></span></span> 个错误操作后，26个小写字母每个都被枚举了多少遍。</p><h2 id="思路-3"><a class="markdownIt-Anchor" href="#思路-3"></a> 思路</h2><p>直接前缀和，每次 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(1)</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 mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span> 查询，时间复杂度 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>t</mi><mo>⋅</mo><mi>m</mi><mi>a</mi><mi>x</mi><mo stretchy="false">(</mo><mi>n</mi><mo separator="true">,</mo><mi>m</mi><mo stretchy="false">)</mo><mo>⋅</mo><mn>26</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(t\cdot max(n,m)\cdot26)</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 mathdefault" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mord mathdefault">t</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:1em;vertical-align:-0.25em;"></span><span class="mord mathdefault">m</span><span class="mord mathdefault">a</span><span class="mord mathdefault">x</span><span class="mopen">(</span><span class="mord mathdefault">n</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.16666666666666666em;"></span><span class="mord mathdefault">m</span><span class="mclose">)</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:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mord">6</span><span class="mclose">)</span></span></span></span> 。</p><h2 id="代码-3"><a class="markdownIt-Anchor" href="#代码-3"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstdio &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstring &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; algorithm &amp;gt;</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="keyword">int</span> cnt[maxn][<span class="number">26</span>];</span><br><span class="line"><span class="keyword">char</span> s[maxn];</span><br><span class="line"><span class="keyword">int</span> p[maxn],n,m,T;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans[<span class="number">26</span>];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;n,&amp;m);</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%s"</span>,s+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j&lt;<span class="number">26</span>;j++) cnt[i][j]=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) cnt[i][s[i]-<span class="string">'a'</span>]++;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j&lt;<span class="number">26</span>;j++) cnt[i][j]+=cnt[i<span class="number">-1</span>][j];</span><br><span class="line"><span class="built_in">memset</span>(ans,<span class="number">0</span>,<span class="keyword">sizeof</span>(ans));</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>,x;i&lt;=m;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;x);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">0</span>;j&lt;<span class="number">26</span>;j++) ans[j]+=cnt[x][j];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">26</span>;i++) ans[i]+=cnt[n][i];</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">26</span>;i++) <span class="built_in">printf</span>(<span class="string">"%lld "</span>,ans[i]);</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="d-three-integers"><a class="markdownIt-Anchor" href="#d-three-integers"></a> D. Three Integers</h1><blockquote><p><a href="https://codeforces.com/contest/1311/problem/D" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-4"><a class="markdownIt-Anchor" href="#题目原文-4"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1311D.jpg" alt="1311D" /></p><h2 id="题目大意-4"><a class="markdownIt-Anchor" href="#题目大意-4"></a> 题目大意</h2><p>给出 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">A</span></span></span></span> , <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span> , <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi></mrow><annotation encoding="application/x-tex">C</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 mathdefault" style="margin-right:0.07153em;">C</span></span></span></span> 三个正整数，每次可以将这三个数任意一个数加上 <span class="katex"><span class="katex-mathml"><math><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><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><semantics><mrow><mi>C</mi></mrow><annotation encoding="application/x-tex">C</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 mathdefault" style="margin-right:0.07153em;">C</span></span></span></span> 能被 <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span> 整除， <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span> 能被 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">A</span></span></span></span> 整除。</p><h2 id="思路-4"><a class="markdownIt-Anchor" href="#思路-4"></a> 思路</h2><p>因为数据范围是 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><mn>10000</mn></mrow><annotation encoding="application/x-tex">10000</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></span></span> ，直接枚举 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">A</span></span></span></span> ，再枚举 <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span> ，<span class="katex"><span class="katex-mathml"><math><semantics><mrow><mi>C</mi></mrow><annotation encoding="application/x-tex">C</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 mathdefault" style="margin-right:0.07153em;">C</span></span></span></span> 就不要枚举了，直接除以枚举的 <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05017em;">B</span></span></span></span> ，直接取最近的值就好。</p><h2 id="代码-4"><a class="markdownIt-Anchor" href="#代码-4"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstdio &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstring &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; algorithm &amp;gt;</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="meta">#<span class="meta-keyword">ifdef</span> lemon</span></span><br><span class="line">freopen(<span class="string">"D.txt"</span>,<span class="string">"r"</span>,<span class="built_in">stdin</span>);</span><br><span class="line"><span class="meta">#<span class="meta-keyword">endif</span></span></span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> T,a,b,c;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%lld%lld%lld"</span>,&amp;a,&amp;b,&amp;c);</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans=<span class="number">1e18</span>,ansa,ansb,ansc;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">long</span> <span class="keyword">long</span> i=<span class="number">1</span>;i&lt;=<span class="number">10000</span>;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">long</span> <span class="keyword">long</span> j=<span class="number">1</span>;j&lt;=<span class="number">10000</span>;j++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(i*j&gt;<span class="number">50000</span>) <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> temp=<span class="number">0</span>,tempa,tempb,tempc;</span><br><span class="line">temp+=<span class="built_in">abs</span>(a-i)+<span class="built_in">abs</span>(b-i*j);</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> p=c/(i*j);</span><br><span class="line">tempa=i;tempb=i*j;</span><br><span class="line"><span class="keyword">if</span>(p==<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line">temp+=<span class="built_in">abs</span>(c-i*j);</span><br><span class="line">tempc=i*j;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">abs</span>(c-i*j*p)&lt;<span class="built_in">abs</span>(c-i*j*(p+<span class="number">1</span>)))</span><br><span class="line">&#123;</span><br><span class="line">temp+=<span class="built_in">abs</span>(c-i*j*p);</span><br><span class="line">tempc=i*j*p;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">temp+=<span class="built_in">abs</span>(c-i*j*(p+<span class="number">1</span>));</span><br><span class="line">tempc=i*j*(p+<span class="number">1</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(temp &amp;lt; ans)</span><br><span class="line">&#123;</span><br><span class="line">ans=temp;</span><br><span class="line">ansa=tempa;</span><br><span class="line">ansb=tempb;</span><br><span class="line">ansc=tempc;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n%lld %lld %lld\n"</span>,ans,ansa,ansb,ansc);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="e-construct-the-binary-tree"><a class="markdownIt-Anchor" href="#e-construct-the-binary-tree"></a> E. Construct the Binary Tree</h1><blockquote><p><a href="https://codeforces.com/contest/1311/problem/E" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-5"><a class="markdownIt-Anchor" href="#题目原文-5"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1311E.jpg" alt="1311E" /></p><h2 id="题目大意-5"><a class="markdownIt-Anchor" href="#题目大意-5"></a> 题目大意</h2><p>给出 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">d</span></span></span></span> ，求问存不存在 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span> 个点的二叉树，其所有节点的深度之和为 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">d</span></span></span></span> ，如果存在，需要输出每一个节点的父节点（根节点为 <span class="katex"><span class="katex-mathml"><math><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><h2 id="思路-5"><a class="markdownIt-Anchor" href="#思路-5"></a> 思路</h2><p>先把 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span> 个点连成一条链，再不断地从链尾取下点按深度递增的顺序加在某些点后即可。</p><h2 id="代码-5"><a class="markdownIt-Anchor" href="#代码-5"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstdio &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstring &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; algorithm &amp;gt;</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">5005</span>;</span><br><span class="line"><span class="keyword">int</span> T,n,d;</span><br><span class="line"><span class="keyword">int</span> point[maxn][maxn],fa[maxn],cnt[maxn];</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;T);</span><br><span class="line"><span class="keyword">while</span>(T--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d%d"</span>,&amp;n,&amp;d);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i &amp;lt; n;i++)</span><br><span class="line">&#123;</span><br><span class="line">fa[i+<span class="number">1</span>]=i;</span><br><span class="line">cnt[i]=<span class="number">1</span>;</span><br><span class="line">point[i][<span class="number">0</span>]=i+<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> res=n*(n<span class="number">-1</span>)/<span class="number">2</span>-d;</span><br><span class="line"><span class="keyword">if</span>(res&lt;<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"NO\n"</span>);</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">int</span> depth=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=n<span class="number">-1</span>;i;i--)</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">int</span> delta=min(i-depth,res);</span><br><span class="line">res-=delta;</span><br><span class="line"><span class="keyword">int</span> pos=i-delta;</span><br><span class="line">fa[i+<span class="number">1</span>]=point[pos<span class="number">-1</span>][cnt[pos]/<span class="number">2</span>];</span><br><span class="line">point[pos][cnt[pos]++]=i+<span class="number">1</span>;</span><br><span class="line"><span class="keyword">if</span>(cnt[pos]&gt;=(<span class="number">1</span> &amp;lt; &amp;lt; depth)) depth++;</span><br><span class="line"><span class="keyword">if</span>(!res) <span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(res!=<span class="number">0</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"NO\n"</span>);</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"YES\n"</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">2</span>;i&lt;=n;i++) <span class="built_in">printf</span>(<span class="string">"%d "</span>,fa[i]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="f-moving-points"><a class="markdownIt-Anchor" href="#f-moving-points"></a> F. Moving Points</h1><blockquote><p><a href="https://codeforces.com/contest/1311/problem/F" target="_blank" rel="noopener">题目链接</a></p></blockquote><h2 id="题目原文-6"><a class="markdownIt-Anchor" href="#题目原文-6"></a> 题目原文</h2><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/problems/1311F.jpg" alt="1311F" /></p><h2 id="题目大意-6"><a class="markdownIt-Anchor" href="#题目大意-6"></a> 题目大意</h2><p>在 <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.07847em;">X</span></span></span></span> 轴上有 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">n</span></span></span></span> 个点，每个点有一个初始坐标 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_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 mathdefault">x</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 mathdefault 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><semantics><mrow><msub><mi>v</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">v_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 mathdefault" style="margin-right:0.03588em;">v</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.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault 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><h2 id="思路-6"><a class="markdownIt-Anchor" href="#思路-6"></a> 思路</h2><p>感觉这道题的变形都有好多了，看完题就知道肯定是和时间没有关系的。</p><p>所以对于任意两个点 <span class="katex"><span class="katex-mathml"><math><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 mathdefault">i</span></span></span></span> , <span class="katex"><span class="katex-mathml"><math><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 mathdefault" style="margin-right:0.05724em;">j</span></span></span></span> ，假使 <span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>x</mi><mi>i</mi></msub><mo>&lt;</mo><msub><mi>x</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">x_i&lt;x_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6891em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</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 mathdefault 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">&lt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault">x</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 mathdefault mtight" style="margin-right:0.05724em;">j</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>  分两种情况讨论：</p><ul><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>v</mi><mi>i</mi></msub><mo>≤</mo><msub><mi>v</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">v_i\leq v_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7859700000000001em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">v</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.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault 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.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">v</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:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</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><semantics><mrow><msub><mi>x</mi><mi>j</mi></msub><mo>−</mo><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_j-x_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8694379999999999em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault">x</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 mathdefault mtight" style="margin-right:0.05724em;">j</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.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.58056em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault">x</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 mathdefault 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> 。</li><li><span class="katex"><span class="katex-mathml"><math><semantics><mrow><msub><mi>v</mi><mi>i</mi></msub><mo>&gt;</mo><msub><mi>v</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">v_i&gt;v_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6891em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">v</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.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault 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">&gt;</span><span class="mspace" style="margin-right:0.2777777777777778em;"></span></span><span class="base"><span class="strut" style="height:0.716668em;vertical-align:-0.286108em;"></span><span class="mord"><span class="mord mathdefault" style="margin-right:0.03588em;">v</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:-0.03588em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathdefault mtight" style="margin-right:0.05724em;">j</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><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> 。</li></ul><p>所以我们先对初始位置从小到大排序，再对速度离散化，用树状数组或者线段树维护一个前缀和，就好了。我没调出来的原因是计数的时候乘错地方了（后悔死）。</p><h2 id="代码-6"><a class="markdownIt-Anchor" href="#代码-6"></a> 代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstdio &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; cstring &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span> &amp;lt; algorithm &amp;gt;</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> lowbit(x) (x&amp;(-x))</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> <span class="built_in">std</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="keyword">int</span> maxn=<span class="number">200005</span>;</span><br><span class="line"><span class="class"><span class="keyword">struct</span> <span class="title">node</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line"><span class="keyword">int</span> x,v;</span><br><span class="line">&#125; a[maxn];</span><br><span class="line"><span class="function"><span class="keyword">bool</span> <span class="title">cmp</span><span class="params">(node a,node b)</span> </span>&#123;<span class="keyword">return</span> a.x&lt;b.x;&#125;</span><br><span class="line"><span class="keyword">int</span> cnt[maxn],n,b[maxn];</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> val[maxn];</span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">int</span> x,<span class="keyword">int</span> v)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=x;i&lt;=n;i+=lowbit(i))</span><br><span class="line">&#123;</span><br><span class="line">cnt[i]++;</span><br><span class="line">val[i]+=(<span class="keyword">long</span> <span class="keyword">long</span>)v;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">get</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> temp=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=x;i;i-=lowbit(i)) temp+=val[i];</span><br><span class="line"><span class="keyword">return</span> temp;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">long</span> <span class="keyword">long</span> <span class="title">getc</span><span class="params">(<span class="keyword">int</span> x)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> temp=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=x;i;i-=lowbit(i)) temp+=cnt[i];</span><br><span class="line"><span class="keyword">return</span> temp;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;n);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) <span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i].x);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line"><span class="built_in">scanf</span>(<span class="string">"%d"</span>,&amp;a[i].v);</span><br><span class="line">b[i]=a[i].v;</span><br><span class="line">&#125;</span><br><span class="line">sort(b+<span class="number">1</span>,b+n+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">int</span> cnt=unique(b+<span class="number">1</span>,b+n+<span class="number">1</span>)-(b+<span class="number">1</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++) a[i].v=lower_bound(b+<span class="number">1</span>,b+cnt+<span class="number">1</span>,a[i].v)-b;</span><br><span class="line">sort(a+<span class="number">1</span>,a+n+<span class="number">1</span>,cmp);</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">1</span>;i&lt;=n;i++)</span><br><span class="line">&#123;</span><br><span class="line">ans+=a[i].x*getc(a[i].v)-get(a[i].v);</span><br><span class="line">add(a[i].v,a[i].x);</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld\n"</span>,ans);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><img src="https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/img/codeforces/standings/round-624.jpg" alt="round-624" /></p>        <div id="aplayer-VHVLtOxE" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;">            <pre class="aplayer-lrc-content"></pre>        </div>        <script>          var ap = new APlayer({            element: document.getElementById("aplayer-VHVLtOxE"),            narrow: false,            autoplay: true,            showlrc: 3,            music: {              title: "马德里不思议",              author: "蔡依林",              url: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/madelibusiyi.mp3",              pic: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/wuniang.jpg",              lrc: "https://cdn.jsdelivr.net/gh/lemonaaaaa/CDN/music/madelibusiyi.lrc"            }          });          window.aplayers || (window.aplayers = []);          window.aplayers.push(ap);        </script>]]></content>
    
    <summary type="html">
    
      
      
        &lt;link rel=&quot;stylesheet&quot; class=&quot;aplayer-secondary-style-marker&quot; href=&quot;\assets\css\APlayer.min.css&quot;&gt;&lt;script src=&quot;\assets\js\APlayer.min.js&quot; cla
      
    
    </summary>
    
    
      <category term="Code life" scheme="http://lemonaaaaa.com/categories/Code-life/"/>
    
      <category term="Codeforces" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/"/>
    
      <category term="Round" scheme="http://lemonaaaaa.com/categories/Code-life/Codeforces/Round/"/>
    
    
      <category term="algorithms" scheme="http://lemonaaaaa.com/tags/algorithms/"/>
    
      <category term="contests" scheme="http://lemonaaaaa.com/tags/contests/"/>
    
      <category term="模拟" scheme="http://lemonaaaaa.com/tags/%E6%A8%A1%E6%8B%9F/"/>
    
      <category term="思维" scheme="http://lemonaaaaa.com/tags/%E6%80%9D%E7%BB%B4/"/>
    
      <category term="字符串" scheme="http://lemonaaaaa.com/tags/%E5%AD%97%E7%AC%A6%E4%B8%B2/"/>
    
      <category term="树" scheme="http://lemonaaaaa.com/tags/%E6%A0%91/"/>
    
      <category term="前缀和" scheme="http://lemonaaaaa.com/tags/%E5%89%8D%E7%BC%80%E5%92%8C/"/>
    
      <category term="二叉树" scheme="http://lemonaaaaa.com/tags/%E4%BA%8C%E5%8F%89%E6%A0%91/"/>
    
      <category term="树状数组" scheme="http://lemonaaaaa.com/tags/%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84/"/>
    
      <category term="数据结构" scheme="http://lemonaaaaa.com/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
  </entry>
  
</feed>
