<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[QuarterGeek]]></title>
  <link href="https://quartergeek.com/atom.xml" rel="self"/>
  <link href="https://quartergeek.com/"/>
  <updated>2015-10-18T12:25:38+08:00</updated>
  <id>https://quartergeek.com/</id>
  <author>
    <name><![CDATA[Lequn Chen]]></name>
    <email><![CDATA[chenlequn22@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[[Codeforces Round 193 (Div. 2)] C. Students Revenge]]></title>
    <link href="https://quartergeek.com/cf332c/"/>
    <updated>2013-11-06T00:00:00+08:00</updated>
    <id>https://quartergeek.com/cf332c</id>
    <content type="html"><![CDATA[<p>非常厉害的一题贪心题。Orz Lazycal。题目大意是：</p>
<ul>
<li>有 <code>n</code> 条命令，你要从中选出恰好 <code>p</code> 条命令作为候选命令，然后主席会从中选出恰好 <code>k</code> 条命令执行。</li>
<li>每条命令有两个属性：如果执行那么主席的会变白的头发数 <code>Ai</code>，如果不执行那么委员会的不满意指数 <code>Bi</code> 。</li>
<li>对于主席来说，她首先希望不执行的那 <code>p-k</code> 条给委员会带来的不满意指数最小，然后希望那 <code>k</code> 条命令使自己变白的头发最少。</li>
<li>对于你来说（，由于某些原因），你首先希望主席变白的头发最多，然后希望委员会的不满意指数最大。</li>
<li>现在让你求应该选出哪 <code>p</code> 条命令。</li>
</ul>
<p>分析一下：首先我们不能很high地直接把 <code>Ai</code> 最大的 <code>k</code> 条选出来，因为很有可能剩下的 <code>p-k</code> 条会使得我们取不到最好情况。实质上，我们和主席的价值观不一样，所以会导致直接取最大失败。我们应该设下挖坑让主席跳下去，我们可以先确定可被选到的最凶残的 <code>k</code> 条，让主席不得不选它们，然后再考虑剩下的 <code>p-k</code> 使得委员会不满意指数最大，同时又不影响主席选择那 <code>k</code> 条。我们不妨从主席的角度考虑。</p>
<p>我们<strong>把 <code>n</code> 条命令按照主席的意愿 <code>(-Bi, +Ai)</code> 排序</strong>，那么主席就会按照排序后的顺序从前到后选取命令来执行。注意到最后的 <code>p-k</code> 条命令我们是没必要选出来的，因为选了这其中的任意一条，都会被主席放在最后（很有可能不执行），然后就算这几条的 <code>Ai</code> 再大，也发挥不了用处。</p>
<p>好了，我们知道了主席的顺序，现在我们想让主席的头发白掉，所以我们<strong>把前 <code>n-(p-k)</code> 条命令按照我们的意愿 <code>(-Ai)</code> 稳定排序</strong>。选出前 <code>k</code> 条，这就是主席必选的 <code>k</code> 条。</p>
<p>现在我们考虑选出剩下的 <code>p-k</code> 条，这 <code>p-k</code> 条不能影响到前面 <code>k</code> 条的选取。因此我们可以先找到 <code>k</code> 条必选命令中，主席最后执行的命令是哪条（也就是第一次排序的结果中最靠后的），然后从这条后面选取。显然，在保证不会影响 <code>k</code> 条的情况下，我们<strong>按我们的意愿 <code>(-Bi)</code> 排序</strong>选出剩下的 <code>p-k</code> 条即可！</p>
<!--more-->

<h2 id="代码">代码</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>Codeforces 332 C</span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'><span class="k">using</span> <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">100000</span><span class="p">;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Order</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">hair</span><span class="p">,</span> <span class="n">anger</span><span class="p">,</span> <span class="n">index</span><span class="p">,</span> <span class="n">_i</span><span class="p">;</span> <span class="p">};</span>
</span><span class='line'><span class="n">Order</span> <span class="n">a</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">b</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">k</span><span class="p">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">k</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">hair</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">anger</span><span class="p">);</span>
</span><span class='line'>    <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">index</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">sort</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">a</span><span class="o">+</span><span class="n">n</span><span class="p">,</span> <span class="p">[](</span><span class="k">const</span> <span class="n">Order</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Order</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span> <span class="k">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">anger</span> <span class="o">&gt;</span> <span class="n">rhs</span><span class="p">.</span><span class="n">anger</span> <span class="o">||</span> <span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">anger</span> <span class="o">==</span> <span class="n">rhs</span><span class="p">.</span><span class="n">anger</span> <span class="o">&amp;&amp;</span> <span class="n">lhs</span><span class="p">.</span><span class="n">hair</span> <span class="o">&lt;</span> <span class="n">rhs</span><span class="p">.</span><span class="n">hair</span><span class="p">);</span> <span class="p">});</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">-</span><span class="n">p</span><span class="o">+</span><span class="n">k</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">hair</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">anger</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">index</span><span class="p">,</span> <span class="n">i</span><span class="p">};</span>
</span><span class='line'>  <span class="n">sort</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">b</span><span class="o">+</span><span class="n">n</span><span class="o">-</span><span class="n">p</span><span class="o">+</span><span class="n">k</span><span class="p">,</span> <span class="p">[](</span><span class="k">const</span> <span class="n">Order</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Order</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span> <span class="k">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">hair</span> <span class="o">&gt;</span> <span class="n">rhs</span><span class="p">.</span><span class="n">hair</span> <span class="o">||</span> <span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">hair</span> <span class="o">==</span> <span class="n">rhs</span><span class="p">.</span><span class="n">hair</span> <span class="o">&amp;&amp;</span> <span class="n">lhs</span><span class="p">.</span><span class="n">_i</span> <span class="o">&lt;</span> <span class="n">rhs</span><span class="p">.</span><span class="n">_i</span><span class="p">);</span> <span class="p">});</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">latest</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">k</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">latest</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">latest</span><span class="p">,</span> <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">_i</span><span class="p">);</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d &quot;</span><span class="p">,</span> <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">index</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">sort</span><span class="p">(</span><span class="n">a</span><span class="o">+</span><span class="n">latest</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">a</span><span class="o">+</span><span class="n">n</span><span class="p">,</span> <span class="p">[](</span><span class="k">const</span> <span class="n">Order</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Order</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span> <span class="k">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">anger</span> <span class="o">&gt;</span> <span class="n">rhs</span><span class="p">.</span><span class="n">anger</span><span class="p">;</span> <span class="p">});</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">p</span><span class="o">-</span><span class="n">k</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d &quot;</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">latest</span><span class="o">+</span><span class="mi">1</span><span class="o">+</span><span class="n">i</span><span class="p">].</span><span class="n">index</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[TYVJ1319]count]]></title>
    <link href="https://quartergeek.com/1319-count/"/>
    <updated>2013-06-18T00:00:00+08:00</updated>
    <id>https://quartergeek.com/1319-count</id>
    <content type="html"><![CDATA[<p>题目大概就是说，让你根据下面规则，生成字符串<span class="math">\(S_n\)</span>，然后求出一个模式串在<span class="math">\(S_n\)</span>中出现次数：</p>
<p><span class="math">\[
\begin{eqnarray*}
S_0 &amp;=&amp; 0\\
S_1 &amp;=&amp; 1\\
S_n &amp;=&amp; S_{n-2} S_{n-1}
\end{eqnarray*}
\]</span></p>
<p>这题好像是吴翼出的NOIP模拟题，十分的厉害（真心不是NOIP难度啊）。一眼看到这题和这题的数据范围，我就冒出了矩阵和KMP这两个想法，但是看到模式串长度<span class="math">\(M \leq 10000\)</span>，完全不懂得如何写递推式了……</p>
<p>后来Orz了一下xietutu的题解，发现这题有个非常巧妙的转化。</p>
<p>设<span class="math">\(F_n\)</span>为<span class="math">\(S_n\)</span>中模式串出现的次数，显然有<span class="math">\(F_n=F_{n-2}+F_{n-1}+C_n\)</span>，其中<span class="math">\(C_n\)</span>就是拼接产生的匹配。这个还是很显然的，大家都想得到，但是这个<span class="math">\(C_n\)</span>如何搞到还真是一个问题。</p>
<p>要搞到<span class="math">\(C_n\)</span>还是得利用KMP。我们在对<span class="math">\(S_n\)</span>这个串做KMP的时候，可以发现，如果在<span class="math">\(i\)</span>这个位置匹配是<span class="math">\(S_{n-2} S_{n-1}\)</span>拼接产生的匹配，那么<span class="math">\(i-M+1 \leq len(S_{n-2}) &lt; i\)</span>。这样我们就利用了KMP求出了<span class="math">\(C_n\)</span>。</p>
<p>最神的地方在于：存在一个正整数<span class="math">\(\alpha\)</span>，使得对任意<span class="math">\(2n\geq\alpha\)</span>，都有<span class="math">\(C_{2n} = C_\alpha\)</span>和<span class="math">\(C_{2n+1} = C_{\alpha+1}\)</span>成立。更形象的说，就是当串<span class="math">\(S_n\)</span>的长度达到一定程度的时候，那么拼接产生的匹配的次数将只由<span class="math">\(n\)</span>的奇偶决定，分别为一个定值。这个还是非常好理解的。</p>
<p>那么分奇偶如何能矩阵乱搞呢？注意到</p>
<p><span class="math">\[
\begin{eqnarray*}
F_n &amp;=&amp; F_{n-2} + F_{n-1} + t_1\\
F_{n-1} &amp;=&amp; F_{n-3} + F_{n-2} + t_2
\end{eqnarray*}
\]</span></p>
<p>那么我们两个式子相加一下，就可以得到</p>
<p><span class="math">\[
F_n = F_{n-3} + 2F_{n-2} + t_1 + t_2
\]</span></p>
<p>我们分奇偶求出了<span class="math">\(t_1\)</span>和<span class="math">\(t_2\)</span>之后，就可以构造出如下矩阵了：</p>
<p><span class="math">\[
\begin{bmatrix}
F_n\\ 
F_{n-1}\\
F_{n-2}\\ 
t_1 + t_2
\end{bmatrix}
=
\begin{bmatrix}
0 &amp; 2 &amp; 1 &amp; 1\\ 
1 &amp; 0 &amp; 0 &amp; 0\\ 
0 &amp; 1 &amp; 0 &amp; 0\\ 
0 &amp; 0 &amp; 0 &amp; 1
\end{bmatrix}
\begin{bmatrix}
F_{n-1}\\ 
F_{n-2}\\
F_{n-3}\\ 
t_1 + t_2
\end{bmatrix}\\
=
\begin{bmatrix}
0 &amp; 2 &amp; 1 &amp; 1\\ 
1 &amp; 0 &amp; 0 &amp; 0\\ 
0 &amp; 1 &amp; 0 &amp; 0\\ 
0 &amp; 0 &amp; 0 &amp; 1
\end{bmatrix}^{n-\alpha}
\begin{bmatrix}
F_{\alpha}\\ 
F_{\alpha-1}\\
F_{\alpha-2}\\ 
t_1 + t_2
\end{bmatrix}
\]</span></p>
<p>然后我们就对<span class="math">\(\alpha\)</span>以内的暴力求出来，后面再矩阵快速幂。</p>
<!--more-->

<h2 id="代码">代码</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>count</span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstring&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="n">N</span><span class="p">,</span> <span class="n">M</span><span class="p">,</span> <span class="n">P</span><span class="p">,</span> <span class="n">l</span><span class="p">[</span><span class="mi">24</span><span class="p">],</span> <span class="n">p</span><span class="p">[</span><span class="mi">80000</span><span class="p">];</span>
</span><span class='line'><span class="kt">long</span> <span class="kt">long</span> <span class="n">f</span><span class="p">[</span><span class="mi">24</span><span class="p">],</span> <span class="n">t</span><span class="p">[</span><span class="mi">24</span><span class="p">];</span>
</span><span class='line'><span class="kt">char</span> <span class="n">a</span><span class="p">[</span><span class="mi">80000</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">80000</span><span class="p">];</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Matrix</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">m</span><span class="p">[</span><span class="mi">4</span><span class="p">][</span><span class="mi">4</span><span class="p">];</span>
</span><span class='line'>  <span class="n">Matrix</span><span class="p">()</span><span class="o">:</span> <span class="n">m</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span> <span class="n">I</span><span class="p">;</span>
</span><span class='line'><span class="kr">inline</span> <span class="n">Matrix</span> <span class="k">operator</span><span class="o">*</span><span class="p">(</span><span class="k">const</span> <span class="n">Matrix</span><span class="o">&amp;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">Matrix</span><span class="o">&amp;</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">Matrix</span> <span class="n">c</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="o">++</span><span class="n">k</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>        <span class="n">c</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">c</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">])</span><span class="o">*</span><span class="n">b</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">])</span> <span class="o">%</span> <span class="n">P</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">c</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="n">Matrix</span> <span class="n">power</span><span class="p">(</span><span class="n">Matrix</span> <span class="n">base</span><span class="p">,</span> <span class="kt">int</span> <span class="n">k</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">Matrix</span> <span class="n">res</span><span class="p">(</span><span class="n">I</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(;</span> <span class="n">k</span><span class="p">;</span> <span class="n">k</span> <span class="o">&gt;&gt;=</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">k</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">res</span><span class="o">*</span><span class="n">base</span><span class="p">;</span>
</span><span class='line'>    <span class="n">base</span> <span class="o">=</span> <span class="n">base</span><span class="o">*</span><span class="n">base</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">kmp</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">s</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">last</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span><span class="o">&amp;</span> <span class="n">mid</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="n">j</span> <span class="o">&gt;</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">a</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="n">j</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">++</span><span class="n">j</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">==</span> <span class="n">M</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="o">++</span><span class="n">cnt</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&gt;=</span> <span class="n">last</span> <span class="o">&amp;&amp;</span> <span class="n">last</span> <span class="o">&gt;</span> <span class="n">i</span><span class="o">-</span><span class="n">M</span><span class="p">)</span> <span class="o">++</span><span class="n">mid</span><span class="p">;</span>
</span><span class='line'>      <span class="n">j</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">cnt</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">freopen</span><span class="p">(</span><span class="s">&quot;count.in&quot;</span><span class="p">,</span> <span class="s">&quot;r&quot;</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span>
</span><span class='line'>  <span class="n">freopen</span><span class="p">(</span><span class="s">&quot;count.out&quot;</span><span class="p">,</span> <span class="s">&quot;w&quot;</span><span class="p">,</span> <span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">I</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">I</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">I</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">I</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d%d%s&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">N</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">M</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">P</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
</span><span class='line'>  <span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">M</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="n">j</span> <span class="o">&gt;</span> <span class="o">-</span><span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">a</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="n">j</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">++</span><span class="n">j</span><span class="p">;</span>
</span><span class='line'>    <span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">j</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;0&#39;</span><span class="p">,</span> <span class="n">l</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="sc">&#39;1&#39;</span><span class="p">,</span> <span class="n">l</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">now</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">24</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">,</span> <span class="n">now</span> <span class="o">=</span> <span class="p">(</span><span class="n">now</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">3</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">strcpy</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">now</span><span class="p">],</span> <span class="n">s</span><span class="p">[(</span><span class="n">now</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="mi">3</span><span class="p">]);</span>
</span><span class='line'>    <span class="n">strcpy</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">now</span><span class="p">]</span><span class="o">+</span><span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="n">s</span><span class="p">[(</span><span class="n">now</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span><span class="o">%</span><span class="mi">3</span><span class="p">]);</span>
</span><span class='line'>    <span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">kmp</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">now</span><span class="p">],</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="n">l</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">N</span> <span class="o">&lt;</span> <span class="mi">24</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="n">N</span><span class="p">]</span> <span class="o">%</span> <span class="n">P</span><span class="p">));</span>
</span><span class='line'>    <span class="n">fclose</span><span class="p">(</span><span class="n">stdin</span><span class="p">);</span><span class="n">fclose</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">Matrix</span> <span class="n">mat</span><span class="p">;</span>
</span><span class='line'>  <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">mat</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">3</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="n">Matrix</span> <span class="n">res</span> <span class="o">=</span> <span class="n">power</span><span class="p">(</span><span class="n">mat</span><span class="p">,</span> <span class="n">N</span><span class="o">-</span><span class="mi">23</span><span class="p">);</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">((</span><span class="n">res</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">*</span><span class="n">f</span><span class="p">[</span><span class="mi">23</span><span class="p">]</span><span class="o">+</span><span class="n">res</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">f</span><span class="p">[</span><span class="mi">22</span><span class="p">]</span><span class="o">+</span><span class="n">res</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span><span class="o">*</span><span class="n">f</span><span class="p">[</span><span class="mi">21</span><span class="p">]</span><span class="o">+</span><span class="n">res</span><span class="p">.</span><span class="n">m</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">3</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">23</span><span class="p">]</span><span class="o">+</span><span class="n">t</span><span class="p">[</span><span class="mi">22</span><span class="p">]))</span><span class="o">%</span><span class="n">P</span><span class="p">));</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">fclose</span><span class="p">(</span><span class="n">stdin</span><span class="p">);</span><span class="n">fclose</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[POJ3222]Edge Pairing]]></title>
    <link href="https://quartergeek.com/poj3222/"/>
    <updated>2013-06-12T00:00:00+08:00</updated>
    <id>https://quartergeek.com/poj3222</id>
    <content type="html"><![CDATA[<p>这道题觉得十分的厉害，因为看了之后一点想法都没有。不得不Orz Discuss里面的神犇。这题要的是配对，配对这种东西一般是用二分图匹配做的，但是这题完全不懂如何构造出二分图。</p>
<p>Discuss里面的神犇提供了另外一种思路：“图分治”！嗯，这是一个非常神奇的东西，比树分治还神奇。</p>
<figure>
<img src="http://poj.org/images/3222_1.png" alt="example" /><figcaption>example</figcaption>
</figure>
<p>如果你把一个点<code>u</code>拿出来，然后DFS它所有相邻的点。</p>
<p>对于一个还没有访问过的点<code>v</code>，做完它有2种可能性：</p>
<ol type="1">
<li>它剩下一条边<code>(v, w)</code>无法匹配。那我们就构造<code>(u, v, w)</code>这样一对</li>
<li>它完美的被解决了，那么我们<code>(u, v)</code>这条边就会悬空，不过没关系，我们可以等待下一次发生这样的事情，比方说是<code>(u, s)</code>，那么我们可以配对<code>(v, u, s)</code></li>
</ol>
<p>对于一个比<code>u</code>时间戳大的点<code>v</code>，显然我们就不再考虑去做他了，因为他已经做过了。但是<code>(u, v)</code>这条边还是要考虑的，处理方法和上面2一样。</p>
<p>如果一个点结束的时候还有一条边没有配对，那就返回这条边，让调用它的那个点解决，也就是上面的1。</p>
<p>总之是一个非常神的方法。</p>
<!--more-->

<div class='bogus-wrapper'>
<notextile>
<figure class='code'><figcaption>
<span>poj3222</span><a href='http://poj.org/problem?id=3222'>Edge Pairing</a>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">20000</span><span class="p">,</span> <span class="n">MAXM</span> <span class="o">=</span> <span class="mi">100000</span><span class="p">;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Edge</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">v</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Edge</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">g</span><span class="p">[</span><span class="n">MAXM</span><span class="o">*</span><span class="mi">2</span><span class="p">],</span> <span class="o">*</span><span class="n">header</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">AddEdge</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">int</span> <span class="n">LinkSize</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Edge</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span> <span class="o">=</span> <span class="n">g</span><span class="o">+</span><span class="p">(</span><span class="n">LinkSize</span><span class="o">++</span><span class="p">);</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">];</span>
</span><span class='line'>  <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">timestamp</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">cnt</span><span class="p">,</span> <span class="n">dfn</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">ans</span><span class="p">[</span><span class="n">MAXM</span><span class="o">/</span><span class="mi">2</span><span class="p">][</span><span class="mi">3</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">dfs</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">u</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">dfn</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="o">++</span><span class="n">timestamp</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">v</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">Edge</span> <span class="o">*</span><span class="n">e</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">u</span><span class="p">];</span> <span class="n">e</span><span class="p">;</span> <span class="n">e</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">dfn</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">])</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">const</span> <span class="kt">int</span> <span class="n">w</span> <span class="o">=</span> <span class="n">dfs</span><span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">);</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">w</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>        <span class="n">ans</span><span class="p">[</span><span class="n">cnt</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">cnt</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">cnt</span><span class="o">++</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">w</span><span class="p">;</span>
</span><span class='line'>      <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">v</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>        <span class="n">ans</span><span class="p">[</span><span class="n">cnt</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">cnt</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">cnt</span><span class="o">++</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="n">v</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">dfn</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">dfn</span><span class="p">[</span><span class="n">u</span><span class="p">])</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">v</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>        <span class="n">ans</span><span class="p">[</span><span class="n">cnt</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">v</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">cnt</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">cnt</span><span class="o">++</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="n">v</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">v</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">x</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">y</span><span class="p">);</span>
</span><span class='line'>    <span class="o">--</span><span class="n">x</span><span class="p">,</span> <span class="o">--</span><span class="n">y</span><span class="p">;</span>
</span><span class='line'>    <span class="n">AddEdge</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
</span><span class='line'>    <span class="n">AddEdge</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">dfs</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">cnt</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>      <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d %d %d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;NO&quot;</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[PKUSC2012 Round1]]></title>
    <link href="https://quartergeek.com/pkusc2012a/"/>
    <updated>2013-06-12T00:00:00+08:00</updated>
    <id>https://quartergeek.com/pkusc2012a</id>
    <content type="html"><![CDATA[<h2 id="about">About</h2>
<p>地址：<a href="http://poj.grids.cn/summercamp2012a/">http://poj.grids.cn/summercamp2012a/</a></p>
<p>据说都是POJ原题……ABCDE都是一眼题吧，F非常巧妙，G这题第二次遇到还是不会，H完全看不懂。</p>
<h2 id="a-勇敢与鲁莽">A: 勇敢与鲁莽</h2>
<p>询问<code>Fib[i]</code>是否整除<code>Fib[j]</code>。</p>
<p>可以证明（或者打表发现），问题等价于<code>i</code>是否整除<code>j</code>。需要特判<code>Fib[2]</code>这一项。</p>
<h2 id="b-一个有意义的校庆">B: 一个有意义的校庆</h2>
<p>给定若干对事件的先后顺序，求字典序最小的顺序。</p>
<p>拓扑……</p>
<h2 id="c-雷涛的小猫">C: 雷涛的小猫</h2>
<p>有若干个柱子，柱子某些位置上有东西，可以从任意柱子的顶端出发，每次可以向下一格，或者跳到任意柱子上并且掉下<code>delta</code>个位置，问到达地上时最多拿到多少物品。</p>
<p><code>F[i, j] = max{ F[i-1, j], max(F[i-delta, k]) }</code></p>
<h2 id="d-edge-detection">D: Edge Detection</h2>
<p>给定一张很大的图像，让你产生一个输出，每个格子的值是原图它和上下左右差的最小值。图像用不多于<code>1000</code>组的数对<code>(value, times)</code>表示接下来有连续<code>times</code>个<code>value</code>。</p>
<p>觉得就是细节处理题吧……估计大家都不爱写，考场上只有3人写，1人AC。</p>
<h2 id="e-priest-johns-busiest-day">E: Priest John’s Busiest Day</h2>
<p>有<code>n</code>个人要结婚并且婚礼时间是<code>[Si, Ti]</code>，在婚礼的开始或者结束，需要<code>Di</code>分钟让神父为他们祝福，也就是<code>[Si, Si+Di]</code>或者<code>[Ti-Di, Ti]</code>，问能否安排使得全部人都能收到祝福。</p>
<p>应该是2-SAT吧，没写过，得补一下。</p>
<h2 id="f-边配对">F: 边配对</h2>
<p>给出一个有n个顶点、m条边的简单无向连通图，其中m为偶数。求一个边的一个配对，使得每一对边共用一个顶点。</p>
<figure>
<img src="http://poj.org/images/3222_1.png" alt="example" /><figcaption>example</figcaption>
</figure>
<p>非常巧妙的一个DFS构造。不得不膜拜Discuss里面的神犇。见<a href="http://oi.abcdabcd987.com/poj3222">另外一篇题解</a>。</p>
<h2 id="g-color-a-tree">G: Color a Tree</h2>
<p>给定一棵带点权的树，要求对树染色，第<code>i</code>次染色花费为<code>i*v[node]</code>，一个点仅当它的父亲被染色他才能被染色。求最小花费。</p>
<p>神贪心，上次考试的时候出过，不会，现在还是不会……一开始每个点自己为一个集合，然后按照<code>sum[s]/size[s]</code>贪心，一个集合一个集合地并到父亲节点上。</p>
<h2 id="h-atp">H: ATP</h2>
<p>看不懂题目我会乱说？</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ2883]gss2加强版]]></title>
    <link href="https://quartergeek.com/bzoj2883/"/>
    <updated>2013-06-10T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj2883</id>
    <content type="html"><![CDATA[<p>其实这题跟<a href="http://oi.abcdabcd987.com/gss2">GSS2</a>毛线关系都没有，求的根本不一样么，这题求的就是区间和，GSS2那题求的是区间和的最大值……但是相同的是：都是<strong>每个数只算一次</strong>。</p>
<p>其实看到这题我的想法就是<del><strong>线段树套动态分配的权值线段树</strong></del>，外层的线段树用来限制区间，顺便维护区间和，内层的权值线段树记下每个数出现的次数，这样修改的时候只要对每个数次数次数由0变1或者由1变0进行特判，更新区间和即可。然后就很高兴的去打了，结果连样例都过不去，才发现这样还是有BUG：在外层线段树查询的时候，左右子树的并还是可能有重复的数……后来YY了一下，干脆<code>query</code>就构造一棵内层的线段树，时间复杂度看起来不会很糟糕，但是事实证明空间复杂度相当高（后来下了数据，发现时间复杂度也非常高），所以这是一种非常不可行的方法。</p>
<p>后来请教了下ygy副队，发现对于这种<strong>一个数只记一次</strong>的题目有一种通用的方法：<strong>一维转二维</strong>。我们把<code>a[i]</code>转成一个二维点：<strong><code>(last[i], i)</code></strong>，<code>last[i]</code>为<code>i</code>之前<code>a[i]</code>出现的位置，呃，因为这题要求和嘛，所以我们可以给这个二维点一个值<code>a[i]</code>，这样我们就完美的把一维的数转成了二维的点。</p>
<p>接下来查询区间<code>[L, R]</code>就十分愉悦了，直接查找<code>x</code>在<code>[0, L-1]</code>并且<code>y</code>在<code>[L, R]</code>的所有点的和。</p>
<p>然后就是修改了，考虑一下修改一个数会改变多少个点，修改相当于去掉一个数，再添上一个数。对于去掉一个数<code>a[i]</code>，显然会影响到<code>a[i]</code>相邻两个和他相同的数。所以去掉一个数会影响3个点，所以一次修改操作会影响6个点。为了方便的维护一个数和他相同数的位置，可以维护一棵平衡树。</p>
<p>实际写起来还是很好写的，内存也不是很大。</p>
<!--more-->

<div class='bogus-wrapper'>
<notextile>
<figure class='code'><figcaption>
<span>bzoj2883</span><a href='http://www.lydsy.com/JudgeOnline/problem.php?id=2883'>gss2加强版</a>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;set&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;vector&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'><span class="k">using</span> <span class="n">std</span><span class="o">::</span><span class="n">set</span><span class="p">;</span>
</span><span class='line'><span class="k">using</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">100001</span><span class="p">;</span>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MEMORYSIZE</span> <span class="o">=</span> <span class="mi">1024</span><span class="o">*</span><span class="mi">1024</span><span class="o">*</span><span class="mi">4</span><span class="p">;</span>
</span><span class='line'><span class="c1">//------1D SegmentTree</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Segment1D</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">sum</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Segment1D</span> <span class="o">*</span><span class="n">lef</span><span class="p">,</span> <span class="o">*</span><span class="n">rig</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">_memory</span><span class="p">[</span><span class="n">MEMORYSIZE</span><span class="p">],</span> <span class="o">*</span><span class="n">_memory_top</span> <span class="o">=</span> <span class="n">_memory</span><span class="p">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">_n</span><span class="p">;</span>
</span><span class='line'><span class="k">class</span> <span class="nc">SegmentTree1D</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'><span class="cp">#define CREATE_AND_GO(func, node, ...) { if (!node) node = _memory_top++; func(node, __VA_ARGS__); }</span>
</span><span class='line'>  <span class="n">Segment1D</span> <span class="o">*</span><span class="n">root</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">query</span><span class="p">(</span><span class="n">Segment1D</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">st</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">ed</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">node</span><span class="o">-&gt;</span><span class="n">sum</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">st</span> <span class="o">&lt;=</span> <span class="n">lef</span> <span class="o">&amp;&amp;</span> <span class="n">rig</span> <span class="o">&lt;=</span> <span class="n">ed</span><span class="p">)</span> <span class="k">return</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">sum</span><span class="p">;</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">long</span> <span class="kt">long</span> <span class="n">sum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">st</span> <span class="o">&lt;=</span> <span class="n">mid</span> <span class="o">&amp;&amp;</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">lef</span><span class="p">)</span> <span class="n">sum</span> <span class="o">+=</span> <span class="n">query</span><span class="p">(</span><span class="n">node</span><span class="o">-&gt;</span><span class="n">lef</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">st</span><span class="p">,</span> <span class="n">ed</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">mid</span><span class="o">+</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">ed</span> <span class="o">&amp;&amp;</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">rig</span><span class="p">)</span> <span class="n">sum</span> <span class="o">+=</span> <span class="n">query</span><span class="p">(</span><span class="n">node</span><span class="o">-&gt;</span><span class="n">rig</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">,</span> <span class="n">st</span><span class="p">,</span> <span class="n">ed</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">sum</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">modify</span><span class="p">(</span><span class="n">Segment1D</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">delta</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">node</span><span class="o">-&gt;</span><span class="n">sum</span> <span class="o">+=</span> <span class="n">delta</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">==</span> <span class="n">rig</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">pos</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span> <span class="n">CREATE_AND_GO</span><span class="p">(</span><span class="n">modify</span><span class="p">,</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">lef</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">pos</span><span class="p">,</span> <span class="n">delta</span><span class="p">)</span>
</span><span class='line'>    <span class="k">else</span> <span class="n">CREATE_AND_GO</span><span class="p">(</span><span class="n">modify</span><span class="p">,</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">rig</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">,</span> <span class="n">pos</span><span class="p">,</span> <span class="n">delta</span><span class="p">)</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="cp">#undef CREATE_AND_GO</span>
</span><span class='line'><span class="k">public</span><span class="o">:</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">Query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">query</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">Modify</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">delta</span><span class="p">)</span> <span class="p">{</span> <span class="n">modify</span><span class="p">(</span><span class="n">root</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">pos</span><span class="p">,</span> <span class="n">delta</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">SegmentTree1D</span><span class="p">()</span><span class="o">:</span> <span class="n">root</span><span class="p">(</span><span class="n">_memory_top</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="c1">//------2D BIT</span>
</span><span class='line'><span class="n">SegmentTree1D</span> <span class="n">C</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">void</span> <span class="n">Modify</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">delta</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">_n</span><span class="p">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">i</span><span class="o">&amp;-</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">Modify</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">delta</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">Query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y1</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y2</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="p">;</span> <span class="n">i</span> <span class="o">-=</span> <span class="n">i</span><span class="o">&amp;-</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">res</span> <span class="o">+=</span> <span class="n">C</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">Query</span><span class="p">(</span><span class="n">y1</span><span class="p">,</span> <span class="n">y2</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//------Main Program</span>
</span><span class='line'><span class="kt">int</span> <span class="n">m</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">y</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">char</span> <span class="n">o</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="n">set</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">sets</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">+</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>    <span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">%c%d%d&quot;</span><span class="p">,</span> <span class="n">o</span><span class="o">+</span><span class="n">i</span><span class="p">,</span> <span class="n">x</span><span class="o">+</span><span class="n">i</span><span class="p">,</span> <span class="n">y</span><span class="o">+</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;U&#39;</span><span class="p">)</span> <span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
</span><span class='line'>  <span class="n">v</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">unique</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">())</span><span class="o">-</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">());</span>
</span><span class='line'>  <span class="n">_n</span> <span class="o">=</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">sets</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">insert</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">cur</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">lower_bound</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="o">-</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">last</span> <span class="o">=</span> <span class="o">*</span><span class="n">sets</span><span class="p">[</span><span class="n">cur</span><span class="p">].</span><span class="n">rbegin</span><span class="p">();</span>
</span><span class='line'>    <span class="n">Modify</span><span class="p">(</span><span class="n">last</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="o">+</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>    <span class="n">sets</span><span class="p">[</span><span class="n">cur</span><span class="p">].</span><span class="n">insert</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">o</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="sc">&#39;Q&#39;</span><span class="p">)</span>
</span><span class='line'>      <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%lld</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">Query</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]));</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">const</span> <span class="kt">int</span> <span class="n">pos</span> <span class="o">=</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">value</span> <span class="o">=</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">const</span> <span class="kt">int</span> <span class="n">pre</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">lower_bound</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">a</span><span class="p">[</span><span class="n">pos</span><span class="p">])</span><span class="o">-</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span>
</span><span class='line'>      <span class="n">set</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">target</span> <span class="o">=</span> <span class="n">sets</span><span class="p">[</span><span class="n">pre</span><span class="p">].</span><span class="n">find</span><span class="p">(</span><span class="n">pos</span><span class="p">),</span> <span class="n">succ</span><span class="p">,</span> <span class="n">prev</span><span class="p">;</span>
</span><span class='line'>      <span class="n">Modify</span><span class="p">(</span><span class="o">*--</span><span class="p">(</span><span class="n">prev</span> <span class="o">=</span> <span class="n">target</span><span class="p">),</span> <span class="n">pos</span><span class="p">,</span> <span class="o">-</span><span class="n">a</span><span class="p">[</span><span class="n">pos</span><span class="p">]);</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">++</span><span class="p">(</span><span class="n">succ</span> <span class="o">=</span> <span class="n">target</span><span class="p">)</span> <span class="o">!=</span> <span class="n">sets</span><span class="p">[</span><span class="n">pre</span><span class="p">].</span><span class="n">end</span><span class="p">())</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="n">Modify</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="o">*</span><span class="n">succ</span><span class="p">,</span> <span class="o">-</span><span class="n">a</span><span class="p">[</span><span class="n">pos</span><span class="p">]);</span>
</span><span class='line'>        <span class="n">Modify</span><span class="p">(</span><span class="o">*</span><span class="n">prev</span><span class="p">,</span> <span class="o">*</span><span class="n">succ</span><span class="p">,</span> <span class="o">+</span><span class="n">a</span><span class="p">[</span><span class="n">pos</span><span class="p">]);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="n">sets</span><span class="p">[</span><span class="n">pre</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">target</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">const</span> <span class="kt">int</span> <span class="n">cur</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">lower_bound</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">value</span><span class="p">)</span><span class="o">-</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span>
</span><span class='line'>      <span class="n">sets</span><span class="p">[</span><span class="n">cur</span><span class="p">].</span><span class="n">insert</span><span class="p">(</span><span class="n">pos</span><span class="p">);</span>
</span><span class='line'>      <span class="n">target</span> <span class="o">=</span> <span class="n">sets</span><span class="p">[</span><span class="n">cur</span><span class="p">].</span><span class="n">find</span><span class="p">(</span><span class="n">pos</span><span class="p">);</span>
</span><span class='line'>      <span class="n">Modify</span><span class="p">(</span><span class="o">*--</span><span class="p">(</span><span class="n">prev</span> <span class="o">=</span> <span class="n">target</span><span class="p">),</span> <span class="n">pos</span><span class="p">,</span> <span class="o">+</span><span class="n">value</span><span class="p">);</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="o">++</span><span class="p">(</span><span class="n">succ</span> <span class="o">=</span> <span class="n">target</span><span class="p">)</span> <span class="o">!=</span> <span class="n">sets</span><span class="p">[</span><span class="n">cur</span><span class="p">].</span><span class="n">end</span><span class="p">())</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="n">Modify</span><span class="p">(</span><span class="o">*</span><span class="n">prev</span><span class="p">,</span> <span class="o">*</span><span class="n">succ</span><span class="p">,</span> <span class="o">-</span><span class="n">value</span><span class="p">);</span>
</span><span class='line'>        <span class="n">Modify</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="o">*</span><span class="n">succ</span><span class="p">,</span> <span class="o">+</span><span class="n">value</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">a</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="c1">//printf(&quot;\n\n%10d\n%10d\n%.6fMBytes\n&quot;, _memory_top-_memory, MEMORYSIZE, (sizeof(_memory)+sizeof(x)+sizeof(y)+sizeof(o)+sizeof(C))/1024.0/1024.0);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ2795][Poi2012]A Horrible Poem]]></title>
    <link href="https://quartergeek.com/bzoj2795/"/>
    <updated>2013-06-10T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj2795</id>
    <content type="html"><![CDATA[<p>这题我记得去年福建集训有出过，当时太弱了，完全不懂。现在做到这题才突然想起来可以Hash。</p>
<p>首先无论是Hash还是KMP，要验证循环节，都是用一个方法：如果<code>s[A..A+len-1]</code>是<code>s[A..B]</code>的循环节，那么<strong><code>s[A..B-len+1] == s[A+len-1..B]</code></strong>。所以判定的话直接<code>RK Hash</code>就可以搞定了。</p>
<p>但是这题的数据范围有点大，如何破呢？</p>
<p>注意到，如果<code>len</code>是循环节，那么<strong>最短循环节必定是<code>len</code>的约数</strong>，同时，如果<code>L1</code>和<code>L2</code>都是循环节，那么<strong><code>lcm(L1, L2)</code>必然是循环节</strong>！所以我们可以把<code>len</code>质因数分解了，对于每个质因数找出最短的循环节长度，总的最短循环节长度就是它们的积。</p>
<!--more-->

<h2 id="我的错误">我的错误</h2>
<p>像我这种沙茶，连这种题都会犯很沙茶的错误：</p>
<ul>
<li><code>RK Hash</code>之后，<code>h[i]</code>的最高次明显比<code>h[i+k]</code>来的低，但是我想反了……</li>
<li>质因数分解<code>O(sqrtn)</code>竟然会写成<code>O(n)</code>的……</li>
</ul>
<h2 id="代码">代码</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>bzoj2795</span><a href='http://www.lydsy.com/JudgeOnline/problem.php?id=2795'>[Poi2012]A Horrible Poem</a>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstring&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">500001</span><span class="p">,</span> <span class="n">MAXQ</span> <span class="o">=</span> <span class="mi">2000000</span><span class="p">;</span>
</span><span class='line'><span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">P</span> <span class="o">=</span> <span class="mi">131</span><span class="p">;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Link</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">prime</span><span class="p">,</span> <span class="n">times</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Link</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">g</span><span class="p">[</span><span class="mi">1405799</span><span class="p">],</span> <span class="o">*</span><span class="n">header</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">AddLink</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">prime</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">times</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">int</span> <span class="n">LinkSize</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Link</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span> <span class="o">=</span> <span class="n">g</span><span class="o">+</span><span class="p">(</span><span class="n">LinkSize</span><span class="o">++</span><span class="p">);</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">prime</span> <span class="o">=</span> <span class="n">prime</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">times</span> <span class="o">=</span> <span class="n">times</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">];</span>
</span><span class='line'>  <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">primes</span><span class="p">,</span> <span class="n">prime</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">h</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">p</span><span class="p">[</span><span class="n">MAXN</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">};</span>
</span><span class='line'><span class="kt">char</span> <span class="n">s</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">GetPrimes</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">bool</span> <span class="n">com</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="n">prime</span><span class="p">[</span><span class="n">primes</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">primes</span> <span class="o">&amp;&amp;</span> <span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">i</span><span class="o">%</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">break</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%s%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="n">s</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">q</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">P</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">h</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">h</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">P</span><span class="o">+</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="sc">&#39;a&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="n">GetPrimes</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">cnt</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">x</span> <span class="o">=</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">primes</span> <span class="o">&amp;&amp;</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">x</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">x</span> <span class="o">%</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">;</span> <span class="n">x</span> <span class="o">/=</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">])</span> <span class="o">++</span><span class="n">cnt</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">cnt</span><span class="p">)</span> <span class="n">AddLink</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">],</span> <span class="n">cnt</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="n">AddLink</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">;</span> <span class="n">q</span><span class="o">--</span><span class="p">;</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">a</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">Link</span> <span class="o">*</span><span class="n">e</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span> <span class="n">e</span><span class="p">;</span> <span class="n">e</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">times</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">x</span> <span class="o">*=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">prime</span><span class="p">;</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(;</span> <span class="n">x</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">;</span> <span class="n">x</span> <span class="o">/=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">prime</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">int</span> <span class="n">l</span> <span class="o">=</span> <span class="p">(</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">x</span><span class="p">;</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">tmp1</span> <span class="o">=</span> <span class="n">h</span><span class="p">[</span><span class="n">b</span><span class="o">-</span><span class="n">l</span><span class="p">]</span> <span class="o">-</span> <span class="n">h</span><span class="p">[</span><span class="n">a</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">+</span><span class="mi">1</span><span class="o">-</span><span class="n">l</span><span class="p">];</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">tmp2</span> <span class="o">=</span> <span class="n">h</span><span class="p">[</span><span class="n">b</span><span class="p">]</span> <span class="o">-</span> <span class="n">h</span><span class="p">[</span><span class="n">a</span><span class="o">+</span><span class="n">l</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">*</span><span class="n">p</span><span class="p">[</span><span class="n">b</span><span class="o">-</span><span class="n">a</span><span class="o">+</span><span class="mi">1</span><span class="o">-</span><span class="n">l</span><span class="p">];</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">tmp1</span> <span class="o">==</span> <span class="n">tmp2</span><span class="p">)</span> <span class="p">{</span> <span class="n">ans</span> <span class="o">/=</span> <span class="n">x</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ3123][Sdoi2013]森林]]></title>
    <link href="https://quartergeek.com/bzoj3123/"/>
    <updated>2013-06-02T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj3123</id>
    <content type="html"><![CDATA[<p>这题一开始我想，嗯，这不就是水水的动态树嘛……后来被xietutu神犇吐槽了一下：你仔细看下题目。嗯，我果然沙茶，动态树怎么维护第k大了……后来又请教了下ygy副队，果然又沙茶了：可持久化线段树+启发式合并。</p>
<p>先说启发式合并吧，就是合并两棵树（不管是可持久化线段树还是splay）的时候，把小的树插到的树里面。看起来很暴力的方法，据说可以证明复杂度是<code>log</code>的。</p>
<p>然后这题就是，按DFS序建可持久化线段树，然后对于<code>L</code>操作，就把整棵小树的DFS序插入大树的DFS序列，然后重新建立小树的可持久化线段树。朴素的查询和建树可以参考<a href="http://oi.abcdabcd987.com/bzoj2588/"><strong>[BZOJ2588]Spoj 10628. Count on a Tree</strong></a>。</p>
<!--more-->

<h2 id="代码">代码</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>bzoj3123</span><a href='http://www.lydsy.com/JudgeOnline/problem.php?id=3123'>[Sdoi2013]森林</a>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
<span class='line-number'>164</span>
<span class='line-number'>165</span>
<span class='line-number'>166</span>
<span class='line-number'>167</span>
<span class='line-number'>168</span>
<span class='line-number'>169</span>
<span class='line-number'>170</span>
<span class='line-number'>171</span>
<span class='line-number'>172</span>
<span class='line-number'>173</span>
<span class='line-number'>174</span>
<span class='line-number'>175</span>
<span class='line-number'>176</span>
<span class='line-number'>177</span>
<span class='line-number'>178</span>
<span class='line-number'>179</span>
<span class='line-number'>180</span>
<span class='line-number'>181</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;vector&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstring&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'><span class="k">using</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">80001</span><span class="p">;</span>
</span><span class='line'><span class="c1">//------Segment Tree</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Node</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">value</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Node</span> <span class="o">*</span><span class="n">lef</span><span class="p">,</span> <span class="o">*</span><span class="n">rig</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">_memory</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="mi">250</span><span class="p">],</span> <span class="o">*</span><span class="n">_memory_top</span> <span class="o">=</span> <span class="n">_memory</span><span class="p">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">_n</span><span class="p">,</span> <span class="n">_x</span><span class="p">,</span> <span class="n">_st</span><span class="p">;</span>
</span><span class='line'><span class="n">Node</span><span class="o">*</span> <span class="n">_new_archive</span><span class="p">(</span><span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">pre</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span> <span class="o">=</span> <span class="n">_memory_top</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">=</span> <span class="n">pre</span><span class="o">-&gt;</span><span class="n">value</span><span class="o">+</span><span class="n">_x</span><span class="p">,</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">lef</span> <span class="o">=</span> <span class="n">pre</span><span class="o">-&gt;</span><span class="n">lef</span><span class="p">,</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">rig</span> <span class="o">=</span> <span class="n">pre</span><span class="o">-&gt;</span><span class="n">rig</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">==</span> <span class="n">rig</span><span class="p">)</span> <span class="k">return</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">_st</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">lef</span> <span class="o">=</span> <span class="n">_new_archive</span><span class="p">(</span><span class="n">pre</span><span class="o">-&gt;</span><span class="n">lef</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>  <span class="k">else</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">rig</span> <span class="o">=</span> <span class="n">_new_archive</span><span class="p">(</span><span class="n">pre</span><span class="o">-&gt;</span><span class="n">rig</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">_query</span><span class="p">(</span><span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">u</span><span class="p">,</span> <span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">v</span><span class="p">,</span> <span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">lca</span><span class="p">,</span> <span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">==</span> <span class="n">rig</span><span class="p">)</span> <span class="k">return</span> <span class="n">lef</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">value</span> <span class="o">=</span> <span class="n">u</span><span class="o">-&gt;</span><span class="n">lef</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">+</span> <span class="n">v</span><span class="o">-&gt;</span><span class="n">lef</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">-</span> <span class="n">lca</span><span class="o">-&gt;</span><span class="n">lef</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">-</span> <span class="n">p</span><span class="o">-&gt;</span><span class="n">lef</span><span class="o">-&gt;</span><span class="n">value</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">value</span> <span class="o">&gt;=</span> <span class="n">_x</span><span class="p">)</span> <span class="k">return</span> <span class="n">_query</span><span class="p">(</span><span class="n">u</span><span class="o">-&gt;</span><span class="n">lef</span><span class="p">,</span> <span class="n">v</span><span class="o">-&gt;</span><span class="n">lef</span><span class="p">,</span> <span class="n">lca</span><span class="o">-&gt;</span><span class="n">lef</span><span class="p">,</span> <span class="n">p</span><span class="o">-&gt;</span><span class="n">lef</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>  <span class="n">_x</span> <span class="o">-=</span> <span class="n">value</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">_query</span><span class="p">(</span><span class="n">u</span><span class="o">-&gt;</span><span class="n">rig</span><span class="p">,</span> <span class="n">v</span><span class="o">-&gt;</span><span class="n">rig</span><span class="p">,</span> <span class="n">lca</span><span class="o">-&gt;</span><span class="n">rig</span><span class="p">,</span> <span class="n">p</span><span class="o">-&gt;</span><span class="n">rig</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="n">Node</span><span class="o">*</span> <span class="n">Build</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span> <span class="o">=</span> <span class="n">_memory_top</span><span class="o">++</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">lef</span> <span class="o">=</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">rig</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">node</span><span class="o">-&gt;</span><span class="n">value</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">==</span> <span class="n">rig</span><span class="p">)</span> <span class="k">return</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">lef</span> <span class="o">=</span> <span class="n">Build</span><span class="p">(</span><span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">rig</span> <span class="o">=</span> <span class="n">Build</span><span class="p">(</span><span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="n">Node</span><span class="o">*</span> <span class="n">NewArchive</span><span class="p">(</span><span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">pre</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">delta</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span> <span class="n">_st</span> <span class="o">=</span> <span class="n">pos</span><span class="p">,</span> <span class="n">_x</span> <span class="o">=</span> <span class="n">delta</span><span class="p">;</span> <span class="k">return</span> <span class="n">_new_archive</span><span class="p">(</span><span class="n">pre</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">_n</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">int</span> <span class="n">Query</span><span class="p">(</span><span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">u</span><span class="p">,</span> <span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">v</span><span class="p">,</span> <span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">lca</span><span class="p">,</span> <span class="n">Node</span><span class="o">*</span> <span class="k">const</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">k</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span> <span class="n">_x</span> <span class="o">=</span> <span class="n">k</span><span class="p">;</span> <span class="k">return</span> <span class="n">_query</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">lca</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">_n</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="c1">//------Doubling Algorithm LCA</span>
</span><span class='line'><span class="kt">int</span> <span class="n">p</span><span class="p">[</span><span class="n">MAXN</span><span class="p">][</span><span class="mi">20</span><span class="p">],</span> <span class="n">deep</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">GetLCA</span><span class="p">(</span><span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="kt">int</span> <span class="n">v</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">deep</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">deep</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">19</span><span class="p">;</span> <span class="n">deep</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">!=</span> <span class="n">deep</span><span class="p">[</span><span class="n">v</span><span class="p">];</span> <span class="n">u</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="n">j</span><span class="p">])</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">deep</span><span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="n">j</span><span class="p">]]</span> <span class="o">&lt;</span> <span class="n">deep</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="o">--</span><span class="n">j</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">19</span><span class="p">;</span> <span class="n">u</span> <span class="o">!=</span> <span class="n">v</span><span class="p">;</span> <span class="n">u</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="n">j</span><span class="p">],</span> <span class="n">v</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">v</span><span class="p">][</span><span class="n">j</span><span class="p">])</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="n">j</span> <span class="o">&gt;</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">p</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">==</span> <span class="n">p</span><span class="p">[</span><span class="n">v</span><span class="p">][</span><span class="n">j</span><span class="p">])</span> <span class="o">--</span><span class="n">j</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">u</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//------Graph</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Edge</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">v</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Edge</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">g</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="mi">4</span><span class="p">],</span> <span class="o">*</span><span class="n">header</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">LinkSize</span><span class="p">;</span>
</span><span class='line'><span class="kt">void</span> <span class="n">AddEdge</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">Edge</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span> <span class="o">=</span> <span class="n">g</span><span class="o">+</span><span class="p">(</span><span class="n">LinkSize</span><span class="o">++</span><span class="p">);</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">];</span>
</span><span class='line'>  <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//------Main Program</span>
</span><span class='line'><span class="n">Node</span><span class="o">*</span> <span class="n">first</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">lastans</span><span class="p">,</span> <span class="n">trees</span><span class="p">,</span> <span class="n">w</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Tree</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">size</span><span class="p">,</span> <span class="n">u</span><span class="p">;</span>
</span><span class='line'>  <span class="n">vector</span><span class="o">&lt;</span><span class="n">Node</span><span class="o">*&gt;</span> <span class="n">root</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Tree</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">Tree</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">v</span><span class="p">)</span><span class="o">:</span> <span class="n">size</span><span class="p">(</span><span class="mi">0</span><span class="p">),</span> <span class="n">u</span><span class="p">(</span><span class="n">v</span><span class="p">),</span> <span class="n">root</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">DFS</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span><span class="p">,</span> <span class="n">Tree</span><span class="o">*</span> <span class="k">const</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">Initialize</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span> <span class="n">tree</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="o">*</span><span class="n">treeroot</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
</span><span class='line'><span class="kt">void</span> <span class="n">Tree</span><span class="o">::</span><span class="n">DFS</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="n">Tree</span><span class="o">*</span> <span class="k">const</span> <span class="n">_change_to</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">root</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">NewArchive</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">back</span><span class="p">(),</span> <span class="n">w</span><span class="p">[</span><span class="n">u</span><span class="p">],</span> <span class="o">+</span><span class="mi">1</span><span class="p">)),</span> <span class="n">first</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">root</span><span class="p">.</span><span class="n">back</span><span class="p">();</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">_change_to</span><span class="p">)</span> <span class="n">treeroot</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">_change_to</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">20</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">p</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>  <span class="n">deep</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">deep</span><span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="mi">0</span><span class="p">]]</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">Edge</span> <span class="o">*</span><span class="n">e</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">u</span><span class="p">];</span> <span class="n">e</span><span class="p">;</span> <span class="n">e</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">!=</span> <span class="n">p</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">p</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">;</span>
</span><span class='line'>      <span class="n">DFS</span><span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">,</span> <span class="n">_change_to</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="n">root</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">NewArchive</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">back</span><span class="p">(),</span> <span class="n">w</span><span class="p">[</span><span class="n">u</span><span class="p">],</span> <span class="o">-</span><span class="mi">1</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">Tree</span><span class="o">::</span><span class="n">Initialize</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">root</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">first</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</span><span class='line'>  <span class="n">DFS</span><span class="p">(</span><span class="n">u</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">char</span> <span class="n">c</span><span class="p">;</span>
</span><span class='line'><span class="kt">void</span> <span class="n">BuildTree</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="n">Tree</span><span class="o">*</span> <span class="k">const</span> <span class="n">tr</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="o">++</span><span class="n">tr</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">;</span>
</span><span class='line'>  <span class="n">treeroot</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">tr</span><span class="p">;</span>
</span><span class='line'>  <span class="n">w</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">lower_bound</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">w</span><span class="p">[</span><span class="n">u</span><span class="p">])</span><span class="o">-</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">()</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">Edge</span> <span class="o">*</span><span class="n">e</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">u</span><span class="p">];</span> <span class="n">e</span><span class="p">;</span> <span class="n">e</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">!=</span> <span class="n">p</span><span class="p">[</span><span class="n">u</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">deep</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>      <span class="n">p</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">;</span>
</span><span class='line'>      <span class="n">BuildTree</span><span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">,</span> <span class="n">tr</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">solve</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">);</span>
</span><span class='line'>  <span class="n">trees</span> <span class="o">=</span> <span class="n">lastans</span> <span class="o">=</span> <span class="n">LinkSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">_memory_top</span> <span class="o">=</span> <span class="n">_memory</span><span class="p">,</span> <span class="n">_n</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
</span><span class='line'>  <span class="n">v</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
</span><span class='line'>  <span class="n">memset</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">header</span><span class="p">));</span>
</span><span class='line'>  <span class="n">memset</span><span class="p">(</span><span class="n">deep</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">deep</span><span class="p">));</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="n">w</span><span class="o">+</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>    <span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">w</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">x</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">y</span><span class="p">);</span>
</span><span class='line'>    <span class="n">AddEdge</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
</span><span class='line'>    <span class="n">AddEdge</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>
</span><span class='line'>  <span class="n">v</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">unique</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">())</span><span class="o">-</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">());</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">deep</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">tree</span><span class="p">[</span><span class="n">trees</span><span class="p">]</span> <span class="o">=</span> <span class="n">Tree</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>      <span class="n">BuildTree</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">tree</span><span class="o">+</span><span class="p">(</span><span class="n">trees</span><span class="o">++</span><span class="p">));</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="n">first</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">Build</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="o">++</span><span class="n">_memory_top</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">trees</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">tree</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">Initialize</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">k</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">%c%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">c</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">x</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">y</span><span class="p">);</span>
</span><span class='line'>    <span class="n">x</span> <span class="o">^=</span> <span class="n">lastans</span><span class="p">,</span> <span class="n">y</span> <span class="o">^=</span> <span class="n">lastans</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">c</span> <span class="o">==</span> <span class="sc">&#39;Q&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">k</span><span class="p">);</span>
</span><span class='line'>      <span class="n">k</span> <span class="o">^=</span> <span class="n">lastans</span><span class="p">;</span>
</span><span class='line'>      <span class="k">const</span> <span class="kt">int</span> <span class="n">lca</span> <span class="o">=</span> <span class="n">GetLCA</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">),</span> <span class="n">plca</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">lca</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
</span><span class='line'>      <span class="n">lastans</span> <span class="o">=</span> <span class="n">Query</span><span class="p">(</span><span class="n">first</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">first</span><span class="p">[</span><span class="n">y</span><span class="p">],</span> <span class="n">first</span><span class="p">[</span><span class="n">lca</span><span class="p">],</span> <span class="n">first</span><span class="p">[</span><span class="n">plca</span><span class="p">],</span> <span class="n">k</span><span class="p">);</span>
</span><span class='line'>      <span class="n">lastans</span> <span class="o">=</span> <span class="n">v</span><span class="p">[</span><span class="n">lastans</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>      <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">lastans</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">treeroot</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">&gt;</span> <span class="n">treeroot</span><span class="p">[</span><span class="n">y</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">)</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
</span><span class='line'>      <span class="n">treeroot</span><span class="p">[</span><span class="n">y</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">size</span> <span class="o">+=</span> <span class="n">treeroot</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">size</span><span class="p">;</span>
</span><span class='line'>      <span class="n">treeroot</span><span class="p">[</span><span class="n">y</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">root</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
</span><span class='line'>      <span class="n">AddEdge</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
</span><span class='line'>      <span class="n">AddEdge</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
</span><span class='line'>      <span class="n">p</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span>
</span><span class='line'>      <span class="n">treeroot</span><span class="p">[</span><span class="n">y</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">root</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">first</span><span class="p">[</span><span class="n">y</span><span class="p">]);</span>
</span><span class='line'>      <span class="n">treeroot</span><span class="p">[</span><span class="n">y</span><span class="p">]</span><span class="o">-&gt;</span><span class="n">DFS</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">treeroot</span><span class="p">[</span><span class="n">y</span><span class="p">]);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%*d&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">solve</span><span class="p">();</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ3122][Sdoi2013]随机数生成器]]></title>
    <link href="https://quartergeek.com/bzoj3122/"/>
    <updated>2013-06-02T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj3122</id>
    <content type="html"><![CDATA[<p>首先，很容易看出来，这个式子是[<strong>秦九韶算法</strong>](http://en.wikipedia.org/wiki/Horner’s_method)，不考虑取模的话就是：</p>
<p><span class="math">\[
X_n=a^{n-1}X_1+b\sum_{k=0}^{n-2}a^k
\]</span></p>
<p>嗯，我们可以套上一个<strong>等比数列求和</strong>公式，变成</p>
<p><span class="math">\[
t\equiv a^{n-1}X_1+b\cdot\frac{1-a^{n-1}}{1-a} \pmod{p}
\]</span></p>
<p>乘过去</p>
<p><span class="math">\[
t\left(1-a\right)\equiv \left[\left(1-a\right)X_1-b\right]a^{n-1}+b \pmod{p}
\]</span></p>
<p>这个时候自然是想再除过来，这里有个很明显的坑应该大家都发现了，就是逆元要存在。</p>
<p><span class="math">\[
a^{n-1}\equiv\frac{t-ta-b}{\left(1-a\right)X_1-b} \pmod{p}
\]</span></p>
<p>然后就是水水的<a href="http://oi.abcdabcd987.com/bsgs/"><strong>BSGS</strong></a>了。</p>
<!--more-->

<h2 id="特殊情况">特殊情况</h2>
<p>我就是傻傻这样，结果发现全部WA了……原因是多组数据、然后特殊情况完全没有考虑到。其实下面的特殊情况列出来会觉得很傻逼，但是我觉得比较需要思考的是：为什么会被特殊数据卡？</p>
<p>当<span class="math">\(a=1\)</span>时： <span class="math">\(\left[X_1+b(n-1)\right]\equiv t \pmod{p}\)</span>，显然就是扩展欧几里得了。为什么这个BSGS会挂呢？原因是：BSGS那个式子用到了等比数列求和，但是显然比为1的数列<strong>不是等比数列</strong>。</p>
<p>当<span class="math">\(a=0\)</span>时：<code>ans = b == t ? 2 : -1</code>。这个连数列都没了</p>
<p>当<span class="math">\(X_1=t\)</span>时：<code>ans = 1</code>。什么都没了……</p>
<p>所以这题给我最大的启示就是：千万不要轻视细节……</p>
<h2 id="代码">代码</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>bzoj3122</span><a href='http://www.lydsy.com/JudgeOnline/problem.php?id=3122'>[Sdoi2013]随机数生成器</a>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cmath&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstring&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">Int64</span><span class="p">;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Triple</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">Int64</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Triple</span><span class="p">(</span><span class="k">const</span> <span class="n">Int64</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">Int64</span> <span class="n">b</span><span class="p">,</span> <span class="k">const</span> <span class="n">Int64</span> <span class="n">c</span><span class="p">)</span><span class="o">:</span> <span class="n">x</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">b</span><span class="p">),</span> <span class="n">z</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="n">Triple</span> <span class="n">exgcd</span><span class="p">(</span><span class="k">const</span> <span class="n">Int64</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">Int64</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">b</span><span class="p">)</span> <span class="k">return</span> <span class="n">Triple</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
</span><span class='line'>  <span class="k">const</span> <span class="n">Triple</span> <span class="n">last</span> <span class="o">=</span> <span class="n">exgcd</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="o">%</span><span class="n">b</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">Triple</span><span class="p">(</span><span class="n">last</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="n">last</span><span class="p">.</span><span class="n">x</span> <span class="o">-</span> <span class="n">a</span> <span class="o">/</span> <span class="n">b</span> <span class="o">*</span> <span class="n">last</span><span class="p">.</span><span class="n">y</span><span class="p">,</span> <span class="n">last</span><span class="p">.</span><span class="n">z</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">class</span> <span class="nc">Hash</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">HASHMOD</span> <span class="o">=</span> <span class="mi">7679977</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Int64</span> <span class="n">k</span><span class="p">[</span><span class="n">HASHMOD</span><span class="o">+</span><span class="mi">100</span><span class="p">];</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">time</span><span class="p">[</span><span class="n">HASHMOD</span><span class="o">+</span><span class="mi">100</span><span class="p">],</span> <span class="n">v</span><span class="p">[</span><span class="n">HASHMOD</span><span class="o">+</span><span class="mi">100</span><span class="p">],</span> <span class="n">timestamp</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">locate</span><span class="p">(</span><span class="k">const</span> <span class="n">Int64</span> <span class="n">key</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">h</span> <span class="o">=</span> <span class="n">key</span><span class="o">%</span><span class="n">HASHMOD</span><span class="p">;</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="n">time</span><span class="p">[</span><span class="n">h</span><span class="p">]</span> <span class="o">==</span> <span class="n">timestamp</span> <span class="o">&amp;&amp;</span> <span class="n">k</span><span class="p">[</span><span class="n">h</span><span class="p">]</span> <span class="o">!=</span> <span class="n">key</span><span class="p">)</span> <span class="o">++</span><span class="n">h</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">h</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="k">public</span><span class="o">:</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">clear</span><span class="p">()</span> <span class="p">{</span> <span class="o">++</span><span class="n">timestamp</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">set</span><span class="p">(</span><span class="k">const</span> <span class="n">Int64</span> <span class="n">key</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">value</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">h</span> <span class="o">=</span> <span class="n">locate</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">time</span><span class="p">[</span><span class="n">h</span><span class="p">]</span> <span class="o">!=</span> <span class="n">timestamp</span><span class="p">)</span> <span class="n">time</span><span class="p">[</span><span class="n">h</span><span class="p">]</span> <span class="o">=</span> <span class="n">timestamp</span><span class="p">,</span> <span class="n">k</span><span class="p">[</span><span class="n">h</span><span class="p">]</span> <span class="o">=</span> <span class="n">key</span><span class="p">,</span> <span class="n">v</span><span class="p">[</span><span class="n">h</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">get</span><span class="p">(</span><span class="k">const</span> <span class="n">Int64</span> <span class="n">key</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">h</span> <span class="o">=</span> <span class="n">locate</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">time</span><span class="p">[</span><span class="n">h</span><span class="p">]</span> <span class="o">==</span> <span class="n">timestamp</span> <span class="o">?</span> <span class="n">v</span><span class="p">[</span><span class="n">h</span><span class="p">]</span> <span class="o">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span> <span class="n">hash</span><span class="p">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">bsgs</span><span class="p">(</span><span class="n">Int64</span> <span class="n">A</span><span class="p">,</span> <span class="n">Int64</span> <span class="n">B</span><span class="p">,</span> <span class="n">Int64</span> <span class="n">C</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">hash</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
</span><span class='line'>  <span class="n">Int64</span> <span class="n">base</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">D</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">ceil</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">sqrt</span><span class="p">(</span><span class="n">C</span><span class="p">)));</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">,</span> <span class="n">base</span> <span class="o">=</span> <span class="n">base</span><span class="o">*</span><span class="n">A</span><span class="o">%</span><span class="n">C</span><span class="p">)</span> <span class="n">hash</span><span class="p">.</span><span class="n">set</span><span class="p">(</span><span class="n">base</span><span class="p">,</span> <span class="n">i</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Triple</span> <span class="n">gcd</span> <span class="o">=</span> <span class="n">exgcd</span><span class="p">(</span><span class="n">D</span><span class="p">,</span> <span class="n">C</span><span class="p">);</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">hash</span><span class="p">.</span><span class="n">get</span><span class="p">((</span><span class="n">gcd</span><span class="p">.</span><span class="n">x</span><span class="o">*</span><span class="n">B</span><span class="o">%</span><span class="n">C</span><span class="o">+</span><span class="n">C</span><span class="p">)</span><span class="o">%</span><span class="n">C</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="n">i</span><span class="o">*</span><span class="n">m</span><span class="o">+</span><span class="n">j</span><span class="p">;</span>
</span><span class='line'>    <span class="n">D</span> <span class="o">=</span> <span class="n">D</span><span class="o">*</span><span class="n">base</span><span class="o">%</span><span class="n">C</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="n">Int64</span> <span class="n">T</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="n">t</span><span class="p">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">solve</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%lld%lld%lld%lld%lld&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">a</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">x1</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">x1</span> <span class="o">==</span> <span class="n">t</span><span class="p">)</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">b</span> <span class="o">==</span> <span class="n">t</span> <span class="o">?</span> <span class="mi">2</span> <span class="o">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Triple</span> <span class="n">gcd</span> <span class="o">=</span> <span class="n">exgcd</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">abs</span><span class="p">(</span><span class="n">gcd</span><span class="p">.</span><span class="n">z</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">((</span><span class="n">t</span><span class="o">-</span><span class="n">x1</span><span class="p">)</span><span class="o">/</span><span class="n">gcd</span><span class="p">.</span><span class="n">z</span><span class="o">*</span><span class="n">gcd</span><span class="p">.</span><span class="n">x</span><span class="o">%</span><span class="n">p</span><span class="o">+</span><span class="n">p</span><span class="p">)</span><span class="o">%</span><span class="n">p</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">const</span> <span class="n">Int64</span> <span class="n">tmp1</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">a</span><span class="p">)</span><span class="o">*</span><span class="n">x1</span><span class="o">-</span><span class="n">b</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="n">Triple</span> <span class="n">gcd</span> <span class="o">=</span> <span class="n">exgcd</span><span class="p">(</span><span class="n">tmp1</span><span class="p">,</span> <span class="n">p</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">abs</span><span class="p">(</span><span class="n">gcd</span><span class="p">.</span><span class="n">z</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">)</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="n">Int64</span> <span class="n">tmp2</span> <span class="o">=</span> <span class="p">(</span><span class="n">t</span><span class="o">-</span><span class="n">t</span><span class="o">*</span><span class="n">a</span><span class="o">-</span><span class="n">b</span><span class="p">)</span> <span class="o">%</span> <span class="n">p</span> <span class="o">*</span> <span class="n">gcd</span><span class="p">.</span><span class="n">x</span> <span class="o">/</span> <span class="n">gcd</span><span class="p">.</span><span class="n">z</span> <span class="o">%</span> <span class="n">p</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="n">bsgs</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="p">(</span><span class="n">tmp2</span><span class="o">+</span><span class="n">p</span><span class="p">)</span><span class="o">%</span><span class="n">p</span><span class="p">,</span> <span class="n">p</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">res</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">?</span> <span class="o">-</span><span class="mi">1</span> <span class="o">:</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%lld&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">T</span><span class="p">);</span>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">T</span><span class="o">--</span><span class="p">)</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">solve</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ3093][Fdu校赛2012] A Famous Game]]></title>
    <link href="https://quartergeek.com/bzoj3093/"/>
    <updated>2013-06-01T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj3093</id>
    <content type="html"><![CDATA[<p>这题是概率论入门的好题啊，用到了条件概率公式和全概率公式，甚至还用了一点组合公式和代数式的转化</p>
<h2 id="题意">题意</h2>
<p>盒子里有<span class="math">\(n\)</span>个球，每个球为红色或者蓝色，其中红球数量<span class="math">\(m\in \left\{ 1..n \right\}\)</span>等概率分布。已知在抽出并扔掉<span class="math">\(p\)</span>个球的情况下有<span class="math">\(q\)</span>个球是红球。问再抽一个球是红球的概率。</p>
<h2 id="预备知识">预备知识</h2>
<p>首先是<a href="http://en.wikipedia.org/wiki/Conditional_probability"><strong>条件概率公式</strong></a>，在已知事件<span class="math">\(B\)</span>发生的条件下事件<span class="math">\(A\)</span>发生的概率：</p>
<p><span class="math">\[
P\left(A\right)=\frac{P\left(AB\right)}{P\left(B\right)}
\]</span></p>
<p>接下来就是<a href="http://en.wikipedia.org/wiki/Law_of_total_probability"><strong>全概率公式</strong></a>，事件<span class="math">\(A\)</span>发生的概率就是各个情况<span class="math">\(B_k\)</span>下事件<span class="math">\(A\)</span>发生概率的和：</p>
<p><span class="math">\[
P\left(A\right)=\sum_k{P\left( A|B_k\right)P\left(B_k\right)}
\]</span></p>
<p>最后就是一个奇妙的组合公式：</p>
<p><span class="math">\[
\sum_{k=0}^s{\binom{k}{n}\binom{s-k}{m}}=\binom{s+1}{n+m+1}
\]</span></p>
<p>这个可以这么理解：要从<span class="math">\(s+1\)</span>个数中选出<span class="math">\(n+m+1\)</span>个数，那么<span class="math">\(k\)</span>相当于在枚举第<span class="math">\(n+1\)</span>个数。</p>
<!--more-->

<h2 id="解法">解法</h2>
<p>有了上面预备知识，下面的推导就很好理解了：</p>
<p>令<span class="math">\(A\)</span>表示下一个球取出来是红色的，<span class="math">\(B\)</span>表示一开始抽出<span class="math">\(p\)</span>个球有<span class="math">\(q\)</span>个是红球，<span class="math">\(N_k\)</span>表示最早袋子里面有<span class="math">\(k\)</span>个红球。那么：</p>
<p><span class="math">\[
\begin{eqnarray*}
P\left(A|B\right)&amp;=&amp;\frac{P\left(AB\right)}{P\left(B\right)} \\ 
&amp;=&amp;\frac{\sum_{k=0}^n{P\left(AB|N_k\right)P\left(N_k\right)}}{\sum_{k=0}^n{ P\left(A|N_k\right)P\left(N_k\right)}} \\ 
&amp;=&amp;\frac{\sum_{k=0}^n{P\left(A|BN_k\right)P\left(B|N_k\right)P\left(N_k\right)}}{\sum_{k=0}^n{P\left(B|N_k\right)P\left(N_k\right)}}
\end{eqnarray*}
\]</span></p>
<p>又因为：</p>
<p><span class="math">\[
\begin{eqnarray*}
P\left(A|BN_k\right)&amp;=&amp;\frac{k-q}{n-p} \\ 
P\left(N_k\right)&amp;=&amp;\frac 1{n+1} \\ 
P\left(B|N_k\right)&amp;=&amp;\frac{\binom{k}{q}\binom{n-k}{p-q}}{\binom{n}{p}} 
\end{eqnarray*}
\]</span></p>
<p>所以</p>
<p><span class="math">\[
\begin{eqnarray*} 
P\left(A|B\right)&amp;=&amp;\frac{\sum_{k=0}^n \binom{k}{q} \binom{n-k}{p-q} (k-q)}{\sum_{k=0}^n \binom{k}{q} \binom{n-k}{p-q} (n-p)}  &amp; (*) \\ 
&amp;=&amp;\frac{\sum_{k=0}^n \binom{k}{q+1} \binom{n-k}{p-q} (q+1)}{\sum_{k=0}^n \binom{k}{q} \binom{n-k}{p-q} (n-p)} \\ 
&amp;=&amp;\frac{q+1}{n-p} \cdot \frac{\sum_{k=0}^n \binom{k}{q+1} \binom{n-k}{p-q}}{\sum_{k=0}^n \binom k q \binom{n-k}{p-q}} \\
&amp;=&amp;\frac{q+1}{n-p} \cdot \frac{\binom{n+1}{p+2}}{\binom{n+1}{p+1}} \\ 
&amp;=&amp;\frac{q+1}{p+2} 
\end{eqnarray*}
\]</span></p>
<p>非常神奇吧，看起来十分复杂的题目竟然最后的答案如此简单。其实我推到<span class="math">\((*)\)</span>式的时候，以为要用各种数论变换处理，把复杂度降到<code>O(n)</code>。后来才发现，这题没有<code>mod</code>，而且原来竟然有更神奇的代数变换和组合数变换。</p>
<p>这题是在太神！</p>
<h2 id="代码">代码</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>bzoj3093</span><a href='http://www.lydsy.com/JudgeOnline/problem.php?id=3093'>[Fdu校赛2012] A Famous Game</a>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="cp">#include &lt;stdio.h&gt;</span>
</span><span class='line'><span class="n">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">T</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">p</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">q</span><span class="p">)</span> <span class="o">!=</span> <span class="n">EOF</span><span class="p">)</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Case %d: %.4f</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">++</span><span class="n">T</span><span class="p">,</span> <span class="p">(</span><span class="n">q</span><span class="o">+</span><span class="mf">1.</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">p</span><span class="o">+</span><span class="mi">2</span><span class="p">));</span>
</span><span class='line'>  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<h2 id="后记">后记</h2>
<p>其实这篇题解跟<a href="http://jiazhipeng.byethost7.com/archives/102">贾教的题解</a>差不多，原因是就是看着他题解做的……Orz贾教</p>
<p>那么本文的目的是什么呢，其实只是<span class="math">\(\LaTeX\)</span>测试而已。</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ3143][Hnoi2013]游走]]></title>
    <link href="https://quartergeek.com/bzoj3143/"/>
    <updated>2013-05-29T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj3143</id>
    <content type="html"><![CDATA[<p>最近真的是智商跌到谷底，基本什么题都得看题解，就连这种水题都是在做HNOI2013 Day1的时候不小心瞄到wjmzbmr的题解的前提下才想出来。</p>
<p>如果我们知道每条边期望走过的次数，那么显然排序后贪心地标号即可。但是要知道每条边走过的次数还是比较困难的，我们可以考虑<strong>每个点i期望经过的次数<code>p[i]</code></strong>。</p>
<p>显然，一个点能从除<code>n</code>外所有和他相邻的点<code>j</code>走过来，并且从<code>j</code>点走过来的概率为<code>1/deg[j]</code>。所以，<code>p[i] = sigma(p[j]/deg[j])</code>。另外，要注意到，点<code>1</code>到达次数明显会多<code>1</code>。</p>
<p>接下来我们就会发现，这是一个<code>n-1</code>个未知数、<code>n-1</code>个方程的方程组（为什么？因为不可能从<code>n</code>走到点<code>i</code>，并且<code>n</code>的期望次数为1），然后就可以很愉悦的高斯消元即可。</p>
<p>求出每个点的期望次数<code>p[i]</code>后，<strong>每条边<code>(u, v)</code>期望经过的次数<code>ex[i]</code></strong>，<code>ex[i] = p[u]/deg[u] + p[v]/deg[v]</code>。当然了，因为还是不可能从<code>n</code>走出来，所以如果一个端点在<code>n</code>，那么就只有一端可以走。</p>
<p>然后排个序，编号就完了。</p>
<!--more-->

<h2 id="精度">精度</h2>
<p>这题的精度不知道如何破？反正我自己手测官方数据是过不去，交bzoj也过不去。后来改成<code>long double</code>和<code>EPS = 1e-9</code>就过了bzoj（但跟官方数据还是差0.1以上）。不管如何，反正是浪费了几乎一个小时……</p>
<h2 id="代码">代码</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>bzoj3143</span><a href='http://www.lydsy.com/JudgeOnline/problem.php?id=3143'>[Hnoi2013]游走</a>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cmath&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstring&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">501</span><span class="p">;</span>
</span><span class='line'><span class="k">const</span> <span class="kt">long</span> <span class="kt">double</span> <span class="n">EPS</span> <span class="o">=</span> <span class="mf">1e-9</span><span class="p">;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Edge</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">v</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Edge</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">g</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="n">MAXN</span><span class="p">],</span> <span class="o">*</span><span class="n">header</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">AddEdge</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">int</span> <span class="n">LinkSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Edge</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span> <span class="o">=</span> <span class="n">g</span><span class="o">+</span><span class="p">(</span><span class="n">LinkSize</span><span class="o">++</span><span class="p">);</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">];</span>
</span><span class='line'>  <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">deg</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">y</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">pos</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">long</span> <span class="kt">double</span> <span class="n">mat</span><span class="p">[</span><span class="n">MAXN</span><span class="p">][</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">ex</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">elimination</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">fabs</span><span class="p">(</span><span class="n">mat</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="o">&gt;</span> <span class="n">std</span><span class="o">::</span><span class="n">fabs</span><span class="p">(</span><span class="n">mat</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">i</span><span class="p">]))</span>
</span><span class='line'>        <span class="n">k</span> <span class="o">=</span> <span class="n">j</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">],</span> <span class="n">mat</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">fabs</span><span class="p">(</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">])</span> <span class="o">&lt;=</span> <span class="n">EPS</span><span class="p">)</span>
</span><span class='line'>      <span class="k">continue</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&gt;=</span> <span class="n">i</span><span class="p">;</span> <span class="o">--</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">/=</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">!=</span> <span class="n">i</span><span class="p">)</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">k</span> <span class="o">&gt;=</span> <span class="n">i</span><span class="p">;</span> <span class="o">--</span><span class="n">k</span><span class="p">)</span>
</span><span class='line'>          <span class="n">mat</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">-=</span> <span class="n">mat</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">k</span><span class="p">];</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">bool</span> <span class="n">cmp</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">ex</span><span class="p">[</span><span class="n">lhs</span><span class="p">]</span><span class="o">-</span><span class="n">ex</span><span class="p">[</span><span class="n">rhs</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">EPS</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="n">x</span><span class="o">+</span><span class="n">i</span><span class="p">,</span> <span class="n">y</span><span class="o">+</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>    <span class="o">++</span><span class="n">deg</span><span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]],</span> <span class="o">++</span><span class="n">deg</span><span class="p">[</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]];</span>
</span><span class='line'>    <span class="n">AddEdge</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>    <span class="n">AddEdge</span><span class="p">(</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="n">Edge</span> <span class="o">*</span><span class="n">e</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">i</span><span class="p">];</span> <span class="n">e</span><span class="p">;</span> <span class="n">e</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">!=</span> <span class="n">n</span><span class="p">)</span>
</span><span class='line'>        <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">double</span><span class="o">&gt;</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">deg</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">];</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">mat</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="n">elimination</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="n">pos</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">,</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ex</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">mat</span><span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]][</span><span class="n">n</span><span class="p">]</span><span class="o">/</span><span class="n">deg</span><span class="p">[</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">+</span> <span class="n">mat</span><span class="p">[</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]][</span><span class="n">n</span><span class="p">]</span><span class="o">/</span><span class="n">deg</span><span class="p">[</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]];</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">pos</span><span class="p">,</span> <span class="n">pos</span><span class="o">+</span><span class="n">m</span><span class="p">,</span> <span class="n">cmp</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">double</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">ans</span> <span class="o">+=</span> <span class="n">ex</span><span class="p">[</span><span class="n">pos</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span><span class="o">*</span><span class="p">(</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%.3Lf&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ3140][Hnoi2013]消毒]]></title>
    <link href="https://quartergeek.com/bzoj3140/"/>
    <updated>2013-05-29T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj3140</id>
    <content type="html"><![CDATA[<p>首先由均值不等式可以得到，<code>min{a, b, c} &lt;= 17</code>，不妨假设最短的那条边为<code>a</code>。接下来考虑消除，答案肯定不会超过<code>a</code>，因为可以做若干次<code>1*b*c</code>的消除。</p>
<p>一开始看到这个结论我还是非常傻逼的以为，只要把需要消毒的每一片<code>1*b*c</code>都消毒即可，还傻傻问<a href="http://cxjyxx.me/?p=319">副队</a>哪来的二分图……经过副队的教导才意识到这样不一定最优，比较科学的做法是：<code>2^a</code>枚举每层是否消掉，然后用<code>a*1*c</code>和<code>a*b*1</code>的片覆盖，也就是转成二维的最小棋盘覆盖。</p>
<p>所谓最小棋盘覆盖就是说，每次可以覆盖掉棋盘的一整行或一整列，问把所有标记点覆盖的最小次数。嗯，这个也不会做……Google了一下，看到搜索结果里面<strong>最小点覆盖</strong>和<strong>行列拆开</strong>这两个关键词才突然意识到，这不就是个水水的二分图匹配嘛。</p>
<p>考虑把所有行放在左边，所有列放在右边，然后如果<code>(i, j)</code>需要被覆盖，那么连边<code>(Xi, Yj)</code>。之后就是一个最小点覆盖的问题了（选择最少的点，使得每条边都至少有一个端点被选择），因为<strong>最小点覆盖=最大匹配</strong>，所以轻松做掉了。（这个时候突然很庆幸前不久刚学匈牙利，明显这种时候用匈牙利跑匹配比网络流省事多了=v=）</p>
<!--more-->

<h2 id="常数">常数</h2>
<p>虽然写程序的时候已经在清数组的时候注意了，但是手测第一个点还是TLE得非常严重（吐槽一下，所有数据都是10K……）。后来看到副队博客上还有一句话，发现有一个非常卡BUG的优化方法：<strong>因为1的数量非常少，所以可以把1用链表串起来</strong>。嗯，加了优化后就可以过了。不知道不卡BUG是如何做的= =?</p>
<h2 id="代码">代码</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>bzoj3140</span><a href='http://www.lydsy.com/JudgeOnline/problem.php?id=3140'>[Hnoi2013]消毒</a>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstring&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">struct</span> <span class="n">Edge</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">v</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Edge</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">g</span><span class="p">[</span><span class="mi">10000</span><span class="p">],</span> <span class="o">*</span><span class="n">header</span><span class="p">[</span><span class="mi">5000</span><span class="p">],</span> <span class="o">*</span><span class="n">head</span><span class="p">[</span><span class="mi">5000</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">LinkSize</span><span class="p">,</span> <span class="n">_link_size</span><span class="p">;</span>
</span><span class='line'><span class="kt">void</span> <span class="n">AddEdge</span><span class="p">(</span><span class="n">Edge</span> <span class="o">*&amp;</span><span class="n">head</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">Edge</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span> <span class="o">=</span> <span class="n">g</span><span class="o">+</span><span class="p">(</span><span class="n">LinkSize</span><span class="o">++</span><span class="p">);</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">head</span><span class="p">;</span>
</span><span class='line'>  <span class="n">head</span> <span class="o">=</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">T</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">,</span> <span class="n">ans</span><span class="p">,</span> <span class="n">mat</span><span class="p">[</span><span class="mi">5000</span><span class="p">],</span> <span class="n">match</span><span class="p">[</span><span class="mi">5000</span><span class="p">];</span>
</span><span class='line'><span class="kt">bool</span> <span class="n">used</span><span class="p">[</span><span class="mi">20</span><span class="p">],</span> <span class="n">vis</span><span class="p">[</span><span class="mi">5000</span><span class="p">];</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">int</span> <span class="n">getid</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">z</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span><span class="o">*</span><span class="n">b</span><span class="o">*</span><span class="n">c</span> <span class="o">+</span> <span class="n">y</span><span class="o">*</span><span class="n">c</span> <span class="o">+</span> <span class="n">z</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="kt">bool</span> <span class="n">find</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">u</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">Edge</span> <span class="o">*</span><span class="n">e</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">u</span><span class="p">];</span> <span class="n">e</span><span class="p">;</span> <span class="n">e</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">vis</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">])</span> <span class="k">continue</span><span class="p">;</span>
</span><span class='line'>    <span class="n">vis</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">match</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="o">||</span> <span class="n">find</span><span class="p">(</span><span class="n">match</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]))</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">match</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">;</span>
</span><span class='line'>      <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">dfs</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">step</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cnt</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">cnt</span> <span class="o">&gt;=</span> <span class="n">ans</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">step</span> <span class="o">==</span> <span class="n">a</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">LinkSize</span> <span class="o">=</span> <span class="n">_link_size</span><span class="p">;</span>
</span><span class='line'>    <span class="n">memset</span><span class="p">(</span><span class="n">header</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">header</span><span class="p">)</span><span class="o">*</span><span class="n">b</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">c</span><span class="p">;</span> <span class="o">++</span><span class="n">k</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="kt">bool</span> <span class="n">flag</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="n">Edge</span> <span class="o">*</span><span class="n">e</span> <span class="o">=</span> <span class="n">head</span><span class="p">[</span><span class="n">j</span><span class="o">*</span><span class="n">c</span><span class="o">+</span><span class="n">k</span><span class="p">];</span> <span class="n">e</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">flag</span><span class="p">;</span> <span class="n">e</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span><span class='line'>          <span class="n">flag</span> <span class="o">=</span> <span class="o">!</span><span class="n">used</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">];</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">flag</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
</span><span class='line'>        <span class="n">AddEdge</span><span class="p">(</span><span class="n">header</span><span class="p">[</span><span class="n">j</span><span class="p">],</span> <span class="n">k</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="n">memset</span><span class="p">(</span><span class="n">match</span><span class="p">,</span> <span class="mh">0xFF</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">match</span><span class="p">)</span><span class="o">*</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">memset</span><span class="p">(</span><span class="n">vis</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">vis</span><span class="p">)</span><span class="o">*</span><span class="n">b</span><span class="p">);</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">((</span><span class="n">cnt</span> <span class="o">+=</span> <span class="n">find</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> <span class="o">&gt;=</span> <span class="n">ans</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">ans</span> <span class="o">=</span> <span class="n">cnt</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">used</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span> <span class="n">dfs</span><span class="p">(</span><span class="n">step</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">cnt</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="n">used</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span><span class="n">dfs</span><span class="p">(</span><span class="n">step</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">cnt</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">solve</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">a</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">&lt;=</span> <span class="n">b</span> <span class="o">&amp;&amp;</span> <span class="n">a</span> <span class="o">&lt;=</span> <span class="n">c</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">a</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">c</span><span class="p">;</span> <span class="o">++</span><span class="n">k</span><span class="p">)</span>
</span><span class='line'>          <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="n">mat</span><span class="o">+</span><span class="n">getid</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">));</span>
</span><span class='line'>  <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">b</span> <span class="o">&lt;=</span> <span class="n">a</span> <span class="o">&amp;&amp;</span> <span class="n">b</span> <span class="o">&lt;=</span> <span class="n">c</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">a</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">c</span><span class="p">;</span> <span class="o">++</span><span class="n">k</span><span class="p">)</span>
</span><span class='line'>          <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="n">mat</span><span class="o">+</span><span class="n">getid</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">c</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">c</span><span class="p">;</span> <span class="o">++</span><span class="n">k</span><span class="p">)</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">a</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>          <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="n">mat</span><span class="o">+</span><span class="n">getid</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">LinkSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">c</span><span class="p">;</span> <span class="o">++</span><span class="n">k</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">head</span><span class="p">[</span><span class="n">j</span><span class="o">*</span><span class="n">c</span><span class="o">+</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">a</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">mat</span><span class="p">[</span><span class="n">getid</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">k</span><span class="p">)])</span>
</span><span class='line'>          <span class="n">AddEdge</span><span class="p">(</span><span class="n">head</span><span class="p">[</span><span class="n">j</span><span class="o">*</span><span class="n">c</span><span class="o">+</span><span class="n">k</span><span class="p">],</span> <span class="n">i</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="n">_link_size</span> <span class="o">=</span> <span class="n">LinkSize</span><span class="p">;</span>
</span><span class='line'>  <span class="n">ans</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span>
</span><span class='line'>  <span class="n">dfs</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">ans</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">T</span><span class="p">);</span>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">T</span><span class="o">--</span><span class="p">)</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">solve</span><span class="p">());</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ2402]陶陶的难题II]]></title>
    <link href="https://quartergeek.com/bzoj2402/"/>
    <updated>2013-05-28T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj2402</id>
    <content type="html"><![CDATA[<p>Orz福州一中lyk。</p>
<p>首先我们来看，对于每个询问，如果答案的分母是固定的话，那么变成了在树链上找两个点使得<code>Yi+Qj</code>最大，这个很简单吧，直接树链剖分然后线段树里面找两个最大的数。 好，其实，这个跟这题一点关系都没有。</p>
<pre><code>但是我们可以二分答案`k`，那么问题变成了判定是否存在i, j使得
    (Yi+Qj)/(Xi+Pj) &gt;= k
也就是
    k*Xi-Yi + k*Pj-Qj &lt;= 0
因为加号左右基本是一样的，考虑左边，右边同理。不妨令
    B = k*Xi-Yi
也就是
    Yi = k*Xi - B
嗯，很像斜率优化，把(Xi, Yi)看成座标系上的点，那么实际上我们就是要在一堆点里面找到一个点使得截距-B最大</code></pre>
<p>接下来就是维护凸壳了，我们只要先做树链剖分，顺便求出dfs序，然后按照dfs序建线段树。线段树节点<code>[L, R]</code>表示dfs序上<code>[L, R]</code>的点构成的上凸壳（其实这题要维护两个上凸壳，因为完全独立，所以也没什么好说的）。然后这题就解决了。</p>
<!--more-->

<h2 id="错误">错误</h2>
<p>我出现一个比较沙茶的错误，没有发现其实建线段树的时候，插入<code>[L, R]</code>这段的点的横座标并没有升序，结果样例最后一个点死活都是错的……debug了才发现……后来就用类似于归并的东西把所有点排序了。</p>
<h2 id="代码">代码</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>bzoj2402</span><a href='http://www.lydsy.com/JudgeOnline/problem.php?id=2402'>陶陶的难题II</a>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstring&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">30001</span><span class="p">;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Edge</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">v</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Edge</span> <span class="o">*</span><span class="n">next</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">g</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="mi">2</span><span class="p">],</span> <span class="o">*</span><span class="n">header</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">AddEdge</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">int</span> <span class="n">LinkSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Edge</span><span class="o">*</span> <span class="k">const</span> <span class="n">node</span> <span class="o">=</span> <span class="n">g</span><span class="o">+</span><span class="p">(</span><span class="n">LinkSize</span><span class="o">++</span><span class="p">);</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">=</span> <span class="n">y</span><span class="p">;</span>
</span><span class='line'>  <span class="n">node</span><span class="o">-&gt;</span><span class="n">next</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">];</span>
</span><span class='line'>  <span class="n">header</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Point</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">double</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Point</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">Point</span><span class="p">(</span><span class="k">const</span> <span class="kt">double</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">double</span> <span class="n">b</span><span class="p">)</span><span class="o">:</span> <span class="n">x</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">y</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">bool</span> <span class="k">operator</span><span class="o">&lt;</span><span class="p">(</span><span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">x</span> <span class="o">&lt;</span> <span class="n">rhs</span><span class="p">.</span><span class="n">x</span> <span class="o">||</span> <span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">x</span> <span class="o">==</span> <span class="n">rhs</span><span class="p">.</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">lhs</span><span class="p">.</span><span class="n">y</span> <span class="o">&lt;</span> <span class="n">rhs</span><span class="p">.</span><span class="n">y</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="k">const</span> <span class="n">Point</span> <span class="n">O</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">double</span> <span class="n">cross</span><span class="p">(</span><span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">A</span><span class="p">,</span> <span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">B</span><span class="p">,</span> <span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">C</span><span class="p">,</span> <span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span> <span class="n">D</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">double</span> <span class="n">x1</span> <span class="o">=</span> <span class="n">B</span><span class="p">.</span><span class="n">x</span><span class="o">-</span><span class="n">A</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">y1</span> <span class="o">=</span> <span class="n">B</span><span class="p">.</span><span class="n">y</span><span class="o">-</span><span class="n">A</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">double</span> <span class="n">x2</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">x</span><span class="o">-</span><span class="n">C</span><span class="p">.</span><span class="n">x</span><span class="p">,</span> <span class="n">y2</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">y</span><span class="o">-</span><span class="n">C</span><span class="p">.</span><span class="n">y</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">x1</span><span class="o">*</span><span class="n">y2</span><span class="o">-</span><span class="n">x2</span><span class="o">*</span><span class="n">y1</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//------Segment Tree</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Segment</span> <span class="p">{</span> <span class="n">Point</span> <span class="o">*</span><span class="n">Q</span><span class="p">;</span> <span class="kt">int</span> <span class="n">tail</span><span class="p">;</span> <span class="p">};</span>
</span><span class='line'><span class="n">Point</span> <span class="n">point</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">_memory</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="mi">32</span><span class="p">],</span> <span class="o">*</span><span class="n">_memory_top</span> <span class="o">=</span> <span class="n">_memory</span><span class="p">;</span>
</span><span class='line'><span class="n">Segment</span> <span class="n">s</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="n">MAXN</span><span class="o">*</span><span class="mi">4</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">_t</span><span class="p">,</span> <span class="n">_st</span><span class="p">,</span> <span class="n">_ed</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">pos</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">double</span> <span class="n">_k</span><span class="p">;</span>
</span><span class='line'><span class="kt">double</span> <span class="n">_query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">_st</span> <span class="o">&lt;=</span> <span class="n">lef</span> <span class="o">&amp;&amp;</span> <span class="n">rig</span> <span class="o">&lt;=</span> <span class="n">_ed</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Point</span> <span class="o">*</span><span class="n">Q</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">_t</span><span class="p">][</span><span class="n">p</span><span class="p">].</span><span class="n">Q</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">int</span> <span class="n">l</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">_t</span><span class="p">][</span><span class="n">p</span><span class="p">].</span><span class="n">tail</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">r</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">const</span> <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="p">(</span><span class="n">l</span><span class="o">+</span><span class="n">r</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">cross</span><span class="p">(</span><span class="n">Q</span><span class="p">[</span><span class="n">m</span><span class="p">],</span> <span class="n">Q</span><span class="p">[</span><span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">O</span><span class="p">,</span> <span class="n">Point</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">_k</span><span class="p">))</span> <span class="o">&gt;=</span> <span class="o">-</span><span class="mf">1e-6</span><span class="p">)</span> <span class="n">r</span> <span class="o">=</span> <span class="n">m</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>      <span class="k">else</span> <span class="n">l</span> <span class="o">=</span> <span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">Q</span><span class="p">[</span><span class="n">l</span><span class="p">].</span><span class="n">x</span> <span class="o">*</span> <span class="n">_k</span> <span class="o">-</span> <span class="n">Q</span><span class="p">[</span><span class="n">l</span><span class="p">].</span><span class="n">y</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">double</span> <span class="n">res</span> <span class="o">=</span> <span class="mf">1e10</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">_st</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">_query</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">mid</span><span class="o">+</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">_ed</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">min</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">_query</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">));</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">bool</span> <span class="n">cmp</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">point</span><span class="p">[</span><span class="n">lhs</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">point</span><span class="p">[</span><span class="n">rhs</span><span class="p">];</span> <span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">Build</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">int</span> <span class="n">tmp</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">!=</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Build</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>    <span class="n">Build</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">t</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">t</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">;</span> <span class="o">++</span><span class="n">t</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">lef</span><span class="p">,</span> <span class="n">l1</span> <span class="o">=</span> <span class="n">lef</span><span class="p">,</span> <span class="n">l2</span> <span class="o">=</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">rig</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">l2</span> <span class="o">&gt;</span> <span class="n">rig</span> <span class="o">||</span> <span class="p">(</span><span class="n">l1</span> <span class="o">&lt;=</span> <span class="n">mid</span> <span class="o">&amp;&amp;</span> <span class="n">point</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">pos</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">l1</span><span class="p">]]</span> <span class="o">&lt;</span> <span class="n">point</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">pos</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">l2</span><span class="p">]]))</span> <span class="n">tmp</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">l1</span><span class="o">++</span><span class="p">];</span>
</span><span class='line'>      <span class="k">else</span> <span class="n">tmp</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">l2</span><span class="o">++</span><span class="p">];</span>
</span><span class='line'>    <span class="n">memcpy</span><span class="p">(</span><span class="n">pos</span><span class="p">[</span><span class="n">t</span><span class="p">]</span><span class="o">+</span><span class="n">lef</span><span class="p">,</span> <span class="n">tmp</span><span class="p">[</span><span class="n">t</span><span class="p">]</span><span class="o">+</span><span class="n">lef</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="o">*</span><span class="n">tmp</span><span class="p">[</span><span class="n">t</span><span class="p">])</span><span class="o">*</span><span class="p">(</span><span class="n">rig</span><span class="o">-</span><span class="n">lef</span><span class="o">+</span><span class="mi">1</span><span class="p">));</span>
</span><span class='line'>    <span class="n">Point</span> <span class="o">*&amp;</span><span class="n">Q</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">p</span><span class="p">].</span><span class="n">Q</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">int</span><span class="o">&amp;</span> <span class="n">tail</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">p</span><span class="p">].</span><span class="n">tail</span><span class="p">;</span>
</span><span class='line'>    <span class="n">Q</span> <span class="o">=</span> <span class="n">_memory_top</span><span class="p">,</span> <span class="n">tail</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">_memory_top</span> <span class="o">+=</span> <span class="n">rig</span><span class="o">-</span><span class="n">lef</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">lef</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">rig</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">while</span> <span class="p">(</span><span class="n">tail</span> <span class="o">&gt;=</span> <span class="mi">1</span> <span class="o">&amp;&amp;</span> <span class="n">cross</span><span class="p">(</span><span class="n">Q</span><span class="p">[</span><span class="n">tail</span><span class="p">],</span> <span class="n">Q</span><span class="p">[</span><span class="n">tail</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">Q</span><span class="p">[</span><span class="n">tail</span><span class="p">],</span> <span class="n">point</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">pos</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">i</span><span class="p">]])</span> <span class="o">&lt;=</span> <span class="mf">1e-6</span><span class="p">)</span> <span class="o">--</span><span class="n">tail</span><span class="p">;</span>
</span><span class='line'>      <span class="n">Q</span><span class="p">[</span><span class="o">++</span><span class="n">tail</span><span class="p">]</span> <span class="o">=</span> <span class="n">point</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">pos</span><span class="p">[</span><span class="n">t</span><span class="p">][</span><span class="n">i</span><span class="p">]];</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">double</span> <span class="n">Query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">,</span> <span class="k">const</span> <span class="kt">double</span> <span class="n">k</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">_t</span> <span class="o">=</span> <span class="n">t</span><span class="p">,</span> <span class="n">_st</span> <span class="o">=</span> <span class="n">lef</span><span class="p">,</span> <span class="n">_ed</span> <span class="o">=</span> <span class="n">rig</span><span class="p">,</span> <span class="n">_k</span> <span class="o">=</span> <span class="n">k</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">_query</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="c1">//------Heavy Light Decomposition</span>
</span><span class='line'><span class="k">typedef</span> <span class="kt">int</span> <span class="n">Array</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="n">Array</span> <span class="n">number</span><span class="p">,</span> <span class="n">dfn</span><span class="p">,</span> <span class="n">hson</span><span class="p">,</span> <span class="n">top</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">depth</span><span class="p">,</span> <span class="n">size</span><span class="p">;</span>
</span><span class='line'><span class="kt">void</span> <span class="n">dfs1</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">u</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">size</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">Edge</span> <span class="o">*</span><span class="n">e</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">u</span><span class="p">];</span> <span class="n">e</span><span class="p">;</span> <span class="n">e</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">!=</span> <span class="n">parent</span><span class="p">[</span><span class="n">u</span><span class="p">])</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">parent</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">;</span>
</span><span class='line'>      <span class="n">depth</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">depth</span><span class="p">[</span><span class="n">u</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>      <span class="n">dfs1</span><span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">);</span>
</span><span class='line'>      <span class="n">size</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">+=</span> <span class="n">size</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">];</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">size</span><span class="p">[</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">size</span><span class="p">[</span><span class="n">hson</span><span class="p">[</span><span class="n">u</span><span class="p">]])</span>
</span><span class='line'>        <span class="n">hson</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">dfs2</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">tp</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">int</span> <span class="n">timestamp</span><span class="p">;</span>
</span><span class='line'>  <span class="n">number</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="o">++</span><span class="n">timestamp</span><span class="p">,</span> <span class="n">dfn</span><span class="p">[</span><span class="n">timestamp</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">,</span> <span class="n">top</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">tp</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">hson</span><span class="p">[</span><span class="n">u</span><span class="p">])</span>
</span><span class='line'>    <span class="n">dfs2</span><span class="p">(</span><span class="n">hson</span><span class="p">[</span><span class="n">u</span><span class="p">],</span> <span class="n">tp</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">Edge</span> <span class="o">*</span><span class="n">e</span> <span class="o">=</span> <span class="n">header</span><span class="p">[</span><span class="n">u</span><span class="p">];</span> <span class="n">e</span><span class="p">;</span> <span class="n">e</span> <span class="o">=</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">next</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">!=</span> <span class="n">parent</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span> <span class="o">!=</span> <span class="n">hson</span><span class="p">[</span><span class="n">u</span><span class="p">])</span>
</span><span class='line'>      <span class="n">dfs2</span><span class="p">(</span><span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">,</span> <span class="n">e</span><span class="o">-&gt;</span><span class="n">v</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">double</span> <span class="n">query</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">,</span> <span class="kt">double</span> <span class="n">k</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">double</span> <span class="n">ans0</span> <span class="o">=</span> <span class="mf">1e10</span><span class="p">,</span> <span class="n">ans1</span> <span class="o">=</span> <span class="mf">1e10</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">ta</span> <span class="o">=</span> <span class="n">top</span><span class="p">[</span><span class="n">a</span><span class="p">],</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">top</span><span class="p">[</span><span class="n">b</span><span class="p">];</span> <span class="n">ta</span> <span class="o">!=</span> <span class="n">tb</span><span class="p">;</span> <span class="n">a</span> <span class="o">=</span> <span class="n">parent</span><span class="p">[</span><span class="n">ta</span><span class="p">],</span> <span class="n">ta</span> <span class="o">=</span> <span class="n">top</span><span class="p">[</span><span class="n">a</span><span class="p">])</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">depth</span><span class="p">[</span><span class="n">ta</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">depth</span><span class="p">[</span><span class="n">tb</span><span class="p">])</span>
</span><span class='line'>      <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">ta</span><span class="p">,</span> <span class="n">tb</span><span class="p">),</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ans0</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">min</span><span class="p">(</span><span class="n">ans0</span><span class="p">,</span> <span class="n">Query</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">number</span><span class="p">[</span><span class="n">ta</span><span class="p">],</span> <span class="n">number</span><span class="p">[</span><span class="n">a</span><span class="p">],</span> <span class="n">k</span><span class="p">));</span>
</span><span class='line'>    <span class="n">ans1</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">min</span><span class="p">(</span><span class="n">ans1</span><span class="p">,</span> <span class="n">Query</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">number</span><span class="p">[</span><span class="n">ta</span><span class="p">],</span> <span class="n">number</span><span class="p">[</span><span class="n">a</span><span class="p">],</span> <span class="n">k</span><span class="p">));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">depth</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">depth</span><span class="p">[</span><span class="n">b</span><span class="p">])</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>
</span><span class='line'>  <span class="n">ans0</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">min</span><span class="p">(</span><span class="n">ans0</span><span class="p">,</span> <span class="n">Query</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">number</span><span class="p">[</span><span class="n">a</span><span class="p">],</span> <span class="n">number</span><span class="p">[</span><span class="n">b</span><span class="p">],</span> <span class="n">k</span><span class="p">));</span>
</span><span class='line'>  <span class="n">ans1</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">min</span><span class="p">(</span><span class="n">ans1</span><span class="p">,</span> <span class="n">Query</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">number</span><span class="p">[</span><span class="n">a</span><span class="p">],</span> <span class="n">number</span><span class="p">[</span><span class="n">b</span><span class="p">],</span> <span class="n">k</span><span class="p">));</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">ans0</span><span class="o">+</span><span class="n">ans1</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%lf&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%lf&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">point</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%lf&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">x</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%lf&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">point</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">y</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">x</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">y</span><span class="p">);</span>
</span><span class='line'>    <span class="n">AddEdge</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
</span><span class='line'>    <span class="n">AddEdge</span><span class="p">(</span><span class="n">y</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">dfs1</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="n">dfs2</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">pos</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">pos</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">dfn</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>  <span class="n">Build</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">x</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">y</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">double</span> <span class="n">lef</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">rig</span> <span class="o">=</span> <span class="mf">1e10</span><span class="p">;</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span><span class="n">rig</span><span class="o">-</span><span class="n">lef</span> <span class="o">&gt;</span> <span class="mf">1e-8</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">const</span> <span class="kt">double</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">query</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">mid</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="o">-</span><span class="mf">1e-6</span><span class="p">)</span> <span class="n">rig</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
</span><span class='line'>      <span class="k">else</span> <span class="n">lef</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%.4f</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Word 2010 制作可填表格]]></title>
    <link href="https://quartergeek.com/create-form-with-word-2010/"/>
    <updated>2013-05-25T00:00:00+08:00</updated>
    <id>https://quartergeek.com/create-form-with-word-2010</id>
    <content type="html"><![CDATA[<h2 id="前言">前言</h2>
<p>前不久刚填完 <em>sjtu</em> 的夏令营报名表，怎么说呢，我个人一直对朴素的Word文档填表很反感。大概是上次因为帐户问题需要填 <em>BudgetVM</em> 的各种证明，这才发现国外比较通用的做法是使用可填式pdf或者word文档。 <strong>这类文档制作起来比较麻烦，但是对于填表人来说，个人感觉会方便许多</strong> 。</p>
<p>后来Google了一下如何制作可填式pdf，发现都要用<em>Adobe Acrobat</em>，印象中Adobe的东西都是很贵的，于是乎只好转向比较大众化的Word。因为目前大家Word版本都比较高，起码都2007了，所以本文就放弃doc格式，以<em>Word 2010</em>为例。</p>
<!--more-->

<h2 id="方法">方法</h2>
<p>依次点击【文件 - 选项 - 自定义功能区 - 主选项卡】，勾选【开发工具】。</p>
<figure>
<img src="http://oi.abcdabcd987.com/attachment/create-form-with-word-2010/1.png" alt="Step 1" /><figcaption>Step 1</figcaption>
</figure>
<p>然后在需要填表的地方，选择【开发工具-纯文本内容控件】。有需要的话可以插入控件之后点击【属性】进行设置。</p>
<figure>
<img src="http://oi.abcdabcd987.com/attachment/create-form-with-word-2010/2.png" alt="Step 2" /><figcaption>Step 2</figcaption>
</figure>
<p>设置完控件效果如下。如果要去掉那些字的话，可以用空格代替。</p>
<figure>
<img src="http://oi.abcdabcd987.com/attachment/create-form-with-word-2010/3.png" alt="Step 3" /><figcaption>Step 3</figcaption>
</figure>
<p>接下来要限制编辑。【开发工具-限制编辑-仅允许文档中进行此类型的编辑】，选择【填写窗体】，然后启动保护，设置密码。</p>
<figure>
<img src="http://oi.abcdabcd987.com/attachment/create-form-with-word-2010/4.png" alt="Step 4" /><figcaption>Step 4</figcaption>
</figure>
<p>大功告成！如果需要解除限制，就得输入刚才的密码。分发的时候只要不分发那个密码即可。</p>
<h2 id="例子">例子</h2>
<p>做了一份例子，可以在<a href="http://oi.abcdabcd987.com/attachment/create-form-with-word-2010/sample.docx">这里</a>下载到。密码是<code>123456</code>。</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Fast Fourier Transform]]></title>
    <link href="https://quartergeek.com/fast-fourier-transform/"/>
    <updated>2013-05-22T00:00:00+08:00</updated>
    <id>https://quartergeek.com/fast-fourier-transform</id>
    <content type="html"><![CDATA[<h2 id="为什么需要fft">为什么需要FFT</h2>
<p>我们都知道对于两个多项式<code>f(x)</code>和<code>g(x)</code>，朴素的方法计算它们的乘积<code>h(x) = f(x) * g(x)</code>需要<code>O(n^2)</code>的时间。这里隐含了一个条件：<code>f(x)</code>和<code>g(x)</code>都是系数形式表示的多项式，比如说： <code>f(x) = a0x^0 + a1x^1 + a2x^2 + ... + an-1x^n-1</code> 。</p>
<p>实际上多项式还有一种点值表示法，就是 <code>f = {(p1, f(p1)), (p2, f(p2)), (p3, f(p3)), ..., (pn, f(pn))}</code> ，也就是初中熟悉的待定系数法求多项式。这种看起来十分反人类的表示方法其实有一个非常大的好处：在两个多项式的采样点相同的时候，它们的四则运算都是<code>O(n)</code>的复杂度。比如说对于<code>f = {(pi, f(pi))}</code>和<code>g = {(pi, g(pi))}</code>，求<code>h = f*g</code>，那么很容易得到<code>h = {(pi, f(pi)*g(pi))}</code>，也就是<code>x</code>不变，<code>y</code>相乘。</p>
<p>于是，就有了一种比较曲折的计算<code>f(x)*g(x)</code>的方法：</p>
<ol type="1">
<li>对<code>f(x)</code>和<code>g(x)</code>求值（系数形式转成点值形式 <em>DFT</em>）</li>
<li>在<code>f</code>和<code>g</code>点值形式上进行乘法得到<code>h</code></li>
<li>对<code>h</code>插值，得到<code>h(x)</code>（点值形式转成系数形式 <em>IDFT</em>）</li>
</ol>
<p>对于朴素方法，上面三步的复杂度分别为<code>O(n^2), O(n), O(n^3)</code>，然而巧妙的使用单位负根可以使复杂度变成<code>O(nlogn), O(n), O(nlogn)</code>，赶快去膜拜傅立叶大神吧！</p>
<p>什么时候需要多项式乘法呢？比如高精乘，比如<strong>卷积</strong>（<code>h[i] = f[j]*g[i-j]</code>）</p>
<h2 id="discrete-fourier-transform">Discrete Fourier Transform</h2>
<p>DFT的作用就是把一个系数形式的多项式转换成点值形式。IDFT就是反过来。FFT和IFFT实际上就是用<code>O(nlogn)</code>的时间完成DFT和IDFT。</p>
<!--more-->

<h2 id="单位复根">单位复根</h2>
<p>FFT利用的是单位复根的一些非常有意思的性质。</p>
<p><a href="https://en.wikipedia.org/wiki/Euler%27s_identity">欧拉恒等式</a>告诉我们<code>e^ix = cos(x) + isin(x)</code>，而n次单位复根<strong><code>Wn</code></strong>则是指<code>e^(2πi/n)</code>，可以发现<code>Wn</code>的<code>0</code>到<code>n-1</code>次幂正好把一个复平面上的单位圆平均分成了<code>n</code>份。有一些性质：</p>
<ul>
<li><code>Wn^j = -Wn^(j+n/2)</code> 这个是因为它们在复平面上方向相反</li>
<li><code>W(an)^(aj) = Wn^j</code> 这个叫做相消引理</li>
<li><code>(Wn^j)^2 = W(n/2)^j</code> 这个由相消引理容易得到</li>
<li><code>{(Wn^j)^2 | j = 0..n-1} = {W(n/2)^k | k = 0..n/2-1}</code> 这个叫做折半引理，实际上就是上面的集合形式</li>
</ul>
<h2 id="fast-fourier-transform">Fast Fourier Transform</h2>
<p>FFT的精髓在于，选取n个n次单位复根作为采样点，由折半引理可以知道，只需要计算<code>n/2</code>个采样值，递归下去做，由主定理就可以得到总的复杂度为<code>O(nlogn)</code>。为了方便起见，一般把n补充为<code>2^k</code>的形式。</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>如果把
</span><span class='line'>    f(x)  = a0x^0 + a1x^1 + a2x^2 + a3x^3 + ... + an-1x^n-1
</span><span class='line'>拆成
</span><span class='line'>    f0(x) = a0x^0 + a2x^1 + a4x^2 + ... + an-2x^n/2-1
</span><span class='line'>    f1(x) = a1x^0 + a3x^1 + a5x^2 + ... + an-1x^n/2-1
</span><span class='line'>那么就有
</span><span class='line'>    f(x)  = f0(x^2) + x*f1(x^2)</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<p>写成程序大概就是</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Recursive_FFT(A[n])
</span><span class='line'>    Wn, w = e^(2πi/n), 1
</span><span class='line'>    Y0 = Recursive_FFT(A[0], A[2], A[4], ...)
</span><span class='line'>    Y1 = Recursive_FFT(A[1], A[3], A[5], ...)
</span><span class='line'>    For (k=0;k&lt;n/2;k++)
</span><span class='line'>        Y[k]     = Y0[k] + w*Y1[k]
</span><span class='line'>        Y[k+n/2] = Y0[k] - w*Y1[k]
</span><span class='line'>        w=w*wn
</span><span class='line'>    Return(Y)</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<h2 id="inversed-fast-fourier-transform">Inversed Fast Fourier Transform</h2>
<p>转回来的方法就是：单位复根<code>Wn</code>转成<code>e^(-2πi/n)</code>，然后把<code>y[i] /= n</code>。</p>
<h2 id="避免递归">避免递归</h2>
<p>上面那个递归版本的FFT实际上常数很大，因为要复制数组。我们观察一下递归树，假设这是一个长度为8的多项式。</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>+===============================================+
</span><span class='line'>| 000   001   010   011   100   101   110   111 |
</span><span class='line'>+-----------------------------------------------+
</span><span class='line'>| 000   010   100   110 | 001   011   101   111 |
</span><span class='line'>+-----------------------------------------------+
</span><span class='line'>| 000   100 | 010   110 | 001   101 | 011   111 |
</span><span class='line'>+-----------------------------------------------+
</span><span class='line'>| 000 | 100 | 010 | 110 | 001 | 101 | 011 | 111 |
</span><span class='line'>+===============================================+</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<p>实际上，从叶子往上做的话就是把每个数的二进制位颠倒过来。</p>
<h2 id="c-code">C++ Code</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="k">struct</span> <span class="n">Complex</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">double</span> <span class="n">real</span><span class="p">,</span> <span class="n">imag</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Complex</span><span class="p">(</span><span class="k">const</span> <span class="kt">double</span> <span class="n">r</span> <span class="o">=</span> <span class="mf">.0</span><span class="p">,</span> <span class="k">const</span> <span class="kt">double</span> <span class="n">i</span> <span class="o">=</span> <span class="mf">.0</span><span class="p">)</span><span class="o">:</span> <span class="n">real</span><span class="p">(</span><span class="n">r</span><span class="p">),</span> <span class="n">imag</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="k">const</span> <span class="n">Complex</span> <span class="n">ZERO</span><span class="p">(</span><span class="mf">.0</span><span class="p">,</span> <span class="mf">.0</span><span class="p">);</span>
</span><span class='line'><span class="kr">inline</span> <span class="n">Complex</span> <span class="k">operator</span><span class="o">+</span><span class="p">(</span><span class="k">const</span> <span class="n">Complex</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Complex</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">Complex</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">real</span><span class="o">+</span><span class="n">rhs</span><span class="p">.</span><span class="n">real</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">imag</span><span class="o">+</span><span class="n">rhs</span><span class="p">.</span><span class="n">imag</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="n">Complex</span> <span class="k">operator</span><span class="o">-</span><span class="p">(</span><span class="k">const</span> <span class="n">Complex</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Complex</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">Complex</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">real</span><span class="o">-</span><span class="n">rhs</span><span class="p">.</span><span class="n">real</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">imag</span><span class="o">-</span><span class="n">rhs</span><span class="p">.</span><span class="n">imag</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="n">Complex</span> <span class="k">operator</span><span class="o">*</span><span class="p">(</span><span class="k">const</span> <span class="n">Complex</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Complex</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">Complex</span><span class="p">(</span><span class="n">lhs</span><span class="p">.</span><span class="n">real</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">real</span><span class="o">-</span><span class="n">lhs</span><span class="p">.</span><span class="n">imag</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">imag</span><span class="p">,</span> <span class="n">lhs</span><span class="p">.</span><span class="n">real</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">imag</span><span class="o">+</span><span class="n">lhs</span><span class="p">.</span><span class="n">imag</span><span class="o">*</span><span class="n">rhs</span><span class="p">.</span><span class="n">real</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">int</span> <span class="n">bit_reverse</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">res</span> <span class="o">|=</span> <span class="p">(</span><span class="n">x</span><span class="o">&gt;&gt;</span><span class="n">i</span><span class="o">&amp;</span><span class="mi">1</span><span class="p">)</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">fft</span><span class="p">(</span><span class="n">Complex</span> <span class="n">y</span><span class="p">[],</span> <span class="k">const</span> <span class="n">Complex</span> <span class="n">a</span><span class="p">[],</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rev</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">len</span> <span class="o">=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">n</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">bit_reverse</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">n</span><span class="p">)];</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">d</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">d</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">d</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">d</span><span class="p">;</span>
</span><span class='line'>    <span class="k">const</span> <span class="n">Complex</span> <span class="n">wn</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cos</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">PI</span><span class="o">/</span><span class="n">m</span><span class="o">*</span><span class="n">rev</span><span class="p">),</span> <span class="n">std</span><span class="o">::</span><span class="n">sin</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">PI</span><span class="o">/</span><span class="n">m</span><span class="o">*</span><span class="n">rev</span><span class="p">));</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="n">k</span> <span class="o">+=</span> <span class="n">m</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">Complex</span> <span class="n">w</span><span class="p">(</span><span class="mf">1.</span><span class="p">,</span> <span class="mf">.0</span><span class="p">);</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">m</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="k">const</span> <span class="n">Complex</span> <span class="n">u</span> <span class="o">=</span> <span class="n">y</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="n">j</span><span class="p">],</span> <span class="n">t</span> <span class="o">=</span> <span class="n">w</span><span class="o">*</span><span class="n">y</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="n">j</span><span class="o">+</span><span class="n">m</span><span class="o">/</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'>        <span class="n">y</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="o">+</span><span class="n">t</span><span class="p">,</span> <span class="n">y</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="n">j</span><span class="o">+</span><span class="n">m</span><span class="o">/</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="o">-</span><span class="n">t</span><span class="p">;</span>
</span><span class='line'>        <span class="n">w</span> <span class="o">=</span> <span class="n">w</span><span class="o">*</span><span class="n">wn</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">rev</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">real</span> <span class="o">/=</span> <span class="n">len</span><span class="p">,</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">imag</span> <span class="o">=</span> <span class="mf">.0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">convolution</span><span class="p">(</span><span class="n">Complex</span> <span class="n">c</span><span class="p">[],</span> <span class="n">Complex</span> <span class="n">a</span><span class="p">[],</span> <span class="n">Complex</span> <span class="n">b</span><span class="p">[],</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">la</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lb</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="n">Complex</span> <span class="n">tmp1</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">tmp2</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">len</span> <span class="o">=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">n</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(;</span> <span class="n">len</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">*</span><span class="n">la</span> <span class="o">||</span> <span class="n">len</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">*</span><span class="n">lb</span><span class="p">;</span> <span class="o">++</span><span class="n">n</span><span class="p">)</span> <span class="n">len</span> <span class="o">&lt;&lt;=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">fill</span><span class="p">(</span><span class="n">a</span><span class="o">+</span><span class="n">la</span><span class="p">,</span> <span class="n">a</span><span class="o">+</span><span class="n">len</span><span class="p">,</span> <span class="n">ZERO</span><span class="p">);</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">fill</span><span class="p">(</span><span class="n">b</span><span class="o">+</span><span class="n">lb</span><span class="p">,</span> <span class="n">b</span><span class="o">+</span><span class="n">len</span><span class="p">,</span> <span class="n">ZERO</span><span class="p">);</span>
</span><span class='line'>  <span class="n">fft</span><span class="p">(</span><span class="n">tmp1</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="n">fft</span><span class="p">(</span><span class="n">tmp2</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">tmp1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">tmp2</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>  <span class="n">fft</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">tmp1</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<hr />
<h2 id="fnt">FNT</h2>
<p>有时候答案不会很大，可以用<code>mod p</code>的剩余系来代替复数。因为对于质数<code>p</code>的原根<code>g</code>，有<code>g^(p-1) mod p = 1</code>，所以可以把<code>g^(p-1)/n</code>作为单位根使用。<code>p</code>可以选取形如<code>c*2^k + 1</code>的质数。</p>
<p>IFNT的时候，只需要把<code>1~n-1</code>翻过来，并且乘上n的乘法逆元即可。</p>
<h2 id="c-code-1">C++ Code</h2>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">P</span> <span class="o">=</span> <span class="mi">1004535809LL</span><span class="p">,</span> <span class="n">G</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">powmod</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">base</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">k</span><span class="p">,</span> <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">mod</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(;</span> <span class="n">k</span><span class="p">;</span> <span class="n">k</span> <span class="o">&gt;&gt;=</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">k</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">ans</span><span class="o">*</span><span class="n">base</span><span class="o">%</span><span class="n">mod</span><span class="p">;</span>
</span><span class='line'>    <span class="n">base</span> <span class="o">=</span> <span class="n">base</span><span class="o">*</span><span class="n">base</span><span class="o">%</span><span class="n">mod</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">ans</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">int</span> <span class="n">bit_reverse</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">n</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">res</span> <span class="o">|=</span> <span class="p">(</span><span class="n">x</span><span class="o">&gt;&gt;</span><span class="n">i</span><span class="o">&amp;</span><span class="mi">1</span><span class="p">)</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">fnt</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">y</span><span class="p">[],</span> <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">a</span><span class="p">[],</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rev</span> <span class="o">=</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">len</span> <span class="o">=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">n</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">bit_reverse</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">n</span><span class="p">)];</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">d</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">d</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">d</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">d</span><span class="p">;</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">wn</span> <span class="o">=</span> <span class="n">powmod</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="p">(</span><span class="n">P</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">m</span><span class="p">,</span> <span class="n">P</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="n">k</span> <span class="o">+=</span> <span class="n">m</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="kt">long</span> <span class="kt">long</span> <span class="n">w</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">m</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">u</span> <span class="o">=</span> <span class="n">y</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="n">j</span><span class="p">],</span> <span class="n">t</span> <span class="o">=</span> <span class="n">w</span><span class="o">*</span><span class="n">y</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="n">j</span><span class="o">+</span><span class="n">m</span><span class="o">/</span><span class="mi">2</span><span class="p">];</span>
</span><span class='line'>        <span class="n">y</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">u</span><span class="o">+</span><span class="n">t</span><span class="p">)</span><span class="o">%</span><span class="n">P</span><span class="p">,</span> <span class="n">y</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="n">j</span><span class="o">+</span><span class="n">m</span><span class="o">/</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">u</span><span class="o">-</span><span class="n">t</span><span class="p">)</span><span class="o">%</span><span class="n">P</span><span class="p">;</span>
</span><span class='line'>        <span class="n">w</span> <span class="o">=</span> <span class="n">w</span><span class="o">*</span><span class="n">wn</span><span class="o">%</span><span class="n">P</span><span class="p">;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">rev</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">inv</span> <span class="o">=</span> <span class="n">powmod</span><span class="p">(</span><span class="n">len</span><span class="p">,</span> <span class="n">P</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="n">P</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">y</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">inv</span><span class="o">%</span><span class="n">P</span><span class="o">+</span><span class="n">P</span><span class="p">)</span><span class="o">%</span><span class="n">P</span><span class="p">;</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">reverse</span><span class="p">(</span><span class="n">y</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="o">+</span><span class="n">len</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">convolution</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">c</span><span class="p">[],</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">a</span><span class="p">[],</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">b</span><span class="p">[],</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">la</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lb</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">tmp1</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">tmp2</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">len</span> <span class="o">=</span> <span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">n</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(;</span> <span class="n">len</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">*</span><span class="n">la</span> <span class="o">||</span> <span class="n">len</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="o">*</span><span class="n">lb</span><span class="p">;</span> <span class="o">++</span><span class="n">n</span><span class="p">)</span> <span class="n">len</span> <span class="o">&lt;&lt;=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">fill</span><span class="p">(</span><span class="n">a</span><span class="o">+</span><span class="n">la</span><span class="p">,</span> <span class="n">a</span><span class="o">+</span><span class="n">len</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">fill</span><span class="p">(</span><span class="n">b</span><span class="o">+</span><span class="n">lb</span><span class="p">,</span> <span class="n">b</span><span class="o">+</span><span class="n">len</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
</span><span class='line'>  <span class="n">fnt</span><span class="p">(</span><span class="n">tmp1</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="n">fnt</span><span class="p">(</span><span class="n">tmp2</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">len</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">tmp1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">tmp2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">%</span><span class="n">P</span><span class="p">;</span>
</span><span class='line'>  <span class="n">fnt</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">tmp1</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[VPS上配置Git+Octopress]]></title>
    <link href="https://quartergeek.com/deploy-octopress-git-on-vps/"/>
    <updated>2013-05-18T00:00:00+08:00</updated>
    <id>https://quartergeek.com/deploy-octopress-git-on-vps</id>
    <content type="html"><![CDATA[<p>终于用了一整天的时间，把博客从<em>Wordpress</em>换到了<em>Octopress</em>。我是希望在本地能不装<code>ruby</code>但是服务器能自动更新，并且希望支持历史版本，在网上找了一整天也试了一整天，整理出下面代码备忘：</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>Create git repository on VPS</span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>server<span class="nv">$ </span><span class="nb">cd</span> ~
</span><span class='line'>server<span class="nv">$ </span>mkdir oi.abcdabcd987.com.git
</span><span class='line'>server<span class="nv">$ </span><span class="nb">cd </span>oi.abcdabcd987.com.git
</span><span class='line'>server<span class="nv">$ </span>git init --bare
</span><span class='line'>server<span class="nv">$ </span><span class="nb">pwd</span>
</span><span class='line'>/home/quartergeek/oi.abcdabcd987.com.git
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>Install Octopress on VPS</span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>server<span class="nv">$ </span><span class="nb">cd</span> /tmp
</span><span class='line'>server<span class="nv">$ </span>git clone git://github.com/imathis/octopress.git octopress
</span><span class='line'>server<span class="nv">$ </span><span class="nb">cd </span>octopress
</span><span class='line'>server<span class="nv">$ </span>bundle install
</span><span class='line'>server<span class="nv">$ </span>rake install
</span><span class='line'>server<span class="nv">$ </span>git add .
</span><span class='line'>server<span class="nv">$ </span>git commit -m <span class="s1">&#39;init octopress&#39;</span>
</span><span class='line'>server<span class="nv">$ </span>git remote rename origin octopress
</span><span class='line'>server<span class="nv">$ </span>git remote add origin /home/quartergeek/oi.abcdabcd987.com.git
</span><span class='line'>server<span class="nv">$ </span>git config branch.master.remote origin
</span><span class='line'>server<span class="nv">$ </span>git push origin master
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>Setup auto generate on VPS</span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>server<span class="nv">$ </span><span class="nb">cd</span> /home/quartergeek/oi.abcdabcd987.com.git
</span><span class='line'>server<span class="nv">$ </span><span class="nb">echo</span> <span class="s">&lt;&lt;EOF &gt; hooks/post-receive</span>
</span><span class='line'><span class="s">&gt; #!/bin/bash -l</span>
</span><span class='line'><span class="s">&gt; GIT_REPO=/home/quartergeek/oi.abcdabcd987.com.git</span>
</span><span class='line'><span class="s">&gt; TMP_GIT_CLONE=/tmp/oi.abcdabcd987.com</span>
</span><span class='line'><span class="s">&gt; PUBLIC_WWW=/home/wwwroot/oi.abcdabcd987.com/octopress</span>
</span><span class='line'><span class="s">&gt; </span>
</span><span class='line'><span class="s">&gt; git clone $GIT_REPO $TMP_GIT_CLONE</span>
</span><span class='line'><span class="s">&gt; cd $TMP_GIT_CLONE</span>
</span><span class='line'><span class="s">&gt; bundle install</span>
</span><span class='line'><span class="s">&gt; time rake generate</span>
</span><span class='line'><span class="s">&gt; cp -Rf public/* $PUBLIC_WWW</span>
</span><span class='line'><span class="s">&gt; rm -Rf $TMP_GIT_CLONE</span>
</span><span class='line'><span class="s">&gt; exit</span>
</span><span class='line'><span class="s">&gt; EOF</span>
</span><span class='line'>server<span class="nv">$ </span>chmod +x hooks/post-receive
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span>Clone repository on laptop</span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>laptop<span class="nv">$ </span>git clone ssh://quartergeek@209.141.57.185/home/quartergeek/oi.abcdabcd987.com.git
</span><span class='line'>laptop<span class="nv">$ </span><span class="nb">cd </span>oi.abcdabcd987.com
</span><span class='line'>laptop<span class="nv">$ </span>vim _config.yml
</span><span class='line'>laptop<span class="nv">$ </span>vim <span class="nb">source</span>/_posts/2013-05-18-deploy-octopress-git-on-vps.markdown
</span><span class='line'>laptop<span class="nv">$ </span>git push
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[LocalOrz 0.1 dev 发布]]></title>
    <link href="https://quartergeek.com/localorz-0-1-dev-release/"/>
    <updated>2013-05-16T00:00:00+08:00</updated>
    <id>https://quartergeek.com/localorz-0-1-dev-release</id>
    <content type="html"><![CDATA[<h2 id="简介">简介</h2>
<p><a href="https://github.com/abcdabcd987/LocalOrz">LocalOrz</a>是一个运行于Linux，类似于Cena的本地评测机。目前 LocalOrz 仍属于开发阶段，本来我也不想这么早把它放出来，但是考虑到接下来得认真准备NOI，可能没什么时间继续写，所以还是只能先放出来。好在核心的功能都是有的。</p>
<p>首先列出它现在支持的功能：</p>
<ul>
<li>支持添加编译器和修改编译器选项</li>
<li>支持数据路径自动完成</li>
<li>支持自动添加其他数据</li>
<li>支持评测全部选手</li>
<li>支持评测某个选手的单题</li>
<li>支持多个输入文件的测试点（未经测试）</li>
<li>支持需要额外文件的题目（比如交互式。未经测试）</li>
<li>支持Special Judge</li>
<li>支持部分分</li>
</ul>
<p>因为LocalOrz最初的设计目标就是代替Cena，所以Cena有的核心功能都有。当然还有很多Cena的其他功能来不及写，这个可能得等NOI忙完再说了（话说到时候我跟OI毛关系？）。我比较自豪的部分是做数据的部分，做数据很方便，鼠标点一点就能做完，像Cena一样。</p>
<!--more-->

<p>因为只是dev阶段，所以有一些十分重要但是并非核心的功能还没有写进去：</p>
<ul>
<li>不支持选手的排序</li>
<li>不支持题目/选手信息统计</li>
<li>不支持导出</li>
<li>不支持收取文件</li>
<li>不支持修改题目或测试点配置（这个如果真的需要的话，可以直接修改<code>data/dataconf.xml</code>）</li>
<li>不支持评测单个选手</li>
<li>不支持评测指定选手</li>
<li>不支持提交答案题（这个可以程序生成器+自定义校验器解决）</li>
<li>不支持检验 无输出、无输入 等各种状态</li>
</ul>
<p>另外，还有许许多多的BUG。如果遇到了BUG或者觉得有什么需要改进的地方，欢迎到<https://github.com/abcdabcd987/LocalOrz/issues>提交Issue。</p>
<h2 id="安装说明">安装说明</h2>
<p>因为处于dev阶段，所以就不打包了，麻烦各位手动安装。以Ubuntu为例：</p>
<pre><code>$ sudo apt-get update
$ sudo apt-get install -y gcc g++ fpc
$ sudo apt-get install -y git python3

$ git clone https://github.com/facebook/tornado.git
$ cd tornado
$ python3 setup.py build
$ sudo python3 setup.py install

$ cd ~
$ git clone https://github.com/abcdabcd987/LocalOrz.git
$ cd LocalOrz/core
$ gcc judge_client.c -o judge_client -O2
$ g++ normal_judge.cc -o normal_judge -O2</code></pre>
<h2 id="使用说明">使用说明</h2>
<p>目前为了方便Linux各环境使用，所以使用了WebUI。在终端运行：</p>
<pre><code>$ ~/LocalOrz/LocalOrz.py</code></pre>
<p>保持这个终端不要关闭。接下来，在浏览器中打开<http://localhost:10086>，即可见到一个简陋的WebUI。</p>
<p>在<code>/test/contest</code>可以：</p>
<ul>
<li>新建、打开竞赛</li>
<li>添加编译器</li>
<li>添加试题和数据</li>
</ul>
<p>在<code>/test/person</code>可以：</p>
<ul>
<li>查看选手成绩</li>
<li>评测选手程序</li>
</ul>
<p>具体的可以参考视频。切记，<strong>每次运行LocalOrz之后，必须Open Contest！</strong></p>
<h2 id="special-judge">Special Judge</h2>
<pre><code>argv[1]: Full score
argv[2]: Standard Answer
argv[3]: Competitor Answer

Judge Information  =&gt;  stdout
Score              =&gt;  __score.txt</code></pre>
<p>详细见<code>core/normal_judge.cc</code>。</p>
<h2 id="技术细节">技术细节</h2>
<p>内核使用<code>python3</code>写成。WebUI使用<code>python3</code>, <code>Tornado</code>, <code>jQuery</code>, <code>Bootstrap</code>。内核在源代码的<code>core/</code>目录，其余UI均可调用内核。我个人比较倾向于用python再写一个GTK3的UI，比较方便。</p>
<p>欢迎随时Create issues和Push code！</p>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ2877][Noi2012]魔幻棋盘]]></title>
    <link href="https://quartergeek.com/bzoj2877/"/>
    <updated>2013-04-14T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj2877</id>
    <content type="html"><![CDATA[<p>这题很囧，去年被炫教抓到题目（虽然炫教抓到的是一维的），可惜我们学校的人恰好都没有去省队培训……唉……首先讲一下一维怎么做吧。</p>
<p>欧几里得说过<code>gcd(a, b, c, d) = gcd(b-a, c-b, d-c, a)</code>。嗯，所以我们就对数列进行差分，<code>b[i] = a[i]-a[i-1]</code>，这样我们在查询<code>[L, R]</code>的gcd的时候，只要查询<code>gcd(a[L], gcd(b[L+1] ... b[R])</code>即可，而修改的时候，只要修改<code>a[L..R]</code>和<code>b[L], b[R+1]</code>即可。这样做法就很明显了，用两个线段树分别维护<code>a</code>和<code>b</code>。实际上做的时候，维护<code>a</code>可以直接用树状数组维护前缀和<code>sum</code>：对区间<code>[L, R]</code>加<code>c</code>，等同于<code>sum[L] += c, sum[R+1] -= c</code>，查询<code>i</code>直接求<code>sum[i]</code>即可。</p>
<p>我们再来看一下二维的怎么做。。然后我们换一种维护的方法。因为题目要求一定会查询到守护者<code>a[x, y]</code>，所以我们以<code>(x, y)</code>为原点，建立直角座标系。二维的一样是得差分，对于第四象限的点：<code>b[i, j] = a[i, j] - a[i-1, j] - a[i, j-1] + a[i-1, j-1]</code>，其他三个象限类似。</p>
<ul>
<li>原点的值：就是原点的值</li>
<li>座标轴上的值：用离原点比较远的那个点-和他相邻、离原点近的点</li>
<li>某个象限上的值：同理，用离原点远的点+离原点近的点-2个旁边的点。</li>
</ul>
<p>查询的时候，很愉悦的在线段树里面查询<code>[x1, y1]</code>到<code>[x2, y2]</code>即可。</p>
<p>但是修改就很麻烦了，四个象限、座标轴、原点分别单点修改（有关象限的4个点，有关座标轴2个点，有关原点1个点）。</p>
<!--more-->

<p>题外话：其实这题的主要思想就是把区间乃至矩阵修改转化成单点修改，因为二维线段树无法实现区间修改。做这题的时候一直忽略守护者一定会被计算，变成随意查询和修改，程序打完才发现根本无法保证修改的时间复杂度。后来十分努力的研读了一下题解才发现必须得用到守护者这个条件，似乎没有这个条件的话就做不了了。</p>
<p>果然还是很弱，数据结构都虐不过。</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
<span class='line-number'>137</span>
<span class='line-number'>138</span>
<span class='line-number'>139</span>
<span class='line-number'>140</span>
<span class='line-number'>141</span>
<span class='line-number'>142</span>
<span class='line-number'>143</span>
<span class='line-number'>144</span>
<span class='line-number'>145</span>
<span class='line-number'>146</span>
<span class='line-number'>147</span>
<span class='line-number'>148</span>
<span class='line-number'>149</span>
<span class='line-number'>150</span>
<span class='line-number'>151</span>
<span class='line-number'>152</span>
<span class='line-number'>153</span>
<span class='line-number'>154</span>
<span class='line-number'>155</span>
<span class='line-number'>156</span>
<span class='line-number'>157</span>
<span class='line-number'>158</span>
<span class='line-number'>159</span>
<span class='line-number'>160</span>
<span class='line-number'>161</span>
<span class='line-number'>162</span>
<span class='line-number'>163</span>
<span class='line-number'>164</span>
<span class='line-number'>165</span>
<span class='line-number'>166</span>
<span class='line-number'>167</span>
<span class='line-number'>168</span>
<span class='line-number'>169</span>
<span class='line-number'>170</span>
<span class='line-number'>171</span>
<span class='line-number'>172</span>
<span class='line-number'>173</span>
<span class='line-number'>174</span>
<span class='line-number'>175</span>
<span class='line-number'>176</span>
<span class='line-number'>177</span>
<span class='line-number'>178</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//------Common things &amp; Memory pool</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">gcd</span><span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">a</span><span class="p">,</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">b</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="n">a</span> <span class="o">=</span> <span class="o">-</span><span class="n">a</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">b</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="n">b</span> <span class="o">=</span> <span class="o">-</span><span class="n">b</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">long</span> <span class="kt">long</span> <span class="n">r</span><span class="p">;</span> <span class="n">b</span><span class="p">;</span> <span class="n">a</span> <span class="o">=</span> <span class="n">b</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">r</span><span class="p">)</span> <span class="n">r</span> <span class="o">=</span> <span class="n">a</span><span class="o">%</span><span class="n">b</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">a</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">500002</span><span class="p">;</span>
</span><span class='line'><span class="kt">char</span> <span class="n">_memory</span><span class="p">[</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="mi">26</span><span class="p">],</span> <span class="o">*</span><span class="n">_memory_top</span> <span class="o">=</span> <span class="n">_memory</span><span class="p">;</span>
</span><span class='line'><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span> <span class="kr">inline</span> <span class="n">T</span><span class="o">*</span> <span class="n">newmemory</span><span class="p">(</span><span class="k">const</span> <span class="n">size_t</span> <span class="n">length</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">_memory_top</span> <span class="o">+=</span> <span class="n">length</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">T</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="n">T</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">_memory_top</span> <span class="o">-</span> <span class="n">length</span> <span class="o">*</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">T</span><span class="p">));</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//------1D Segment Class</span>
</span><span class='line'><span class="k">class</span> <span class="nc">SegmentTree</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">st</span><span class="p">,</span> <span class="n">ed</span><span class="p">,</span> <span class="n">mul</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="o">*</span><span class="n">s</span><span class="p">,</span> <span class="n">x</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">build</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">,</span> <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="o">*</span><span class="n">a</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">==</span> <span class="n">rig</span><span class="p">)</span> <span class="p">{</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">lef</span><span class="p">];</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="n">build</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
</span><span class='line'>    <span class="n">build</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span>
</span><span class='line'>    <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">gcd</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">st</span> <span class="o">&lt;=</span> <span class="n">lef</span> <span class="o">&amp;&amp;</span> <span class="n">rig</span> <span class="o">&lt;=</span> <span class="n">ed</span><span class="p">)</span> <span class="k">return</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">];</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">long</span> <span class="kt">long</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">st</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">query</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">mid</span><span class="o">+</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">ed</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">gcd</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">query</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">));</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">modify</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">==</span> <span class="n">rig</span><span class="p">)</span> <span class="p">{</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">]</span><span class="o">*</span><span class="n">mul</span><span class="o">+</span><span class="n">x</span><span class="p">;</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">st</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span> <span class="n">modify</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>    <span class="k">else</span> <span class="n">modify</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>    <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">gcd</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="k">public</span><span class="o">:</span>
</span><span class='line'>  <span class="n">SegmentTree</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">length</span><span class="p">,</span> <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span><span class="o">*</span> <span class="n">a</span><span class="p">)</span><span class="o">:</span> <span class="n">n</span><span class="p">(</span><span class="n">length</span><span class="p">),</span> <span class="n">s</span><span class="p">(</span><span class="n">newmemory</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span><span class="p">((</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="mi">4</span><span class="p">))</span> <span class="p">{</span> <span class="n">build</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">a</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">Query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span> <span class="p">{</span> <span class="n">st</span> <span class="o">=</span> <span class="n">lef</span><span class="p">,</span> <span class="n">ed</span> <span class="o">=</span> <span class="n">rig</span><span class="p">;</span> <span class="k">return</span> <span class="n">query</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">Modify</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">value</span><span class="p">)</span> <span class="p">{</span> <span class="n">st</span> <span class="o">=</span> <span class="n">pos</span><span class="p">,</span> <span class="n">x</span> <span class="o">=</span> <span class="n">value</span><span class="p">,</span> <span class="n">mul</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">modify</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">Add</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">value</span><span class="p">)</span> <span class="p">{</span> <span class="n">st</span> <span class="o">=</span> <span class="n">pos</span><span class="p">,</span> <span class="n">x</span> <span class="o">=</span> <span class="n">value</span><span class="p">,</span> <span class="n">mul</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">modify</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//------2D Matrix &amp; Segment Class</span>
</span><span class='line'><span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span><span class="o">**</span> <span class="n">Matrix</span><span class="p">;</span>
</span><span class='line'><span class="k">class</span> <span class="nc">SegmentTree2D</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">stx</span><span class="p">,</span> <span class="n">sty</span><span class="p">,</span> <span class="n">edx</span><span class="p">,</span> <span class="n">edy</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">x</span><span class="p">;</span>
</span><span class='line'>  <span class="n">SegmentTree</span><span class="o">*</span> <span class="n">s</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">build</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">,</span> <span class="k">const</span> <span class="n">Matrix</span><span class="o">&amp;</span> <span class="n">mat</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">==</span> <span class="n">rig</span><span class="p">)</span> <span class="p">{</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">SegmentTree</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">mat</span><span class="p">[</span><span class="n">lef</span><span class="p">]);</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="n">build</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">mat</span><span class="p">);</span>
</span><span class='line'>    <span class="n">build</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">,</span> <span class="n">mat</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">long</span> <span class="kt">long</span> <span class="o">*</span><span class="n">tmp</span> <span class="o">=</span> <span class="n">newmemory</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span><span class="p">(</span><span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">tmp</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">gcd</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">].</span><span class="n">Query</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">i</span><span class="p">),</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">Query</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">i</span><span class="p">));</span>
</span><span class='line'>    <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">SegmentTree</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">tmp</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">stx</span> <span class="o">&lt;=</span> <span class="n">lef</span> <span class="o">&amp;&amp;</span> <span class="n">rig</span> <span class="o">&lt;=</span> <span class="n">edx</span><span class="p">)</span> <span class="k">return</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">Query</span><span class="p">(</span><span class="n">sty</span><span class="p">,</span> <span class="n">edy</span><span class="p">);</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="kt">long</span> <span class="kt">long</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">stx</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">query</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">mid</span><span class="o">+</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">edx</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">gcd</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">query</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">));</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">modify</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">==</span> <span class="n">rig</span><span class="p">)</span> <span class="p">{</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">Add</span><span class="p">(</span><span class="n">sty</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">stx</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span> <span class="n">modify</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>    <span class="k">else</span> <span class="n">modify</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>    <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">Modify</span><span class="p">(</span><span class="n">sty</span><span class="p">,</span> <span class="n">gcd</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">].</span><span class="n">Query</span><span class="p">(</span><span class="n">sty</span><span class="p">,</span> <span class="n">sty</span><span class="p">),</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">Query</span><span class="p">(</span><span class="n">sty</span><span class="p">,</span> <span class="n">sty</span><span class="p">)));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="k">public</span><span class="o">:</span>
</span><span class='line'>  <span class="n">SegmentTree2D</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">b</span><span class="p">,</span> <span class="k">const</span> <span class="n">Matrix</span><span class="o">&amp;</span> <span class="n">mat</span><span class="p">)</span><span class="o">:</span> <span class="n">n</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">m</span><span class="p">(</span><span class="n">b</span><span class="p">),</span> <span class="n">s</span><span class="p">(</span><span class="n">newmemory</span><span class="o">&lt;</span><span class="n">SegmentTree</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">4</span><span class="o">*</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">)))</span> <span class="p">{</span> <span class="n">build</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">mat</span><span class="p">);</span> <span class="p">}</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">Query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">x1</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y1</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">x2</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">y2</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">stx</span> <span class="o">=</span> <span class="n">x1</span><span class="p">,</span> <span class="n">sty</span> <span class="o">=</span> <span class="n">y1</span><span class="p">,</span> <span class="n">edx</span> <span class="o">=</span> <span class="n">x2</span><span class="p">,</span> <span class="n">edy</span> <span class="o">=</span> <span class="n">y2</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">query</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="kt">void</span> <span class="n">Modify</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">j</span><span class="p">,</span> <span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">value</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="n">n</span> <span class="o">||</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="n">m</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span><span class='line'>    <span class="n">stx</span> <span class="o">=</span> <span class="n">edx</span> <span class="o">=</span> <span class="n">i</span><span class="p">,</span> <span class="n">sty</span> <span class="o">=</span> <span class="n">edy</span> <span class="o">=</span> <span class="n">j</span><span class="p">,</span> <span class="n">x</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
</span><span class='line'>    <span class="n">modify</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//------Main program &amp; functions</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">;</span>
</span><span class='line'><span class="kt">long</span> <span class="kt">long</span> <span class="n">c</span><span class="p">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">freopen</span><span class="p">(</span><span class="s">&quot;bzoj2877.in&quot;</span><span class="p">,</span> <span class="s">&quot;r&quot;</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span>
</span><span class='line'>  <span class="n">freopen</span><span class="p">(</span><span class="s">&quot;bzoj2877.out&quot;</span><span class="p">,</span> <span class="s">&quot;w&quot;</span><span class="p">,</span> <span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d%d%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">x</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">y</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">);</span>
</span><span class='line'>  <span class="n">Matrix</span> <span class="n">mat</span> <span class="o">=</span> <span class="n">newmemory</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">newmemory</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span><span class="p">(</span><span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%I64d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">x</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">y</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">];</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">m</span><span class="p">;</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="n">y</span><span class="p">;</span> <span class="o">--</span><span class="n">j</span><span class="p">)</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">];</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="n">x</span><span class="p">;</span> <span class="o">--</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">y</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">];</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">m</span><span class="p">;</span> <span class="n">j</span> <span class="o">&gt;</span> <span class="n">y</span><span class="p">;</span> <span class="o">--</span><span class="n">j</span><span class="p">)</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">];</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">y</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">mat</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">-=</span> <span class="n">mat</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">m</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="n">y</span><span class="p">;</span> <span class="o">--</span><span class="n">i</span><span class="p">)</span> <span class="n">mat</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">-=</span> <span class="n">mat</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">x</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">-=</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">y</span><span class="p">];</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="n">x</span><span class="p">;</span> <span class="o">--</span><span class="n">i</span><span class="p">)</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">y</span><span class="p">]</span> <span class="o">-=</span> <span class="n">mat</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">y</span><span class="p">];</span>
</span><span class='line'>  <span class="n">SegmentTree2D</span> <span class="n">seg</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">mat</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">op</span><span class="p">,</span> <span class="n">x1</span><span class="p">,</span> <span class="n">y1</span><span class="p">,</span> <span class="n">x2</span><span class="p">,</span> <span class="n">y2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d%d%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">op</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">x1</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">y1</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">x2</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">y2</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">op</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>      <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%I64d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">seg</span><span class="p">.</span><span class="n">Query</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="n">x1</span><span class="p">,</span> <span class="n">y</span><span class="o">-</span><span class="n">y1</span><span class="p">,</span> <span class="n">x</span><span class="o">+</span><span class="n">x2</span><span class="p">,</span> <span class="n">y</span><span class="o">+</span><span class="n">y2</span><span class="p">));</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%I64d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&lt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y1</span><span class="o">&lt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">y1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>  <span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&gt;</span> <span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y1</span><span class="o">&gt;</span> <span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span>  <span class="p">,</span> <span class="n">y1</span>  <span class="p">,</span>  <span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&lt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y1</span><span class="o">&gt;</span> <span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">y1</span>  <span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&gt;</span> <span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y1</span><span class="o">&lt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span>  <span class="p">,</span> <span class="n">y1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x2</span><span class="o">&lt;</span> <span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&lt;</span> <span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span>  <span class="p">,</span> <span class="n">y2</span>  <span class="p">,</span>  <span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x2</span><span class="o">&gt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&gt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">y2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span>  <span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x2</span><span class="o">&lt;</span> <span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&gt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span>  <span class="p">,</span> <span class="n">y2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x2</span><span class="o">&gt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&lt;</span> <span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">y2</span>  <span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&lt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&gt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">y2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span>  <span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&gt;</span> <span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&lt;</span> <span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span>  <span class="p">,</span> <span class="n">y2</span>  <span class="p">,</span>  <span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&lt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&lt;</span> <span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">y2</span>  <span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&gt;</span> <span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&gt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span>  <span class="p">,</span> <span class="n">y2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x2</span><span class="o">&lt;</span> <span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y1</span><span class="o">&gt;</span> <span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span>  <span class="p">,</span> <span class="n">y1</span>  <span class="p">,</span>  <span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x2</span><span class="o">&gt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y1</span><span class="o">&lt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">y1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span>  <span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x2</span><span class="o">&lt;</span> <span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y1</span><span class="o">&lt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span>  <span class="p">,</span> <span class="n">y1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span> <span class="k">else</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x2</span><span class="o">&gt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y1</span><span class="o">&gt;</span> <span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">y1</span>  <span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&lt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">x2</span><span class="o">&gt;=</span><span class="n">x</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">y1</span><span class="o">&lt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span> <span class="k">else</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y1</span>  <span class="p">,</span>  <span class="n">c</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">y2</span><span class="o">&gt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span> <span class="k">else</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y2</span>  <span class="p">,</span>  <span class="n">c</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">y1</span><span class="o">&lt;=</span><span class="n">y</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&gt;=</span><span class="n">y</span><span class="p">)</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&lt;=</span><span class="n">x</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span> <span class="k">else</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x1</span>  <span class="p">,</span> <span class="n">y</span><span class="p">,</span>  <span class="n">c</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="n">x2</span><span class="o">&gt;=</span><span class="n">x</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="o">-</span><span class="n">c</span><span class="p">);</span> <span class="k">else</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x2</span>  <span class="p">,</span> <span class="n">y</span><span class="p">,</span>  <span class="n">c</span><span class="p">);</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">x1</span><span class="o">&lt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">x2</span><span class="o">&gt;=</span><span class="n">x</span> <span class="o">&amp;&amp;</span> <span class="n">y1</span><span class="o">&lt;=</span><span class="n">y</span> <span class="o">&amp;&amp;</span> <span class="n">y2</span><span class="o">&gt;=</span><span class="n">y</span><span class="p">)</span> <span class="n">seg</span><span class="p">.</span><span class="n">Modify</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">c</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[BZOJ2876][Noi2012]骑行川藏]]></title>
    <link href="https://quartergeek.com/bzoj2876/"/>
    <updated>2013-04-14T00:00:00+08:00</updated>
    <id>https://quartergeek.com/bzoj2876</id>
    <content type="html"><![CDATA[<p>这题如果会拉格朗日乘数法的话，那就是裸题了。首先大概讲一下这题的意思。给定<code>s[], k[], v'[], E</code>，求一组<code>v[]</code>，满足<code>E = sum{ k[i]*s[i]*(v[i]-v'[i])^2 }</code>，并且使得<code>t = sum{ s[i]/v[i] }</code>最小。</p>
<p>很明显这个就是一个多元函数求最值的问题，拉格朗日乘数法就是解决这种问题的方法。</p>
<p>拉格朗日乘数法的核心是：对于多元函数<code>f</code>和约束方程<code>g = 0</code>，存在一个负数<code>λ</code>，使得<code>∇f = λ ∇g</code>，其中<code>∇f</code>为<code>f</code>的梯度向量，也就是对每个元取偏导构成的向量。所谓偏导，就是把某一个元看作是变量，其他的当作常量，求导数。然后，通过方程组<code>∇f = λ ∇g</code>以及<code>g = 0</code>就可以解出取最值的时候，所有变量的值了。</p>
<p>对于这题，可以得到：</p>
<pre><code>-s1 / v1^2 = λ * 2 * k1 * s1 * (v1 - v&#39;1)
-s2 / v2^2 = λ * 2 * k2 * s2 * (v2 - v&#39;2)
...

sum{ ki * si * (vi - v&#39;i) ^ 2 } = E</code></pre>
<p>然后解这个方程组就可以解出<code>vi</code>和<code>λ</code>。但是解出来之后能干嘛呢？</p>
<!--more-->

<p>我们观察到，如果<code>λ</code>变大（注意，<code>λ</code>是负数，也就是绝对值变小），那么<code>vi</code>就会变大，接下来就会导致所需要的能量变大。也就是说，我们可以二分<code>λ</code>，然后解出<code>vi</code>，计算<code>sum{ ki * si * (vi - v'i) ^ 2 }</code>直到等于<code>E</code>。</p>
<p>解<code>vi</code>的话，可以用二分也可以用牛顿法。</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cmath&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="kr">inline</span> <span class="kt">double</span> <span class="n">sqr</span><span class="p">(</span><span class="k">const</span> <span class="kt">double</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">double</span> <span class="n">cube</span><span class="p">(</span><span class="k">const</span> <span class="kt">double</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="o">*</span><span class="n">x</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="k">struct</span> <span class="n">quad</span>
</span><span class='line'><span class="p">{</span> <span class="c1">//Ax^3 + Bx^2 + Cx + D</span>
</span><span class='line'>  <span class="kt">double</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">D</span><span class="p">;</span>
</span><span class='line'>  <span class="n">quad</span><span class="p">(</span><span class="k">const</span> <span class="kt">double</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">double</span> <span class="n">b</span><span class="p">,</span> <span class="k">const</span> <span class="kt">double</span> <span class="n">c</span><span class="p">,</span> <span class="k">const</span> <span class="kt">double</span> <span class="n">d</span><span class="p">)</span><span class="o">:</span> <span class="n">A</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">B</span><span class="p">(</span><span class="n">b</span><span class="p">),</span> <span class="n">C</span><span class="p">(</span><span class="n">c</span><span class="p">),</span> <span class="n">D</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'>  <span class="kt">double</span> <span class="k">operator</span><span class="p">()(</span><span class="k">const</span> <span class="kt">double</span> <span class="n">x</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="n">A</span><span class="o">*</span><span class="n">cube</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">+</span><span class="n">B</span><span class="o">*</span><span class="n">sqr</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">+</span><span class="n">C</span><span class="o">*</span><span class="n">x</span><span class="o">+</span><span class="n">D</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">;</span>
</span><span class='line'><span class="kt">double</span> <span class="n">E</span><span class="p">,</span> <span class="n">lef</span> <span class="o">=</span> <span class="o">-</span><span class="mf">1e3</span><span class="p">,</span> <span class="n">rig</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="mi">10000</span><span class="p">],</span> <span class="n">k</span><span class="p">[</span><span class="mi">10000</span><span class="p">],</span> <span class="n">x</span><span class="p">[</span><span class="mi">10000</span><span class="p">],</span> <span class="n">v</span><span class="p">[</span><span class="mi">10000</span><span class="p">],</span> <span class="n">maxv</span><span class="p">[</span><span class="mi">10000</span><span class="p">];</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">double</span> <span class="n">solve</span><span class="p">(</span><span class="k">const</span> <span class="n">quad</span><span class="o">&amp;</span> <span class="n">f</span><span class="p">,</span> <span class="kt">double</span> <span class="n">x</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">const</span> <span class="n">quad</span> <span class="n">d</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">3</span><span class="o">*</span><span class="n">f</span><span class="p">.</span><span class="n">A</span><span class="p">,</span> <span class="mi">2</span><span class="o">*</span><span class="n">f</span><span class="p">.</span><span class="n">B</span><span class="p">,</span> <span class="n">f</span><span class="p">.</span><span class="n">C</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">double</span> <span class="n">x0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">do</span> <span class="n">x0</span> <span class="o">=</span> <span class="n">x</span><span class="p">,</span> <span class="n">x</span> <span class="o">-=</span> <span class="n">f</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">/</span><span class="n">d</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">fabs</span><span class="p">(</span><span class="n">x</span><span class="o">-</span><span class="n">x0</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mf">1e-12</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">x</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">double</span> <span class="n">check</span><span class="p">(</span><span class="k">const</span> <span class="kt">double</span> <span class="n">lambda</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">double</span> <span class="n">sum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">solve</span><span class="p">(</span><span class="n">quad</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">lambda</span><span class="o">*</span><span class="n">k</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">lambda</span><span class="o">*</span><span class="n">k</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="mf">.0</span><span class="p">)</span><span class="o">+</span><span class="n">maxv</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="o">/</span><span class="mi">2</span><span class="p">);</span>
</span><span class='line'>    <span class="n">sum</span> <span class="o">+=</span> <span class="n">k</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">sqr</span><span class="p">(</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">sum</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%lf&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">E</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%lf%lf%lf&quot;</span><span class="p">,</span> <span class="n">s</span><span class="o">+</span><span class="n">i</span><span class="p">,</span> <span class="n">k</span><span class="o">+</span><span class="n">i</span><span class="p">,</span> <span class="n">v</span><span class="o">+</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>    <span class="n">maxv</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mf">1e-12</span> <span class="o">?</span> <span class="n">std</span><span class="o">::</span><span class="n">sqrt</span><span class="p">(</span><span class="n">E</span><span class="o">/</span><span class="p">(</span><span class="n">k</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span><span class="o">+</span><span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">:</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="n">rig</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">min</span><span class="p">(</span><span class="n">rig</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="o">/</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">k</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="n">maxv</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">-</span><span class="n">v</span><span class="p">[</span><span class="n">i</span><span class="p">])</span><span class="o">*</span><span class="n">sqr</span><span class="p">(</span><span class="n">maxv</span><span class="p">[</span><span class="n">i</span><span class="p">])));</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">while</span> <span class="p">(</span><span class="n">rig</span><span class="o">-</span><span class="n">lef</span> <span class="o">&gt;</span> <span class="mf">1e-12</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">const</span> <span class="kt">double</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">check</span><span class="p">(</span><span class="n">mid</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="n">E</span><span class="p">)</span> <span class="n">rig</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
</span><span class='line'>    <span class="k">else</span> <span class="n">lef</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="kt">double</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">ans</span> <span class="o">+=</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">/</span><span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%.10f&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[关于gcd的8题]]></title>
    <link href="https://quartergeek.com/eight-gcd-problems/"/>
    <updated>2013-03-28T00:00:00+08:00</updated>
    <id>https://quartergeek.com/eight-gcd-problems</id>
    <content type="html"><![CDATA[<p>发现其实有关gcd的题目还是挺多的，这里根据做题顺序写出8题。</p>
<h2 id="bzoj2818-gcd-gcdxy质数-1xyn的对数">[bzoj2818: Gcd] <code>gcd(x,y)=质数, 1&lt;=x,y&lt;=n</code>的对数</h2>
<p>做这题的时候，懂得了一个非常重要的转化：求<code>(x, y) = k, 1 &lt;= x, y &lt;= n</code>的对数等于求<code>(x, y) = 1, 1 &lt;= x, y &lt;= n/k</code>的对数！所以，枚举每个质数<code>p</code>（线性筛素数的方法见：<a href="http://oi.abcdabcd987.com/sieve-prime-in-linear-time/">线性时间内筛素数和欧拉函数</a>），然后求<code>(x, y) = 1, 1 &lt;= x, y &lt;= n/p</code>的个数。</p>
<p>那<code>(x, y) = 1</code>的个数如何求呢？其实就是求互质的数的个数。在<code>[1, y]</code>和<code>y</code>互质的数有<code>phi(y)</code>个，如果我们令<code>x &lt; y</code>，那么答案就是<code>sigma(phi(y))</code>。因为<code>x, y</code>是等价的，所以答案*2，又因为<code>(1, 1)</code>只有一对，所以-1。最终答案为<code>sigma(sigma(phi(n/prime[i])) * 2 - 1)</code>。</p>
<!--more-->

<div class='bogus-wrapper'>
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">10000001</span><span class="p">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">primes</span><span class="p">;</span>
</span><span class='line'><span class="kt">long</span> <span class="kt">long</span> <span class="n">prime</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">phi</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">bool</span> <span class="n">com</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">prime</span><span class="p">[</span><span class="n">primes</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
</span><span class='line'>      <span class="n">phi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">primes</span> <span class="o">&amp;&amp;</span> <span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">])</span>
</span><span class='line'>        <span class="n">phi</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="n">phi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="p">{</span> <span class="n">phi</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="n">phi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">];</span> <span class="k">break</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">phi</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">phi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">phi</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">primes</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">ans</span> <span class="o">+=</span> <span class="n">phi</span><span class="p">[</span><span class="n">n</span><span class="o">/</span><span class="n">prime</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span><span class="o">*</span><span class="mi">2</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%lld&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>


<h2 id="bzoj2190-sdoi2008仪仗队-求gcdxy1-0xyn的对数">[bzoj2190: [SDOI2008]仪仗队] 求<code>gcd(x,y)=1, 0&lt;=x,y&lt;=n</code>的对数</h2>
<p>嗯……似乎这题在上一题的时候解决了。不过要注意的是，这题范围是从0开始的，所以，会多出<code>(1, 0)</code>和<code>(0, 1)</code>这两组，答案就是<code>sigma(phi(i)) - 1 + 2</code>。</p>
<h2 id="bzoj2005-noi2010能量采集-求sigmagcdxy-1xn-1ym">[bzoj2005: [Noi2010]能量采集] 求<code>sigma(gcd(x,y)), 1&lt;=x&lt;=n, 1&lt;=y&lt;=m</code></h2>
<p>令<code>f[d]</code>为<code>(x, y) = d</code>的对数，那么答案就是<code>sigma(f[i]*((i-1)*2+1))</code></p>
<p><code>f[i]</code>怎么求呢？在<code>1 &lt;= x &lt;= n, 1 &lt;= y &lt;= m</code>中，<code>gcd(x, y) | d</code>的有<code>[n/d] * [m/d]</code>个。不过我们要扣掉所有的倍数，<code>f[i] = [n/d] * [m/d] - f[2i] - f[3i] - f[4i] - ...</code>。逆序做即可。</p>
<p>后来我在想：</p>
<ul>
<li>为什么上面几题不用这题的方法呢？嗯，因为<code>x, y</code>的取值不一样，这样的话就不得不把莫比乌斯反演搬出来了。</li>
<li>为什么这题不用上面几题的方法呢？嗯，因为这个的复杂度是<code>O(nlogn)</code>（<code>O(n/1 + n/2 + ... + n/n) = O(nlogn)</code>），而上面的复杂度只有<code>O(n + n/logn)</code>（质数个数是<code>n/logn</code>级别的）。</li>
</ul>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">100001</span><span class="p">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">;</span>
</span><span class='line'><span class="kt">long</span> <span class="kt">long</span> <span class="n">f</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&gt;</span> <span class="n">m</span><span class="p">)</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">;</span> <span class="o">--</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">m</span><span class="o">/</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="n">i</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span> <span class="o">+=</span> <span class="n">i</span><span class="p">)</span>
</span><span class='line'>      <span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-=</span> <span class="n">f</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>
</span><span class='line'>    <span class="n">ans</span> <span class="o">+=</span> <span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">*</span><span class="p">(</span><span class="mi">2</span><span class="o">*</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%lld&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<h2 id="spoj-vlattice-gcdijk1-0ijkn-的个数">[SPOJ VLATTICE] <code>gcd(i,j,k)=1, 0&lt;=i,j,k&lt;=n</code> 的个数</h2>
<p>莫比乌斯反演（<a href="http://en.wikipedia.org/wiki/M%C3%B6bius_inversion_formula">Möbius inversion formula</a>）终于出现了！莫比乌斯反演的基本形式就是：</p>
<pre><code>g(n) = sigma(d|n, f(d))
f(n) = sigma(d|n, μ(n/d) * g(d))</code></pre>
<p>还有另外一个形式是：</p>
<pre><code>g(n) = sigma(d|n, f(d))
f(n) = sigma(n|d, μ(n) * g(n/d))</code></pre>
<p>通俗的来说，<code>g(n)</code>和<code>f(n)</code>的关系，就是<strong>包含</strong>和<strong>仅包含</strong>的关系。</p>
<p>令<code>g(x)</code>为满足<code>x | (i, j, k)</code>的个数，<code>f(x)</code>为满足<code>(i, j, k) = x</code>的个数。显然<code>g(n) = sigma(d|n, f(d)) = [n/x] * [n/x] * [n/x]</code>，所以答案<code>f(1)</code>就可以用下面那个公式算出来了，也就是<code>sigma(μ(d) * [n/d] * [n/d] * [n/d])</code>。</p>
<p>不过需要注意的是，这题的范围可以取0，所以我们还需要加上某一维为0的，某两维为0的方案（基本一样啦）。</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">1000000</span><span class="p">;</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">sqr</span><span class="p">(</span><span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">x</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">cube</span><span class="p">(</span><span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">x</span> <span class="o">*</span> <span class="n">x</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">Testcase</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">primes</span><span class="p">,</span> <span class="n">prime</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">mu</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">GetPrimes</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">bool</span> <span class="n">com</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>  <span class="n">mu</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span><span class='line'>      <span class="p">{</span> <span class="n">prime</span><span class="p">[</span><span class="n">primes</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">primes</span> <span class="o">&amp;&amp;</span> <span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">])</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="o">-</span><span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>      <span class="k">else</span> <span class="p">{</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">GetPrimes</span><span class="p">();</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">Testcase</span><span class="p">);</span> <span class="n">Testcase</span><span class="o">--</span><span class="p">;</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">long</span> <span class="kt">long</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">ans</span> <span class="o">+=</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">cube</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">ans</span> <span class="o">+=</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">sqr</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="mi">3</span><span class="p">;</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%lld</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<h2 id="bzoj1101-poi2007zap-求有多少对数满足-gcdxyd-1xa-1yb">[bzoj1101: [POI2007]Zap] 求有多少对数满足 <code>gcd(x,y)=d, 1&lt;=x&lt;=a, 1&lt;=y&lt;=b</code></h2>
<p>首先肯定想到转化成求<code>gcd(x, y) = 1, 1 &lt;= x &lt;= a/d, 1 &lt;= y &lt;= b/d</code>的对数，和上面一题一样。虽然上面那题复杂度很优，只有<code>O(n)</code>，但是对于这边的多组数据完全就无法承受了。</p>
<p>其实，只有<code>O(sqrt(n))</code>个不同的<code>n/i</code>的取值，因此我们可以求<code>mu[i]</code>的前缀和然后分块做！分块可以参考<a href="http://oi.abcdabcd987.com/bzoj1257/">[CQOI2007]余数之和sum bzoj1257</a>。</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">50000</span><span class="p">;</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">sqr</span><span class="p">(</span><span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">x</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">Testcase</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">primes</span><span class="p">,</span> <span class="n">prime</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">mu</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">sum</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">GetPrimes</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">bool</span> <span class="n">com</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>  <span class="n">mu</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span><span class='line'>      <span class="p">{</span> <span class="n">prime</span><span class="p">[</span><span class="n">primes</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">primes</span> <span class="o">&amp;&amp;</span> <span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">])</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="o">-</span><span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>      <span class="k">else</span> <span class="p">{</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">GetPrimes</span><span class="p">();</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">Testcase</span><span class="p">);</span> <span class="n">Testcase</span><span class="o">--</span><span class="p">;</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">d</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&gt;</span> <span class="n">m</span><span class="p">)</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">long</span> <span class="kt">long</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="n">n</span> <span class="o">/=</span> <span class="n">d</span><span class="p">,</span> <span class="n">m</span> <span class="o">/=</span> <span class="n">d</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">last</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span> <span class="o">=</span> <span class="n">last</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">last</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">min</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="n">i</span><span class="p">),</span> <span class="n">m</span><span class="o">/</span><span class="p">(</span><span class="n">m</span><span class="o">/</span><span class="n">i</span><span class="p">));</span>
</span><span class='line'>      <span class="n">ans</span> <span class="o">+=</span> <span class="p">(</span><span class="n">sum</span><span class="p">[</span><span class="n">last</span><span class="p">]</span><span class="o">-</span><span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">m</span><span class="o">/</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%lld</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<h2 id="bzoj2301-haoi2011problem-b-求有多少对数满足-gcdxyk-axb-cyd">[bzoj2301: [HAOI2011]Problem b] 求有多少对数满足 <code>gcd(x,y)=k, a&lt;=x&lt;=b, c&lt;=y&lt;=d</code></h2>
<p>和上面那题几乎一样，只是多了<code>x, y</code>的下界。其实这个可以在算方案的时候yy一下，但是总觉得可能会哪里边界算错，于是就是用了一种偷懒的方法：容斥原理。事实上，这种方法并不会比只算一次的方法来的慢多少。</p>
<p>记<code>f[a, b]</code>为满足<code>(x, y) = 1, 1 &lt;= x &lt;= a, 1 &lt;= y &lt;= b</code>的对数，那么答案就是<code>f[B/K, D/K] - f[(A-1)/K, D/K] - f[B/K, (C-1)/K] + f[(A-1)/K, (C-1)/K]</code></p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">50000</span><span class="p">;</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">sqr</span><span class="p">(</span><span class="k">const</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span> <span class="o">*</span> <span class="n">x</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">Testcase</span><span class="p">,</span> <span class="n">A</span><span class="p">,</span> <span class="n">B</span><span class="p">,</span> <span class="n">C</span><span class="p">,</span> <span class="n">D</span><span class="p">,</span> <span class="n">K</span><span class="p">,</span> <span class="n">primes</span><span class="p">,</span> <span class="n">prime</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">mu</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">sum</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">GetPrimes</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">bool</span> <span class="n">com</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>  <span class="n">mu</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span><span class='line'>      <span class="p">{</span> <span class="n">prime</span><span class="p">[</span><span class="n">primes</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">primes</span> <span class="o">&amp;&amp;</span> <span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">])</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="o">-</span><span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>      <span class="k">else</span> <span class="p">{</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">long</span> <span class="kt">long</span> <span class="n">Process</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="kt">int</span> <span class="n">m</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">long</span> <span class="kt">long</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&gt;</span> <span class="n">m</span><span class="p">)</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">last</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span> <span class="o">=</span> <span class="n">last</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">last</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">min</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="n">i</span><span class="p">),</span> <span class="n">m</span><span class="o">/</span><span class="p">(</span><span class="n">m</span><span class="o">/</span><span class="n">i</span><span class="p">));</span>
</span><span class='line'>    <span class="n">res</span> <span class="o">+=</span> <span class="p">(</span><span class="n">sum</span><span class="p">[</span><span class="n">last</span><span class="p">]</span><span class="o">-</span><span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">*</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">m</span><span class="o">/</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">GetPrimes</span><span class="p">();</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">Testcase</span><span class="p">);</span> <span class="n">Testcase</span><span class="o">--</span><span class="p">;</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d%d%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">A</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">B</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">C</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">D</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">K</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">long</span> <span class="kt">long</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">Process</span><span class="p">(</span><span class="n">B</span><span class="o">/</span><span class="n">K</span><span class="p">,</span> <span class="n">D</span><span class="o">/</span><span class="n">K</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ans</span> <span class="o">-=</span> <span class="n">Process</span><span class="p">((</span><span class="n">A</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">K</span><span class="p">,</span> <span class="n">D</span><span class="o">/</span><span class="n">K</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ans</span> <span class="o">-=</span> <span class="n">Process</span><span class="p">(</span><span class="n">B</span><span class="o">/</span><span class="n">K</span><span class="p">,</span> <span class="p">(</span><span class="n">C</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">K</span><span class="p">);</span>
</span><span class='line'>    <span class="n">ans</span> <span class="o">+=</span> <span class="n">Process</span><span class="p">((</span><span class="n">A</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">K</span><span class="p">,</span> <span class="p">(</span><span class="n">C</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">K</span><span class="p">);</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%lld</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<h2 id="bzoj2820-yy的gcd-求1xn-1ym且gcdxy为质数有多少对">[bzoj2820: YY的GCD] 求<code>1&lt;=x&lt;=N</code>, <code>1&lt;=y&lt;=M</code>且<code>gcd(x,y)</code>为质数有多少对</h2>
<p>如果枚举质数的话就要给这个多组数据跪成傻逼了。</p>
<pre><code>ans = sigma(p, sigma(d, μ(d) * (n/pd) * (m/pd)))

Let s = pd, then

ans = sigma(s, sigma(p, μ(s/p) * (n/s) * (m/s)))
    = sigma(s, (n/s) * (m/s) * sigma(p, μ(s/p)))

Let g(x) = sigma(p, μ(x/p)), then

ans = sigma(s, (n/s) * (m/s) * g(s))</code></pre>
<p>如果我们能预处理<code>g(x)</code>的话就能和前面一样分块搞了。这个时候我们多么希望<code>g(x)</code>和<code>μ(x)</code>一样是积性函数。看完题解后，发现有一个不是积性函数，胜似积性函数的性质。由于题解没有给证明，所以就意淫了一个证明。</p>
<p>考虑质数<code>p'</code>，<code>g(p'x) = sigma(p | p'x, μ(p'x/p))</code>。</p>
<ul>
<li>当<code>x % p' == 0</code>，那么考虑sigma中的变量<code>p</code>的所有取值，它和<code>g(x)</code>中<code>p</code>是相同的。而<code>μ(x)</code>这个函数，如果<code>x</code>有平方因子的话就等于0，因此当<code>p != p'</code>时<code>μ(p'x/p) = 0</code>，当<code>p == p'</code>是，<code>μ(p'x/p) = μ(x)</code>。所以<code>g(p'x) = μ(x)</code>。</li>
<li>当<code>x % p' != 0</code>，同样考虑<code>p</code>，会发现它的取值只比<code>g(x)</code>中的<code>p</code>多出一个<code>p'</code>。同理按照<code>p</code>是否等于<code>p'</code>讨论，可以得到<code>g(p'x) = -g(x) + μ(x)</code>。</li>
</ul>
<p>因此<code>g(x)</code>可以在线性筛素数的时候算出。剩下的就是前缀和、分块了。</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">10000000</span><span class="p">;</span>
</span><span class='line'><span class="kt">int</span> <span class="n">Testcase</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">primes</span><span class="p">,</span> <span class="n">prime</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">mu</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">g</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">],</span> <span class="n">sum</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'><span class="kt">void</span> <span class="n">GetPrimes</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">static</span> <span class="kt">bool</span> <span class="n">com</span><span class="p">[</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">];</span>
</span><span class='line'>  <span class="n">mu</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</span><span class='line'>      <span class="n">prime</span><span class="p">[</span><span class="n">primes</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">,</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">primes</span> <span class="o">&amp;&amp;</span> <span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">com</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'>      <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">%</span> <span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">])</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="o">-</span><span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="o">-</span><span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'>      <span class="k">else</span> <span class="p">{</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">prime</span><span class="p">[</span><span class="n">j</span><span class="p">]]</span> <span class="o">=</span> <span class="n">mu</span><span class="p">[</span><span class="n">i</span><span class="p">];</span> <span class="k">break</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">MAXN</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">g</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">GetPrimes</span><span class="p">();</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">Testcase</span><span class="p">);</span> <span class="n">Testcase</span><span class="o">--</span><span class="p">;</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">&gt;</span> <span class="n">m</span><span class="p">)</span> <span class="n">std</span><span class="o">::</span><span class="n">swap</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">);</span>
</span><span class='line'>    <span class="kt">long</span> <span class="kt">long</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">last</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span> <span class="o">=</span> <span class="n">last</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="n">last</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">min</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="n">i</span><span class="p">),</span> <span class="n">m</span><span class="o">/</span><span class="p">(</span><span class="n">m</span><span class="o">/</span><span class="n">i</span><span class="p">));</span>
</span><span class='line'>      <span class="n">ans</span> <span class="o">+=</span> <span class="p">(</span><span class="n">n</span><span class="o">/</span><span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="k">static_cast</span><span class="o">&lt;</span><span class="kt">long</span> <span class="kt">long</span><span class="o">&gt;</span><span class="p">(</span><span class="n">m</span><span class="o">/</span><span class="n">i</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">sum</span><span class="p">[</span><span class="n">last</span><span class="p">]</span><span class="o">-</span><span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%lld</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>
<h2 id="bzoj2705-sdoi2012longge的问题-求-sigmagcdin-1in232">[bzoj2705: [SDOI2012]Longge的问题] 求 <code>sigma(gcd(i,n), 1&lt;=i&lt;=n&lt;2^32)</code></h2>
<p>又是令<code>gcd(i, n) = d</code>，答案就是<code>sigma(phi(n/d))</code>，但是我们不能预处理出<code>phi[]</code>数组，因为开不了数组……</p>
<p>注意到因数个数是<code>O(2sqrt(n))</code>级别的，我们枚举所有的<code>n/d</code>，一边dfs一边算phi。</p>
<div class="bogus-wrapper">
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cmath&gt;</span>
</span><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">cnt</span><span class="p">,</span> <span class="n">p</span><span class="p">[</span><span class="mi">30</span><span class="p">],</span> <span class="n">c</span><span class="p">[</span><span class="mi">30</span><span class="p">];</span>
</span><span class='line'><span class="kt">long</span> <span class="kt">long</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="kt">void</span> <span class="n">dfs</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">step</span><span class="p">,</span> <span class="kt">int</span> <span class="n">pdt</span><span class="p">,</span> <span class="kt">int</span> <span class="n">phi</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">step</span> <span class="o">==</span> <span class="n">cnt</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">ans</span> <span class="o">+=</span> <span class="n">phi</span><span class="p">;</span>
</span><span class='line'>    <span class="k">return</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">dfs</span><span class="p">(</span><span class="n">step</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">pdt</span><span class="p">,</span> <span class="n">phi</span><span class="p">);</span>
</span><span class='line'>  <span class="n">phi</span> <span class="o">=</span> <span class="n">phi</span> <span class="o">/</span> <span class="n">p</span><span class="p">[</span><span class="n">step</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="n">p</span><span class="p">[</span><span class="n">step</span><span class="p">]</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">c</span><span class="p">[</span><span class="n">step</span><span class="p">];</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">dfs</span><span class="p">(</span><span class="n">step</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">pdt</span> <span class="o">*=</span> <span class="n">p</span><span class="p">[</span><span class="n">step</span><span class="p">],</span> <span class="n">phi</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span><span class="o">*</span><span class="n">i</span> <span class="o">&lt;=</span> <span class="n">x</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>      <span class="k">for</span> <span class="p">(;</span> <span class="n">x</span> <span class="o">%</span> <span class="n">i</span> <span class="o">==</span> <span class="mi">0</span><span class="p">;</span> <span class="n">x</span> <span class="o">/=</span> <span class="n">i</span><span class="p">)</span> <span class="o">++</span><span class="n">c</span><span class="p">[</span><span class="n">cnt</span><span class="p">];</span>
</span><span class='line'>      <span class="n">p</span><span class="p">[</span><span class="n">cnt</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span> <span class="n">c</span><span class="p">[</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">p</span><span class="p">[</span><span class="n">cnt</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">dfs</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%lld</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[SPOJ GSS2]Can you answer these queries II]]></title>
    <link href="https://quartergeek.com/gss2/"/>
    <updated>2013-03-17T00:00:00+08:00</updated>
    <id>https://quartergeek.com/gss2</id>
    <content type="html"><![CDATA[<p>这道题非常的有意思，它查询区间和，但是还不计重复。说实话，看到不计重复这种诡异的条件，往可持久化想了，然后完全就没了思路。Orz 网上各种题解。这题有一个比较仁慈的地方：没有修改操作！所以可以离线。</p>
<p>按照右端点排序询问。我们令<code>s[i]</code>为<code>不重复的sum[i..x]</code>，其中<code>x</code>在最外层循环中从<code>1~n</code>。<code>x</code>每前进一位，把<code>s[last[x]+1]</code>到<code>s[x]</code>全部加上<code>a[x]</code>，其中<code>last[x]</code>是x上一次出现的位置。现在，当x等于某一个询问的右端点<code>r</code>的时候，我们的询问<code>[l, r]</code>，相当于询问所有历史中（包括现在）出现的最大的<code>s[k] (k &lt;= r)</code>。听到历史这个词，很容易想到可持久化数据结构，或者说二维数据结构（比如套一个时间维）。但是实际上，这题要求的历史，是从一开始的历史，而不是从某个时间点开始的，因此，还是可以直接使用线段树的。</p>
<p>线段树节点<code>[L, R]</code>记录四个东西：</p>
<pre><code>max:     现在的s[L..R]中最大的一个
tag:     现在还有多少数没有下传给孩子
evermax: 历史到现在的s[L..R]中最大的一个
evertag: 从上一次清除tag到现在最大的tag</code></pre>
<p>然后<code>clear</code>过程就是一个非常纠结的事情。</p>
<pre><code>son.evertag = max(son.evertag, son.tag + p.evertag);
son.evermax = max(son.evermax, son.max + p.evertag);
son.tag += p.tag;
son.max += p.tag;
p.tag = p.evertag = 0;</code></pre>
<p>后面三句很好理解就不说了。第一句是因为tag是一个累加变量，而距离上一次clear我们还有<code>p.evertag</code>没有下传给孩子，所以说孩子还有<code>son.tag+p.evertag</code>这么多没有给孩子的孩子- -|| 而第二句的话就同理了，参照第三句和第四句的关系以及第一句的意义。</p>
<h2 id="代码">代码</h2>
<!--more-->

<div class='bogus-wrapper'>
<notextile>
<figure class='code'><figcaption>
<span></span>
</figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
</pre></td><td class='code'><pre><code class='cpp'><span class='line'><span class="cp">#include &lt;cstdio&gt;</span>
</span><span class='line'><span class="cp">#include &lt;algorithm&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="k">const</span> <span class="kt">int</span> <span class="n">MAXN</span> <span class="o">=</span> <span class="mi">100001</span><span class="p">;</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Node</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">max</span><span class="p">,</span> <span class="n">tag</span><span class="p">,</span> <span class="n">evermax</span><span class="p">,</span> <span class="n">evertag</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span> <span class="n">s</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="mi">4</span><span class="p">];</span>
</span><span class='line'><span class="k">struct</span> <span class="n">Question</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">index</span><span class="p">;</span>
</span><span class='line'>  <span class="n">Question</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'>  <span class="n">Question</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">b</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">i</span><span class="p">)</span><span class="o">:</span> <span class="n">l</span><span class="p">(</span><span class="n">a</span><span class="p">),</span> <span class="n">r</span><span class="p">(</span><span class="n">b</span><span class="p">),</span> <span class="n">index</span><span class="p">(</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span> <span class="n">q</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">bool</span> <span class="k">operator</span><span class="o">&lt;</span><span class="p">(</span><span class="k">const</span> <span class="n">Question</span><span class="o">&amp;</span> <span class="n">lhs</span><span class="p">,</span> <span class="k">const</span> <span class="n">Question</span><span class="o">&amp;</span> <span class="n">rhs</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">lhs</span><span class="p">.</span><span class="n">r</span> <span class="o">&lt;</span> <span class="n">rhs</span><span class="p">.</span><span class="n">r</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">_st</span><span class="p">,</span> <span class="n">_ed</span><span class="p">,</span> <span class="n">_x</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">MAXN</span><span class="p">],</span> <span class="n">_</span><span class="p">[</span><span class="n">MAXN</span><span class="o">*</span><span class="mi">2</span><span class="p">],</span> <span class="n">ans</span><span class="p">[</span><span class="n">MAXN</span><span class="p">];</span>
</span><span class='line'><span class="kt">int</span><span class="o">*</span> <span class="k">const</span> <span class="n">last</span> <span class="o">=</span> <span class="n">_</span><span class="o">+</span><span class="n">MAXN</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">void</span> <span class="n">clear</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">lef</span> <span class="o">==</span> <span class="n">rig</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">lc</span> <span class="o">=</span> <span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">rc</span> <span class="o">=</span> <span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">lc</span><span class="p">].</span><span class="n">evertag</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">lc</span><span class="p">].</span><span class="n">evertag</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">lc</span><span class="p">].</span><span class="n">tag</span> <span class="o">+</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evertag</span><span class="p">);</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">lc</span><span class="p">].</span><span class="n">evermax</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">lc</span><span class="p">].</span><span class="n">evermax</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">lc</span><span class="p">].</span><span class="n">max</span> <span class="o">+</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evertag</span><span class="p">);</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">lc</span><span class="p">].</span><span class="n">tag</span> <span class="o">+=</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">;</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">lc</span><span class="p">].</span><span class="n">max</span> <span class="o">+=</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">rc</span><span class="p">].</span><span class="n">evertag</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">rc</span><span class="p">].</span><span class="n">evertag</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">rc</span><span class="p">].</span><span class="n">tag</span> <span class="o">+</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evertag</span><span class="p">);</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">rc</span><span class="p">].</span><span class="n">evermax</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">rc</span><span class="p">].</span><span class="n">evermax</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">rc</span><span class="p">].</span><span class="n">max</span> <span class="o">+</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evertag</span><span class="p">);</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">rc</span><span class="p">].</span><span class="n">tag</span> <span class="o">+=</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">;</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">rc</span><span class="p">].</span><span class="n">max</span> <span class="o">+=</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evertag</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">max</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">].</span><span class="n">max</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">max</span><span class="p">);</span>
</span><span class='line'>  <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evermax</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">].</span><span class="n">evermax</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">].</span><span class="n">evermax</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">void</span> <span class="n">_modify</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">_st</span> <span class="o">&lt;=</span> <span class="n">lef</span> <span class="o">&amp;&amp;</span> <span class="n">rig</span> <span class="o">&lt;=</span> <span class="n">_ed</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span> <span class="o">+=</span> <span class="n">_x</span><span class="p">;</span>
</span><span class='line'>    <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">max</span> <span class="o">+=</span> <span class="n">_x</span><span class="p">;</span>
</span><span class='line'>    <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evertag</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evertag</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">);</span>
</span><span class='line'>    <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evermax</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evermax</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">max</span><span class="p">);</span>
</span><span class='line'>    <span class="n">clear</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>    <span class="k">return</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="n">clear</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">_st</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span> <span class="n">_modify</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">mid</span><span class="o">+</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">_ed</span><span class="p">)</span> <span class="n">_modify</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>  <span class="n">clear</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>  <span class="n">clear</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>  <span class="n">update</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">_query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">clear</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">rig</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">_st</span> <span class="o">&lt;=</span> <span class="n">lef</span> <span class="o">&amp;&amp;</span> <span class="n">rig</span> <span class="o">&lt;=</span> <span class="n">_ed</span><span class="p">)</span> <span class="k">return</span> <span class="n">s</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">evermax</span><span class="p">;</span>
</span><span class='line'>  <span class="k">const</span> <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">lef</span><span class="o">+</span><span class="n">rig</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">_st</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">_query</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="p">,</span> <span class="n">lef</span><span class="p">,</span> <span class="n">mid</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span><span class="n">mid</span><span class="o">+</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">_ed</span><span class="p">)</span> <span class="n">res</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">max</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">_query</span><span class="p">(</span><span class="n">p</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">rig</span><span class="p">));</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">void</span> <span class="n">Modify</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">delta</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">_st</span> <span class="o">=</span> <span class="n">lef</span><span class="p">,</span> <span class="n">_ed</span> <span class="o">=</span> <span class="n">rig</span><span class="p">,</span> <span class="n">_x</span> <span class="o">=</span> <span class="n">delta</span><span class="p">;</span>
</span><span class='line'>  <span class="n">_modify</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kr">inline</span> <span class="kt">int</span> <span class="n">Query</span><span class="p">(</span><span class="k">const</span> <span class="kt">int</span> <span class="n">lef</span><span class="p">,</span> <span class="k">const</span> <span class="kt">int</span> <span class="n">rig</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">_st</span> <span class="o">=</span> <span class="n">lef</span><span class="p">,</span> <span class="n">_ed</span> <span class="o">=</span> <span class="n">rig</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">_query</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="kt">int</span> <span class="n">main</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">n</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="n">a</span><span class="o">+</span><span class="n">i</span><span class="p">);</span>
</span><span class='line'>  <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">m</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="n">q</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">index</span> <span class="o">=</span> <span class="n">i</span><span class="p">,</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%d%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">q</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">l</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">q</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">r</span><span class="p">);</span>
</span><span class='line'>  <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">q</span><span class="p">,</span> <span class="n">q</span><span class="o">+</span><span class="n">m</span><span class="p">);</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">Modify</span><span class="p">(</span><span class="n">last</span><span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">i</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'>    <span class="n">last</span><span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
</span><span class='line'>    <span class="k">for</span> <span class="p">(;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">m</span> <span class="o">&amp;&amp;</span> <span class="n">q</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">r</span> <span class="o">==</span> <span class="n">i</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>      <span class="n">ans</span><span class="p">[</span><span class="n">q</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">Query</span><span class="p">(</span><span class="n">q</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">l</span><span class="p">,</span> <span class="n">q</span><span class="p">[</span><span class="n">j</span><span class="p">].</span><span class="n">r</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>
</notextile>
</div>]]></content>
  </entry>
  
</feed>
