<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://joyslog.top/https://joyslog.top/feed.xml" rel="self" type="application/atom+xml" /><link href="https://joyslog.top/https://joyslog.top/" rel="alternate" type="text/html" /><updated>2026-03-11T07:59:20+00:00</updated><id>https://joyslog.top/https://joyslog.top/feed.xml</id><title type="html">Joy’s Blog</title><subtitle>My blog with github pages</subtitle><author><name>Joy</name></author><entry><title type="html">苹果生态和安卓手机日历双向同步解决方案</title><link href="https://joyslog.top/https://joyslog.top/2025/10/15/CalenderSync/" rel="alternate" type="text/html" title="苹果生态和安卓手机日历双向同步解决方案" /><published>2025-10-15T00:00:00+00:00</published><updated>2025-10-15T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2025/10/15/CalenderSync</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2025/10/15/CalenderSync/"><![CDATA[<p>近期有这个需求，因为有时在使用 Macbook 和 iPad 的日历看各种活动和作业 Deadline，又需要在安卓的手机上随时添加和查看。</p>

<p>其实很容易解决，只需要使用一个叫 <a href="https://www.davx5.com/">DAVx⁵</a> 的开源软件即可。</p>

<p>在 <a href="https://account.apple.com/">Apple 账户</a> 管理页面中添加一个应用密码，再在 DAVx⁵ 中选择 “使用 URL 和用户名登录”，URL 填写 <code class="language-plaintext highlighter-rouge">https://icloud.com</code>，账号填写 iCloud 账户， 密码填写刚才的应用密码，即可同步。</p>

<p>接下来注意如果要把安卓手机本地的日历同步到 iCloud，需要在日历软件中使用 iCloud 账户下的分类新增日程。</p>

<p>原来在手机上的日程无法自动同步。</p>

<p>效果大概是这样：</p>

<p><img src="/images/Calender.png" alt="" /></p>]]></content><author><name>Joy</name></author><category term="life" /><summary type="html"><![CDATA[solution of syncing android and icloud calender]]></summary></entry><entry><title type="html">2025 夏日与高考与我</title><link href="https://joyslog.top/https://joyslog.top/2025/08/07/gaokao/" rel="alternate" type="text/html" title="2025 夏日与高考与我" /><published>2025-08-07T00:00:00+00:00</published><updated>2025-08-07T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2025/08/07/gaokao</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2025/08/07/gaokao/"><![CDATA[<p>今天已经是 8 月 7 日。高考后的暑假，比我想象中度过得要快。</p>

<p>回学校领毕业照和档案，一草一木似乎还是那么亲切，只是没看见那些更亲切的人。</p>

<p>凭我这孱弱的记忆力，高中的经历也会很快成为感性的、抽象的情绪记忆，而非理性的、具象的事件记忆……或许也并非坏事。</p>

<p>高考这两个字确实因为其结束而降格为意识中的符号了，但这不意味着其重量的流逝。反而潜意识中的重视让它在梦里出现，以不愉快的形式。</p>

<p>谈谈 2025 年的那个 6 月 7 号、6 月 8 号和 6 月 9 号吧。</p>

<p>那是三天苦中作乐的日子：</p>

<p>精神压力导致的恶心和胃部不适在不时发生着，熟悉而温暖的中成胃药并起不到安慰剂的作用。之所以归结为精神压力原因，是因为胃镜告诉我胃本身问题不大，这份不适又确实在高考之后迅速缓解。于是我在考试时多了份工作：对抗突如其来的呕吐欲、用方巾阻挡恶心所致咳嗽的飞沫。</p>

<p>但我仍把这场考试称之为乐，因为精神压力只存在于潜意识中，我并没有把考试认作为一件困难而有障碍的事，我也并没有太大的发挥失常。只是很中规中矩的一次考试——就像高三考过的 20 次模拟考一样。</p>

<p>我在考试后既痛骂试卷出得诡异，又感谢这份确定的不稳定发生在我面前，因为我期待一场不平凡的高考。</p>

<p>我没有在我喜欢的数学上取得太大优势，但反思后我觉得这很正常。我考前太过不屑于限时思考数学题了，我喜欢上了单纯解出题目的感觉。偏偏这次的试卷要拿到高分的思考量，超出我的限时训练负荷。</p>

<p>我没有把英语考出该有的水平，我更讨厌提起这件事。我错了三道阅读，每道都有些一念之差的感觉。我相信自己把文章读得很懂。但我到了高考时竟然还是无法稳定读懂题目考点，即使模拟考中往往能读懂。</p>

<p>语文也错了三道选择题，语用占两道。这是在 20 次模拟考中从未有过的。但我反倒不是很在意这个，因为语文题让我答得顺心，考前心心念念的背诵默写也都写对了。</p>

<p>写到这里，剩下的三科也没什么必要一一回忆了：它们都没有很差，但都差了一点。</p>

<p>其实我把五月过得太过死气沉沉，没有那种迎接挑战的心气，我也不知道是为什么。也许是累了，也许是无法忍受重复的生活了，于是把生活过得更加重复。</p>

<p>高考后参加两个学校的综评，我很开心，因为它们让我有一种久违的被认可的感觉。</p>

<p>我没有去复旦的强基，我知道我考不上。</p>

<p>南科大的综评很中规中矩，笔试面试都比较无聊。面试基本在描述高中的经历而非输出观点，这还相对容易一些。
倒是最后反向询问的环节，问了面试老师学校人文氛围会不会不好，老师解释了好几分钟，有点替学校证明自己的意味，还挺好玩。</p>

<p>港中深的综评非常有趣，差点导致了我激情填报它：让我写得酣畅淋漓的中英文写作、让我走出舒适区的无小组英文辩论、戳中我审美的校区建筑风格……
尤其是校园随处可见的“走路不看手机”标语真真切切地提醒到了我，我喜欢这样可爱的人文关怀。我最后的综评排名是物理类第 19 名，这某种程度上让我觉得
我适合这所学校。</p>

<p>然最后反复思虑，还是在中流 985、港中深、南科大中选择了南科大。具体原因倒也难以具象化，不过我总觉得思虑后的感性才是对我来说做大决定的最好方式。</p>

<p>这个夏日，我过得很愉快。我相对来说很早就知道了我会被什么大学录取。我和我喜欢的人一起待了很多地方。福州、厦门、漳州、兰州、西宁、张掖……
时间规划几乎自由、预算并不吃紧的旅行真是让人心旷神怡。</p>

<p>这 18 年来，尤其是高中三年，我已然走过了中国的不少地方。我很开心，我的世界从不因局部压力而变得狭窄。</p>

<p><img src="/images/2508Footprint.png" alt="" /></p>

<p>地图的可交互版本在 <a href="/reports/202508footprint.html">这里</a>，这里也会实时更新我去过的地方。</p>

<p>大概写这么多吧。很期待接下来的大学生活！我要学会很多东西，弄清楚未来自己真正想干什么，这感觉不太简单，但确很有必要。</p>

<p>祝自己万事顺遂。</p>]]></content><author><name>Joy</name></author><category term="life" /><summary type="html"><![CDATA[gaokao and me]]></summary></entry><entry><title type="html">DaydreamPoem | Story 3 云烧火</title><link href="https://joyslog.top/https://joyslog.top/2024/08/28/DaydreamPoem2/" rel="alternate" type="text/html" title="DaydreamPoem | Story 3 云烧火" /><published>2024-08-28T00:00:00+00:00</published><updated>2024-08-28T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2024/08/28/DaydreamPoem2</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2024/08/28/DaydreamPoem2/"><![CDATA[<p>潮湿缓释于感官</p>

<p>水汽凝聚在天上</p>

<p>我知道</p>

<p>该是燃一把火的时候了</p>

<p>赶在下雨之前</p>

<p><br /></p>

<p>湿漉漉的干草堆在脚下碾碎</p>

<p>不可触及的是天圆地方的棉</p>

<p>既然被光染上它不存在的颜色</p>

<p>就借着光把它烧尽吧</p>

<p>欣赏幻象中的</p>

<p>不可复制的烟火</p>

<p><br /></p>

<p>于是起舞</p>

<p>于干燥而浑浊的天地间</p>

<p>等待野火烧不尽的</p>

<p>云的轮回</p>]]></content><author><name>Joy</name></author><category term="poem" /><summary type="html"><![CDATA[Daydream Poem]]></summary></entry><entry><title type="html">Anki 解决多种卡片模板导出网页：给插件修 BUG</title><link href="https://joyslog.top/https://joyslog.top/2024/07/30/AnkiExport/" rel="alternate" type="text/html" title="Anki 解决多种卡片模板导出网页：给插件修 BUG" /><published>2024-07-30T00:00:00+00:00</published><updated>2024-07-30T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2024/07/30/AnkiExport</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2024/07/30/AnkiExport/"><![CDATA[<p>近期使用 Anki 这个间隔重复记忆软件非常频繁，在里面积累了大量卡片。考虑到备考以及无法使用电子设备的情况，也考虑到将来分享笔记的需要，我找到了 Anki 2.1 可用的一个插件：<a href="https://ankiweb.net/shared/info/1897277426">Export deck to HTML</a>。</p>

<p>随便找了个模板，转换卡片类型单一、没有数学公式的牌组固然很好，但复杂一点的就出现问题了。</p>

<p>怎么办呢？首先我发现如果直接在模板里写死各种字段，若当前卡片没有找到这个字段，会出现提示 “## field … not found ##”</p>

<p>这个就是插件本身的问题了。正好 Anki 的插件是用 python 编写的，遂直接找源代码进行修改。</p>

<p>这个插件位于 <code class="language-plaintext highlighter-rouge">C:\Users\用户名\AppData\Roaming\Anki2\addons21\1897277426\ExportDeckToHtml.py</code>，我们搜索找到产生提示的子段</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span><span class="p">:</span>
    <span class="n">value</span> <span class="o">=</span> <span class="n">card</span><span class="p">.</span><span class="n">note</span><span class="p">()[</span><span class="n">field</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]]</span>
    <span class="n">key</span> <span class="o">+=</span> <span class="n">value</span>
<span class="k">except</span> <span class="nb">KeyError</span><span class="p">:</span>
    <span class="n">value</span> <span class="o">=</span> <span class="s">'## field '</span> <span class="o">+</span> <span class="n">field</span> <span class="o">+</span> <span class="s">' not found ##'</span>
</code></pre></div></div>

<p>直接改成</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">try</span><span class="p">:</span>
    <span class="n">value</span> <span class="o">=</span> <span class="n">card</span><span class="p">.</span><span class="n">note</span><span class="p">()[</span><span class="n">field</span><span class="p">[</span><span class="mi">2</span><span class="p">:</span><span class="o">-</span><span class="mi">2</span><span class="p">]]</span>
    <span class="n">key</span> <span class="o">+=</span> <span class="n">value</span>
<span class="k">except</span> <span class="nb">KeyError</span><span class="p">:</span>
    <span class="n">value</span> <span class="o">=</span> <span class="s">''</span>
</code></pre></div></div>

<p>并且我发现在导出含图片的卡片时，出现了一些 bug，图片会把文字内容覆盖掉。查阅了插件的实现之后，我发现这又是插件写法的问题。
插件作者是用如下代码处理图片的：</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pictures</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">findall</span><span class="p">(</span><span class="sa">r</span><span class="s">'\&lt;img src="(.*?)"'</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">pictures</span><span class="p">):</span>
    <span class="n">img_tmp</span> <span class="o">=</span> <span class="s">'&lt;img src="%s"&gt;'</span>
    <span class="n">value</span> <span class="o">=</span> <span class="s">""</span>
    <span class="k">for</span> <span class="n">pic</span> <span class="ow">in</span> <span class="n">pictures</span><span class="p">:</span>
        <span class="n">full_img_path</span> <span class="o">=</span> <span class="n">join</span><span class="p">(</span>
            <span class="n">collection_path</span><span class="p">,</span> <span class="n">pic</span><span class="p">)</span>
        <span class="n">img_tag</span> <span class="o">=</span> <span class="n">img_tmp</span> <span class="o">%</span> <span class="n">full_img_path</span>
        <span class="n">value</span> <span class="o">+=</span> <span class="n">img_tag</span>
    <span class="n">key</span> <span class="o">+=</span> <span class="n">value</span>
    <span class="n">content</span> <span class="o">+=</span> <span class="n">value</span>
<span class="n">card_html</span> <span class="o">=</span> <span class="n">card_html</span><span class="p">.</span><span class="n">replace</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">value</code> 变量本来存着这个字段的所有信息，这样处理一下，<code class="language-plaintext highlighter-rouge">value</code> 当然就变成只剩图片了。</p>

<p>这段代码的原逻辑有点不好改，用处就是把 Anki 卡片里存的图片的相对路径，改成绝对路径。</p>

<p>作者可能也是对正则表达式不熟练，只能这样粗糙地处理。其实，只要把这一整段改成下面两句即可。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">value</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="n">sub</span><span class="p">(</span><span class="s">'(?&lt;=\&lt;img src=").*?(?=")'</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">matched</span> <span class="p">:</span> <span class="n">join</span><span class="p">(</span><span class="n">collection_path</span><span class="p">,</span> <span class="n">matched</span><span class="p">.</span><span class="n">group</span><span class="p">(</span><span class="mi">0</span><span class="p">)),</span> <span class="n">value</span><span class="p">)</span>
<span class="n">card_html</span> <span class="o">=</span> <span class="n">card_html</span><span class="p">.</span><span class="n">replace</span><span class="p">(</span><span class="n">field</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
</code></pre></div></div>

<p>这样效果很完美。</p>

<p>然后在模板网页里用 javascript 和 css 简单处理一下表格的着色、数学公式的渲染、填空题的显示，即可完成。</p>

<figure class="highlight"><pre><code class="language-html" data-lang="html"><span class="nt">&lt;head&gt;</span>
    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"UTF-8"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/x-mathjax-config"</span><span class="nt">&gt;</span>
        <span class="nx">MathJax</span> <span class="o">=</span> <span class="p">{</span>
            <span class="na">tex</span><span class="p">:</span> <span class="p">{</span>
              <span class="na">inlineMath</span><span class="p">:</span> <span class="p">[[</span><span class="dl">'</span><span class="s1">$</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="s1">$</span><span class="dl">'</span><span class="p">],</span> <span class="p">[</span><span class="dl">'</span><span class="se">\\</span><span class="s1">(</span><span class="dl">'</span><span class="p">,</span> <span class="dl">'</span><span class="se">\\</span><span class="s1">)</span><span class="dl">'</span><span class="p">]]</span>
            <span class="p">},</span>
            <span class="na">svg</span><span class="p">:</span> <span class="p">{</span>
              <span class="na">fontCache</span><span class="p">:</span> <span class="dl">'</span><span class="s1">global</span><span class="dl">'</span>
            <span class="p">}</span>
          <span class="p">};</span>
        <span class="nt">&lt;/script&gt;</span>
        <span class="nt">&lt;script </span><span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">id=</span><span class="s">"MathJax-script"</span> <span class="na">async</span>
          <span class="na">src=</span><span class="s">"https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js"</span><span class="nt">&gt;</span>
        <span class="nt">&lt;/script&gt;</span>
    <span class="nt">&lt;style&gt;</span>
        <span class="nt">table</span> <span class="p">{</span>
            <span class="nl">font-family</span><span class="p">:</span> <span class="s1">"Book Antiqua"</span><span class="p">,</span> <span class="s1">"宋体"</span><span class="p">;</span>
            <span class="nl">font-size</span><span class="p">:</span> <span class="m">13px</span><span class="p">;</span>
            <span class="nl">color</span><span class="p">:</span> <span class="m">#000000</span><span class="p">;</span>
            <span class="nl">border-width</span><span class="p">:</span> <span class="m">1px</span><span class="p">;</span>
            <span class="nl">border-color</span><span class="p">:</span> <span class="m">#000000</span><span class="p">;</span>
            <span class="nl">border-collapse</span><span class="p">:</span> <span class="nb">collapse</span><span class="p">;</span>
            <span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">@media</span> <span class="n">print</span> <span class="p">{</span>
            <span class="py">tr</span><span class="p">:</span><span class="n">nth-child</span><span class="p">(</span><span class="n">odd</span><span class="p">)</span><span class="err">{</span>
                <span class="n">background-color</span><span class="p">:</span> <span class="m">#dfdfdf</span> <span class="p">;</span>
            <span class="p">}</span>
        <span class="err">}</span>    
        <span class="nt">tr</span><span class="nd">:nth-child</span><span class="o">(</span><span class="nt">odd</span><span class="o">)</span><span class="p">{</span>
            <span class="nl">background-color</span><span class="p">:</span> <span class="m">#dfdfdf</span> <span class="p">;</span>
        <span class="p">}</span>
        <span class="nt">td</span><span class="o">,</span> <span class="nt">th</span> <span class="p">{</span>
            <span class="nl">border-width</span><span class="p">:</span> <span class="m">1px</span><span class="p">;</span>
            <span class="nl">padding</span><span class="p">:</span> <span class="m">8px</span><span class="p">;</span>
            <span class="nl">border-style</span><span class="p">:</span> <span class="nb">solid</span><span class="p">;</span>
            <span class="nl">border-color</span><span class="p">:</span> <span class="m">#000000</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="nt">img</span> <span class="p">{</span>
            <span class="nl">max-width</span><span class="p">:</span> <span class="m">50%</span><span class="p">;</span>
            <span class="nl">height</span><span class="p">:</span> <span class="nb">auto</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="nt">&lt;/style&gt;</span>
    <span class="nt">&lt;script&gt;</span>
        <span class="nb">window</span><span class="p">.</span><span class="nx">onload</span> <span class="o">=</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
            <span class="kd">var</span> <span class="nx">bs</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="dl">"</span><span class="s2">span</span><span class="dl">"</span><span class="p">);</span>
            <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">bs</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">if</span><span class="p">(</span><span class="nx">bs</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">style</span><span class="p">.</span><span class="nx">backgroundColor</span> <span class="o">!=</span> <span class="dl">""</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">var</span> <span class="nx">par</span> <span class="o">=</span> <span class="nx">bs</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">parentNode</span><span class="p">;</span>
                    <span class="nx">bs</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">style</span><span class="p">.</span><span class="nx">backgroundColor</span> <span class="o">=</span> <span class="nx">par</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">backgroundColor</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
            <span class="kd">var</span> <span class="nx">texts</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="dl">"</span><span class="s2">td</span><span class="dl">"</span><span class="p">);</span>
            <span class="k">for</span><span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="nx">texts</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
                <span class="kd">var</span> <span class="nx">text</span> <span class="o">=</span> <span class="nx">texts</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">innerHTML</span><span class="p">;</span>
                <span class="kd">var</span> <span class="nx">rep</span> <span class="o">=</span> <span class="nx">text</span><span class="p">.</span><span class="nx">replace</span><span class="p">(</span><span class="sr">/{{c</span><span class="se">[</span><span class="sr">1-9</span><span class="se">]</span><span class="sr">::</span><span class="se">(</span><span class="sr">.*</span><span class="se">?)</span><span class="sr">}}/g</span><span class="p">,</span> <span class="dl">"</span><span class="s2">&lt;p style=</span><span class="se">\"</span><span class="s2">color: rgb(0, 0, 255); display: inline; text-decoration: underline; </span><span class="se">\"</span><span class="s2">&gt;$1&lt;/p&gt;</span><span class="dl">"</span><span class="p">);</span>
                <span class="nx">texts</span><span class="p">[</span><span class="nx">i</span><span class="p">].</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="nx">rep</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="nt">&lt;/script&gt;</span>
<span class="nt">&lt;/head&gt;</span>

<span class="nt">&lt;body&gt;</span>
    <span class="nt">&lt;table&gt;</span>
        <span class="nt">&lt;tr&gt;</span>
            <span class="nt">&lt;td&gt;</span>{{正面}}{{文字}}{{Text}}<span class="nt">&lt;/td&gt;</span>
            <span class="nt">&lt;td&gt;</span>{{背面}}{{背面额外}}<span class="nt">&lt;/td&gt;</span>
        <span class="nt">&lt;/tr&gt;</span>
    <span class="nt">&lt;/table&gt;</span>
<span class="nt">&lt;/body&gt;</span></code></pre></figure>

<p>最后贴一张解决了上述各种坑点的效果图：</p>

<p><img src="https://s2.loli.net/2024/07/31/2iokgMV9xnSJqjQ.png" alt="" /></p>]]></content><author><name>Joy</name></author><category term="life" /><summary type="html"><![CDATA[Anki Export]]></summary></entry><entry><title type="html">DaydreamPoem | Story 1 记梦 &amp;amp; 2 超载</title><link href="https://joyslog.top/https://joyslog.top/2024/05/13/DaydreamPoem1/" rel="alternate" type="text/html" title="DaydreamPoem | Story 1 记梦 &amp;amp; 2 超载" /><published>2024-05-13T00:00:00+00:00</published><updated>2024-05-13T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2024/05/13/DaydreamPoem1</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2024/05/13/DaydreamPoem1/"><![CDATA[<blockquote>
  <p>夜里的梦，也是白日梦。</p>
</blockquote>

<h3 id="story-1">Story 1</h3>

<p><strong>2024.4.13 记梦</strong></p>

<p>缝补解剖 渡河行岛 依稀水中远行</p>

<p>依序打卡 旅伴失散 挤压阁楼休憩</p>

<p><br /></p>

<p>是指北针的无用 是地图的璀璨</p>

<p>是世界的风景线 是露珠攀上岩</p>

<p>有呜咽 有血肉 那无畏和心碎</p>

<p>有可爱 有可敬 那虚无和美满</p>

<p>白鸟绕林 山河环岛</p>

<p>是海中有岛 或岛中有海</p>

<p><br /></p>

<p>老板 来一杯酒</p>

<p>洗去记忆中的尘世污浊</p>

<p>唯有精神中的印记</p>

<p>与毫不理性的留恋</p>

<h3 id="story-2">Story 2</h3>

<p><strong>超载 2024.5.2</strong></p>

<p>不知不觉 行至渡口</p>

<p>身前是汹涌斜曲的江流</p>

<p>身后是苍茫模糊的大地</p>

<p>船老大说</p>

<p>不是所有人都能上船</p>

<p><br /></p>

<p>卸下行囊 站上码头</p>

<p>虚无填满我的行囊</p>

<p>理想弥散我的身体</p>

<p>船老大说</p>

<p>我们不渡迷茫的人</p>

<p><br /></p>

<p>造船 撑船 乘风破浪</p>

<p>诡谲的水波</p>

<p>深沉的亡灵</p>

<p>我带了违禁品</p>

<p>江流要销毁它们</p>

<p>取缔超载的小船</p>

<p><br /></p>

<p>我不会游泳</p>

<p>祈祷</p>

<p>祈祷我走了正确的路</p>]]></content><author><name>Joy</name></author><category term="poem" /><summary type="html"><![CDATA[Daydream Poem]]></summary></entry><entry><title type="html">我是如何把 Blog 从 Github Pages 迁移到云服务器上的</title><link href="https://joyslog.top/https://joyslog.top/2024/05/09/blogrenew/" rel="alternate" type="text/html" title="我是如何把 Blog 从 Github Pages 迁移到云服务器上的" /><published>2024-05-09T00:00:00+00:00</published><updated>2024-05-09T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2024/05/09/blogrenew</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2024/05/09/blogrenew/"><![CDATA[<p>四月底半期考完闲得没事，考虑到自己的 Blog 使用 Github Pages 服务，导致时常无法访问，又有点折腾的欲望，遂购买了一个香港的云服务器用于部署。这个云服务器未来可能会上更多的网页应用，如果我有兴致学一些新知识的话。</p>

<h3 id="云服务器选购和配置">云服务器选购和配置</h3>

<p>对于那些主要面向国内用户的网站，自然首选国内服务器，这就存在一个备案的问题。虽然据说备案本身并不困难，但这其实加了一层拘束，比如要保持网站在线、服务器和域名都要在国内备案、要时刻小心被封禁等。</p>

<p>鉴于我的域名是在 Namesilo 上面买的，自然无法进行备案，也就只能选择墙外的服务器，这里选择硅云的香港服务器，最低配，活动价 219 CNY/年。只是后面由于自己开发过程遇到了些难以解决的问题，误认为服务器配置需要提升，花了一些活动价以外的冤枉钱提升带宽和内存。其实这是缺乏常识导致的额外消费，我部署的简单应用根本不需要多好的配置。总的来说这个活动价还是不错的。</p>

<p>根据不同的需求，可以在网上查找最新的服务器活动信息，关注优惠，毕竟小型的网站和项目迁移起来还是比较简单的，一年以后再换新的也不是什么难事。</p>

<p>初始化之后，几经周折，我最后使用 vscode 中的 SSH 插件来连接云服务器，这样连接的好处就是可以直接用 vscode 编辑各种文件，环境也是熟悉的，非常舒服。</p>

<p>安装了 nginx 等必要的软件后，就可以开始部署网站了。</p>

<h3 id="nginx-设置">Nginx 设置</h3>

<p>安装 git，然后使用 <code class="language-plaintext highlighter-rouge">git pull</code> 把 github 上的网页源码拉取到云服务器上。</p>

<p>这里我的 blog 使用 jekyll 作为生成器，所以需要先后安装 ruby 和 jekyll，这个虽然比较麻烦，但是相比于 windows 上安装还是快很多、省心很多。</p>

<p>安装之后在本地生成一下静态博客，可以放到 <code class="language-plaintext highlighter-rouge">/var/www/</code> 里面，作为之后配置要用的网站文件位置。</p>

<p>在 <code class="language-plaintext highlighter-rouge">/etc/nginx/nginx.conf</code> 的 <code class="language-plaintext highlighter-rouge">http</code> 子段中，添加：</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>	server {
		listen 80;
		server_name {域名};
		rewrite ^(.*)$  https://$host$1 permanent;
		location / {
			root {网站文件位置};
			index index.html index.htm;
		}
	}

	server {
		listen 443 ssl http2;
		server_name {域名};
		
		ssl_certificate	{证书位置};
		ssl_certificate_key	{证书位置};

		ssl_session_timeout 1d;
		ssl_session_cache shared:SSL:1m;
		ssl_session_cache shared:MozSSL:10m;
		ssl_session_tickets off;
		ssl_protocols TLSv1.2;
		ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
		ssl_prefer_server_ciphers on;

		location / {
			root {网站文件位置};
			index index.html index.htm;
		}
	}
</code></pre></div></div>

<p>域名可以先填服务器公网 ip 进行测试，然后把域名解析到这个公网 ip 上，再尝试访问。</p>

<p>这里给出的 nginx 配置文件是最简单的版本，没有针对不同网站拆分出不同的配置文件，且针对静态网站。</p>

<p>这里做了一个强制 https 访问。我的 ssl 证书使用了 acme.sh 进行 <a href="https://freessl.cn">freessl</a> 证书的自动签发。</p>

<p>到这一步的过程中，好像还出现了挺多差错的，不过都通过搜索解决了。这里就不展开了。</p>

<h3 id="同步本地-blog-修改">同步本地 Blog 修改</h3>

<p>这个其实有很多方法，比如说在云服务器上自己建立一个 git 远程仓库是一个不错的选择。</p>

<p>但我想保留 github 上面的备份，把 github 作为一个中转站，以便日后再次迁移。</p>

<p>于是，我找到了这样一个方案：在云服务器上创建一个 API，每次 POST 请求这个 API，就自动执行“从github上拉取”和“用jekyll渲染博客”这两件事。</p>

<p>然后通过 github 的 webhook 功能，可以建立一个每次 push 就 trigger 的 webhook，让他每次收到 push 就请求一下这个接口。这样就实现了自动同步。</p>

<p>具体实现，可以查看我参考的文章 <a href="https://developer.aliyun.com/article/680718">利用Git Webhooks实现jekyll博客自动化部署</a>。</p>

<h3 id="其他">其他</h3>

<p>我还用这个云服务器搭建了一个 hypixel 的加速 ip，这是一个知名的 minecraft 国际小游戏服务器。</p>

<p>这应该会持续运行一年左右，只需要在 minecraft 多人游戏中加入 <code class="language-plaintext highlighter-rouge">hypixel.joyslog.top</code> 即可使用。</p>

<p><img src="/images/mc.png" alt="" /></p>]]></content><author><name>Joy</name></author><category term="life" /><summary type="html"><![CDATA[introduction of blog removal]]></summary></entry><entry><title type="html">OI Diary 08：NOIP2023 游记</title><link href="https://joyslog.top/https://joyslog.top/2023/11/18/OIDiary8/" rel="alternate" type="text/html" title="OI Diary 08：NOIP2023 游记" /><published>2023-11-18T00:00:00+00:00</published><updated>2023-11-18T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2023/11/18/OIDiary8</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2023/11/18/OIDiary8/"><![CDATA[<p>先写一篇 NOIP2023 游记。</p>

<p>出分了之后大概还会有一篇生涯回顾。</p>

<h2 id="两周前">两周前</h2>

<p>慎重考虑后决定今年停两周，包括免考半期考！这样的话暂时就可以全身心投入训练了。</p>

<p>可惜班主任不同意，说是要参加六科的考试，不然影响我们的学习状态。可能还是我们班竞赛的太少了吧，完全没有照顾，停课了也不会给我们录课，而钱一班就有录课看。而且对于他们来说，信竞还是所有竞赛中退役最早的，所以他们课表里还会继续排竞赛课，对他们来说就是自习了。真好。</p>

<p>后来还是找老师说理然后成功免考了。最会让步说理的一集。</p>

<p>两周打了 8 场左右的模拟赛，每天都把自己能订正的题订正了下，也补了不少题，还打了一场 ABC，vp 了一些 CF。感觉赛场水平还是没有长足进步，不过见过的套路正在逐渐变多。</p>

<blockquote>
  <p>有时候，做不出题，想不出正解灵感的来源和理由，总是会有些挫败感，觉得自己为啥想不到，为啥写不出来，是不是真的太笨了，反应太慢了。这时只能安慰自己：你学的如此之晚，停课训练如此之少，既不是天赋怪，又没有拼命努力学，那么没见过各种转化，没学过一些想法和算法，所谓的“降智”再正常不过了。</p>
</blockquote>

<h2 id="day--1">Day -1</h2>

<p>周四上午打了完整的一场模拟赛，考到 13：00，考完出去吃饭，发现大家都聚在一家兰州拉面店。于是聚餐，我点的红烧牛肉盖饭还挺好吃的。</p>

<p>下午我校 22 人直接入侵附中试机，体验下来就是他们机子更换之后性能很好，上拍一点都不卡，打开大样例也完全不会死机，不像本校 Linux 极其容易卡。</p>

<p>那天阳光十分美妙，让我感到附中的空气比三中香甜。试机之后正好遇到他们在打篮球段赛。</p>

<p><img src="/images/70564417.png" alt="" /></p>

<p>那天，风呼啸地吹着，青春碰撞着初冬，绽放出不可复制的浮光。</p>

<h2 id="day-0">Day 0</h2>

<p>没有模拟赛了。上午打板子，发现欧拉路径板子写挂了，非常神秘，有一个纳入答案顺序的问题，改了就 $100\to 20$ 分。和同学讨论之后发现确实要在遍历完所有出边之后把答案入栈，否则形成不了欧拉路径，这个和 dfs 本身的特质有关。</p>

<p>下午做各种 dp。一个线段树优化 dp，一个单调队列优化 dp，还看了几题背包和树 dp 啥的。有些题看了之后加到做题计划里，估计高中剩余时间都不会动了。</p>

<p><img src="/images/22820849.png" alt="" /></p>

<p>各种原因导致，晚上紧张，瞎想，大哭，心悸，泪流不止。但还是早睡了。</p>

<h2 id="day-1">Day 1</h2>

<p>早上不用闹钟就醒了。上附中的路堵住了，所以只能早早下车快步走到校门口，到的时候已经 $8:05$ 了。</p>

<p>$8:30$，准时下发密码，先敲了缺省源，然后调了下编辑环境。开 T1。考虑数据范围，需要一个 $\mathcal{O}(n m)$ 的解法，但考虑 CCF 的机子，感觉挂个 $\log$ 也无所谓。这题思路显然，排序之后把当前字典序最小的态和剩余的字典序最大的态分别做比较，暴力做是 $\mathcal{O}(n^2 m)$ 的。然后大部分人写了个预处理最小的最大态直接过了，但我写了个没见过有人写的傻逼做法，就是预处理哈希，然后倍增地跳相同的前缀，把单次比较变成 $\log$ 的。这样大概也能过，就是有点傻。没上拍，希望不要挂。</p>

<p>$9：25$，开 T2。最浪费时间的一题。感觉这玩意挺好转化成图论的，但是没有细想，因为感觉部分分很多，所以就一个一个开特殊性质。然后发现口胡的 U+ 和 +- 两个性质的做法复杂度都假了，最接近正解的并查集做法写挂，由于此时已经 $11:00$，只能转而写 $\mathcal{O}(n^2)$ 用 dfs 暴力判连通块是否要填 U。最后写了 4k，估计只有 $60pts$。这题给性质都拍上了几千组，但好像测的东西太小了。希望不要挂。</p>

<p>$11:15$，开 T3。特殊性质贪心想假了，摆烂。跳过。没想小范围 dp，简单分讨一下拿 $10pts$ 走人。</p>

<p>$11:45$，开 T4。看上去 $\mathcal{O}(n^2)$ dp 十分可做。于是随便设计状态，设 $f_{i,j,0/1}$ 表示前 $i$ 天，已经连续打卡 $j$ 天，当天打不打卡的最大能量值。乱写转移，发现样例 2 没过。然后重构了一下，调到 $12:30$，过了样例 2/3。这玩意看上去容易用数据结构优化，但没时间想了。最后也懒得滚动数组了，拼一个特殊性质 B 走人。如果没写假的话就有 $44pts$。</p>

<p>感觉考试策略有点小问题。T2 写了太久，一直对着十几二十分调，有点亏，其实 T3 的暴力 dp 三十五分更好拿。但不重要了。</p>

<p>出来发现今年本校咋这么强。hy233 又 AK 了。三百分以上的似乎有三四个。不会今年真有校线吧？祝三中 OIer 都前途无量。苯人不管这场考的怎样都要退场了，就算超常发挥也挤不进队线，何况今天只是普通的发挥水平。所以无所谓啦。</p>

<p>好好调整一下，重新起航，卷入文化课的漩涡吧 <code class="language-plaintext highlighter-rouge">^_^</code>。</p>

<p><img src="/images/24568003.png" alt="" /></p>

<p>以上。</p>]]></content><author><name>Joy</name></author><category term="OIDiary" /><summary type="html"><![CDATA[OI Diary]]></summary></entry><entry><title type="html">OI笔记 | 2023.7-11 做题记录（一）</title><link href="https://joyslog.top/https://joyslog.top/2023/11/15/Note31/" rel="alternate" type="text/html" title="OI笔记 | 2023.7-11 做题记录（一）" /><published>2023-11-15T00:00:00+00:00</published><updated>2023-11-15T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2023/11/15/Note31</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2023/11/15/Note31/"><![CDATA[<ul>
  <li><a href="#图">图</a>
    <ul>
      <li><a href="#题解">题解</a></li>
    </ul>
  </li>
  <li><a href="#十二省联考-2019-春节十二响">[十二省联考 2019] 春节十二响</a>
    <ul>
      <li><a href="#题解-1">题解</a></li>
    </ul>
  </li>
  <li><a href="#树">树</a>
    <ul>
      <li><a href="#题解-2">题解</a></li>
    </ul>
  </li>
  <li><a href="#街道">街道</a>
    <ul>
      <li><a href="#题解-3">题解</a></li>
    </ul>
  </li>
  <li><a href="#addition-and-subtraction">Addition and Subtraction</a>
    <ul>
      <li><a href="#题解-4">题解</a></li>
    </ul>
  </li>
  <li><a href="#rectangle-painting-1">Rectangle Painting 1</a>
    <ul>
      <li><a href="#题解-5">题解</a></li>
    </ul>
  </li>
  <li><a href="#abc139e-league">[ABC139E] League</a>
    <ul>
      <li><a href="#题解-6">题解</a></li>
    </ul>
  </li>
  <li><a href="#jsoi2007-建筑抢修">[JSOI2007] 建筑抢修</a>
    <ul>
      <li><a href="#题解-7">题解</a></li>
    </ul>
  </li>
  <li><a href="#字符串">字符串</a>
    <ul>
      <li><a href="#题解-8">题解</a></li>
    </ul>
  </li>
  <li><a href="#groceries-in-meteor-town">Groceries in Meteor Town</a>
    <ul>
      <li><a href="#题解-9">题解</a></li>
    </ul>
  </li>
</ul>

<h2 id="图">图</h2>

<p>给你一个 $n$  个点，$m$ 条边的无向连通有权图，将其中任意不同两点的距离从小到大排列。</p>

<p>求这个排列中第 $k$ 个元素的大小，也即图中第 $k$ 短的最短路。</p>

<p>$n\le 2\times 10^5, k\le 400$</p>

<h3 id="题解">题解</h3>

<p>$k$ 很小，从它入手。</p>

<p>注意到直接选前 $k$ 短的边建新图，答案一定在新图产生，因为边权为正，如果多加了一条边，路径长度必然增加，而前 $k$ 短的边已经控制了第 $k$ 短的最短路的长度的上限，不会再增加了。</p>

<p>那么对于新图枚举起点做最短路即可。</p>

<p>时间复杂度 $O(k^2\log k)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">ll</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">2e5</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="n">MAX_K</span> <span class="o">=</span> <span class="mi">400</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span> 
<span class="k">const</span> <span class="n">ll</span> <span class="n">INF</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1ll</span> <span class="o">&lt;&lt;</span> <span class="mi">60</span><span class="p">);</span>
<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">k</span><span class="p">,</span> <span class="n">tot</span><span class="p">,</span> <span class="n">cnt</span><span class="p">,</span> <span class="n">ecnt</span><span class="p">,</span> <span class="n">fir</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">id</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">D</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">res</span><span class="p">[</span><span class="n">MAX_N</span> <span class="o">+</span> <span class="n">MAX_K</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">vis</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">used</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="k">struct</span> <span class="nc">Ed</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">;</span>
	<span class="n">Ed</span><span class="p">(</span><span class="kt">int</span> <span class="n">_u</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_v</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_w</span> <span class="o">=</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">_u</span><span class="p">),</span> <span class="n">v</span><span class="p">(</span><span class="n">_v</span><span class="p">),</span> <span class="n">w</span><span class="p">(</span><span class="n">_w</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</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">Ed</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="n">w</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">.</span><span class="n">w</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span> <span class="n">edges</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="k">struct</span> <span class="nc">edge</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">nxt</span><span class="p">;</span>
	<span class="n">edge</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
	<span class="n">edge</span><span class="p">(</span><span class="kt">int</span> <span class="n">_v</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_w</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_nxt</span><span class="p">)</span> <span class="o">:</span>
		<span class="n">v</span><span class="p">(</span><span class="n">_v</span><span class="p">),</span> <span class="n">w</span><span class="p">(</span><span class="n">_w</span><span class="p">),</span> <span class="n">nxt</span><span class="p">(</span><span class="n">_nxt</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
<span class="p">}</span> <span class="n">E</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="kt">void</span> <span class="n">AddEdge</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 class="kt">int</span> <span class="n">w</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">E</span><span class="p">[</span><span class="o">++</span><span class="n">ecnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">edge</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">fir</span><span class="p">[</span><span class="n">u</span><span class="p">]);</span>
	<span class="n">fir</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">ecnt</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">dijkstra</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">)</span> <span class="p">{</span>
	<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">tot</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">D</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">INF</span><span class="p">,</span> <span class="n">vis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
	<span class="n">D</span><span class="p">[</span><span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="n">priority_queue</span><span class="o">&lt;</span><span class="n">pii</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">pii</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">greater</span><span class="o">&lt;</span><span class="n">pii</span><span class="o">&gt;&gt;</span> <span class="n">q</span><span class="p">;</span>
	<span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">make_pair</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">s</span><span class="p">));</span>
	<span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">q</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">q</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">second</span><span class="p">;</span>
		<span class="n">q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
		<span class="k">if</span><span class="p">(</span><span class="n">vis</span><span class="p">[</span><span class="n">u</span><span class="p">])</span>	<span class="k">continue</span><span class="p">;</span>
		<span class="n">vis</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
		<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">fir</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="n">i</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">nxt</span><span class="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">v</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">;</span>
			<span class="k">if</span><span class="p">(</span><span class="n">D</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">+</span> <span class="n">w</span> <span class="o">&lt;</span> <span class="n">D</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="p">{</span>
				<span class="n">D</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">D</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">+</span> <span class="n">w</span><span class="p">;</span>
				<span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">make_pair</span><span class="p">(</span><span class="n">D</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">v</span><span class="p">));</span>
			<span class="p">}</span>
		<span class="p">}</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">freopen</span><span class="p">(</span><span class="s">"graph.in"</span><span class="p">,</span> <span class="s">"r"</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span>
	<span class="n">freopen</span><span class="p">(</span><span class="s">"graph.out"</span><span class="p">,</span> <span class="s">"w"</span><span class="p">,</span> <span class="n">stdout</span><span class="p">);</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">m</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">k</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">v</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">w</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">Ed</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">w</span><span class="p">);</span>
	<span class="p">}</span>
	<span class="n">sort</span><span class="p">(</span><span class="n">edges</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">edges</span> <span class="o">+</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
	<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">k</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">edges</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">;</span>
		<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">used</span><span class="p">[</span><span class="n">u</span><span class="p">])</span> <span class="p">{</span>
			<span class="n">used</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
			<span class="n">id</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">tot</span><span class="p">;</span>
		<span class="p">}</span>
		<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">used</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="p">{</span>
			<span class="n">used</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
			<span class="n">id</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="o">++</span><span class="n">tot</span><span class="p">;</span>
		<span class="p">}</span>
		<span class="n">AddEdge</span><span class="p">(</span><span class="n">id</span><span class="p">[</span><span class="n">u</span><span class="p">],</span> <span class="n">id</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">w</span><span class="p">);</span>
		<span class="n">AddEdge</span><span class="p">(</span><span class="n">id</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">id</span><span class="p">[</span><span class="n">u</span><span class="p">],</span> <span class="n">w</span><span class="p">);</span>
	<span class="p">}</span>
	<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">tot</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">dijkstra</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>		
		<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">tot</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
			<span class="n">res</span><span class="p">[</span><span class="o">++</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">D</span><span class="p">[</span><span class="n">j</span><span class="p">];</span>	
		<span class="k">if</span><span class="p">(</span><span class="n">cnt</span> <span class="o">&gt;</span> <span class="n">k</span><span class="p">)</span> <span class="p">{</span>
			<span class="n">sort</span><span class="p">(</span><span class="n">res</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">res</span> <span class="o">+</span> <span class="n">cnt</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="n">k</span><span class="p">;</span>
		<span class="p">}</span>
	<span class="p">}</span>
	<span class="n">write</span><span class="p">(</span><span class="n">res</span><span class="p">[</span><span class="n">k</span><span class="p">]),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<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 class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="十二省联考-2019-春节十二响">[十二省联考 2019] 春节十二响</h2>

<p><a href="https://www.luogu.com.cn/problem/P5290">洛谷 P5290</a></p>

<p>给一棵 $n$ 个点的树，每个点有一个权值 $w_i$。</p>

<p>你每次可以选取树上的一个点集，要求点集中的每个点不能是另一个点
的祖先，而选出点集的代价为点集中权值最大点的权值。</p>

<p>问将所有点都选一遍的最小代价为多少，每次选的点集不能包含之前已
经被选过的点。</p>

<p>$n\le 2\times 10^5$</p>

<h3 id="题解-1">题解</h3>

<p>考虑若树是一条链，该怎么做。此时若树根是链的一端，则只能一个一个选。否则树根在链的中间，则只能每次从根的左右各选一个。要让代价最小，我们要贪心地把<strong>左的最大</strong>和<strong>右的最大</strong>配对。</p>

<p>考虑一般情况，那就和链上有点像，对于每个节点 $u$，维护一个 $u$ 的子树中可选的最优解集 $E_u$。这个集合显然可以从它的儿子节点中合并而来。只需要把子树两两合并，且每次配对后只保留两个最大值中较大的那一个进入新的最优解集，最后并上这个节点本身的权值。</p>

<p>但复杂度不太对，这么做最坏是 $\mathcal{O}(n^2 \log n)$。换成启发式合并就可以变成正解 $\mathcal{O}(n\log n)$ 的。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb emplace_back
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">2e5</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
<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">M</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">tmp</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">ans</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">G</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">multiset</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">greater</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">E</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">void</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">u</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">v</span> <span class="o">:</span> <span class="n">G</span><span class="p">[</span><span class="n">u</span><span class="p">])</span> <span class="p">{</span>
        <span class="n">dfs</span><span class="p">(</span><span class="n">v</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="k">if</span><span class="p">(</span><span class="n">E</span><span class="p">[</span><span class="n">u</span><span class="p">].</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;</span> <span class="n">E</span><span class="p">[</span><span class="n">v</span><span class="p">].</span><span class="n">size</span><span class="p">())</span>   <span class="n">swap</span><span class="p">(</span><span class="n">E</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">v</span><span class="p">]);</span>
        <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">E</span><span class="p">[</span><span class="n">v</span><span class="p">].</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span>
            <span class="n">tmp</span><span class="p">[</span><span class="o">++</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="o">*</span><span class="n">E</span><span class="p">[</span><span class="n">u</span><span class="p">].</span><span class="n">begin</span><span class="p">(),</span> <span class="o">*</span><span class="n">E</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">E</span><span class="p">[</span><span class="n">u</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">E</span><span class="p">[</span><span class="n">u</span><span class="p">].</span><span class="n">begin</span><span class="p">());</span>
            <span class="n">E</span><span class="p">[</span><span class="n">v</span><span class="p">].</span><span class="n">erase</span><span class="p">(</span><span class="n">E</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="p">}</span>
        <span class="k">while</span><span class="p">(</span><span class="n">cnt</span><span class="p">)</span>  <span class="n">E</span><span class="p">[</span><span class="n">u</span><span class="p">].</span><span class="n">insert</span><span class="p">(</span><span class="n">tmp</span><span class="p">[</span><span class="n">cnt</span><span class="o">--</span><span class="p">]);</span>
    <span class="p">}</span>
    <span class="n">E</span><span class="p">[</span><span class="n">u</span><span class="p">].</span><span class="n">insert</span><span class="p">(</span><span class="n">M</span><span class="p">[</span><span class="n">u</span><span class="p">]);</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <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="n">i</span><span class="o">++</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="o">=</span> <span class="n">read</span><span class="p">();</span>
    <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">fa</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="p">)</span> <span class="p">{</span>
        <span class="n">fa</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
        <span class="n">G</span><span class="p">[</span><span class="n">fa</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">i</span><span class="p">);</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="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">v</span> <span class="o">:</span> <span class="n">E</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
        <span class="n">ans</span> <span class="o">+=</span> <span class="n">v</span><span class="p">;</span>
    <span class="n">write</span><span class="p">(</span><span class="n">ans</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>    
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="树">树</h2>

<p>我们称一棵权值为 $w$ 的树是 “好的”，当且仅当：</p>

<ul>
  <li>
    <p>它的若干个（至少 $2$ 个）子树均为权值、结构相同的 “好的” 树，且权值和不超过 $w$。</p>
  </li>
  <li>
    <p>称 “浪费的权值” 为 $w-$ 子树权值和，浪费的权值和 $&lt;$ 子树个数。</p>
  </li>
</ul>

<p>特别地，一个点被视作权值为 $1$ 的 “好的” 树。</p>

<p>你需要求出权值为 $n$ 的，“好的” 树的形态数量。</p>

<p>$n \le 10^9$</p>

<h3 id="题解-2">题解</h3>

<p>显然考虑 dp，我们设 $f_w$ 为权值为 $w$ 的，“好的”树的形态数量。边界情况为 $f_1=1$。则枚举它的子树的个数 $i$ 和权值大小 $k$，暴力转移如下：</p>

\[f_w=\sum_{i=2}^w \sum_{k=1}^{w} f_k\]

<p>暴力转移同时判断状态是否满足题意，时间复杂度 $\mathcal{O}(n^3)。$</p>

<p>考虑题目条件的另一种表达方式：$w=i\times k+p$，其中 $p$ 为 “浪费的权值”，所以 $k&lt; i$。</p>

<p>这里可以看出很像余数的表达形式。即 $p$ 为余数，$k$ 只有一种取值，为 $\lfloor \frac{w}{i}\rfloor$。所以转移方程可以重新写出：</p>

\[f_{w}=\sum_{i=2}^w f_{\lfloor \frac{w}{i}\rfloor}\]

<p>那么这个就是整除分块能做的事了。时间复杂度直线掉到 $\mathcal{O}(n\sqrt n)$。</p>

<p>然后本题可以证明，如果我们只需求出 $f_n$，则有用的状态并不多，大概级别为 $\mathcal{O}(n^{\frac{3}{4}})$。所以记忆化搜索可以过本题。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="kt">int</span> <span class="n">n</span><span class="p">;</span>
<span class="n">unordered_map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">ll</span><span class="o">&gt;</span> <span class="n">f</span><span class="p">;</span>

<span class="n">ll</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="n">x</span><span class="p">])</span>  <span class="k">return</span> <span class="n">f</span><span class="p">[</span><span class="n">x</span><span class="p">];</span>    
    <span class="n">ll</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span> <span class="o">=</span> <span class="mi">2</span><span class="p">,</span> <span class="n">r</span><span class="p">;</span> <span class="n">l</span> <span class="o">&lt;=</span> <span class="n">x</span><span class="p">;</span> <span class="n">l</span> <span class="o">=</span> <span class="n">r</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">r</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">x</span> <span class="o">/</span> <span class="p">(</span><span class="n">x</span> <span class="o">/</span> <span class="n">l</span><span class="p">));</span>
        <span class="n">res</span> <span class="o">+=</span> <span class="n">dfs</span><span class="p">(</span><span class="n">x</span> <span class="o">/</span> <span class="n">l</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">r</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="p">}</span>
    <span class="k">return</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">res</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <span class="n">f</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">write</span><span class="p">(</span><span class="n">dfs</span><span class="p">(</span><span class="n">n</span><span class="p">));</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="街道">街道</h2>

<p>共 $n$ 个人有顺序地站在宽度为 $W$ 的街道上，每人有一个宽度 $w_i$。</p>

<p>两个相邻的人宽度之和不超过街道宽度时，他们可以交换前后位置。</p>

<p>你需要统计出人群有多少种站位方式。答案对 $998244353$ 取模。</p>

<p>$n\le 10^6$</p>

<h3 id="题解-3">题解</h3>

<p>考虑比较特殊的两个人，宽度最小的人 $u$ 和宽度最大的人 $v$。分成两种情况考虑：</p>

<ul>
  <li>
    <p>如果 $w_u + w_v\leq W$，则发现 $u$ 可以在 $1\sim n$ 上随便走。那我们可以把 $u$ 从人群中删掉，答案乘 $n$，然后继续计算。</p>
  </li>
  <li>
    <p>如果 $w_u+w_v &gt; W$，则发现 $v$ 完全动不了。所以不考虑 $v$ 的贡献，只需要分治计算 $v$ 左右的答案，乘起来即可。</p>
  </li>
</ul>

<p>然后发现，我们每一轮都可以至少扔掉一个人的影响。所以只会执行 $n$ 轮。每次需要找区间最小和最大，还需要考虑单点删除，所以用线段树维护即可。时间复杂度 $\mathcal{O}(n\log n)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">1e6</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="n">INF</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">30</span><span class="p">),</span> <span class="n">MOD</span> <span class="o">=</span> <span class="mi">998244353</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">W</span><span class="p">,</span> <span class="n">w</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="k">struct</span> <span class="nc">node</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">mx</span><span class="p">,</span> <span class="n">mxpos</span><span class="p">,</span> <span class="n">mn</span><span class="p">,</span> <span class="n">mnpos</span><span class="p">,</span> <span class="n">delnum</span><span class="p">;</span>
	<span class="n">node</span><span class="p">(</span><span class="kt">int</span> <span class="n">_mx</span> <span class="o">=</span> <span class="o">-</span><span class="n">INF</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_mxpos</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_mn</span> <span class="o">=</span> <span class="n">INF</span><span class="p">,</span>  <span class="kt">int</span> <span class="n">_mnpos</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_delnum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">:</span> 
		<span class="n">mx</span><span class="p">(</span><span class="n">_mx</span><span class="p">),</span> <span class="n">mxpos</span><span class="p">(</span><span class="n">_mxpos</span><span class="p">),</span> <span class="n">mn</span><span class="p">(</span><span class="n">_mn</span><span class="p">),</span> <span class="n">mnpos</span><span class="p">(</span><span class="n">_mnpos</span><span class="p">),</span> <span class="n">delnum</span><span class="p">(</span><span class="n">_delnum</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>	
<span class="p">}</span> <span class="n">d</span><span class="p">[</span><span class="n">MAX_N</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span><span class="p">];</span>

<span class="kr">inline</span> <span class="kt">int</span> <span class="n">lc</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">p</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
<span class="kr">inline</span> <span class="kt">int</span> <span class="n">rc</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">p</span> <span class="o">&lt;&lt;</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="p">}</span>
<span class="kr">inline</span> <span class="kt">int</span> <span class="n">mid</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">s</span> <span class="o">+</span> <span class="p">((</span><span class="n">t</span> <span class="o">-</span> <span class="n">s</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
<span class="kr">inline</span> <span class="n">node</span> <span class="n">U</span><span class="p">(</span><span class="n">node</span> <span class="n">L</span><span class="p">,</span> <span class="n">node</span> <span class="n">R</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">node</span> <span class="n">ret</span><span class="p">;</span>
	<span class="n">ret</span><span class="p">.</span><span class="n">mx</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">L</span><span class="p">.</span><span class="n">mx</span><span class="p">,</span> <span class="n">R</span><span class="p">.</span><span class="n">mx</span><span class="p">);</span>
	<span class="n">ret</span><span class="p">.</span><span class="n">mxpos</span> <span class="o">=</span> <span class="n">L</span><span class="p">.</span><span class="n">mx</span> <span class="o">&gt;</span> <span class="n">R</span><span class="p">.</span><span class="n">mx</span> <span class="o">?</span> <span class="n">L</span><span class="p">.</span><span class="n">mxpos</span> <span class="o">:</span> <span class="n">R</span><span class="p">.</span><span class="n">mxpos</span><span class="p">;</span>
	<span class="n">ret</span><span class="p">.</span><span class="n">mn</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">L</span><span class="p">.</span><span class="n">mn</span><span class="p">,</span> <span class="n">R</span><span class="p">.</span><span class="n">mn</span><span class="p">);</span>
	<span class="n">ret</span><span class="p">.</span><span class="n">mnpos</span> <span class="o">=</span> <span class="n">L</span><span class="p">.</span><span class="n">mn</span> <span class="o">&lt;</span> <span class="n">R</span><span class="p">.</span><span class="n">mn</span> <span class="o">?</span> <span class="n">L</span><span class="p">.</span><span class="n">mnpos</span> <span class="o">:</span> <span class="n">R</span><span class="p">.</span><span class="n">mnpos</span><span class="p">;</span>
    <span class="n">ret</span><span class="p">.</span><span class="n">delnum</span> <span class="o">=</span> <span class="n">L</span><span class="p">.</span><span class="n">delnum</span> <span class="o">+</span> <span class="n">R</span><span class="p">.</span><span class="n">delnum</span><span class="p">;</span>
	<span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
<span class="p">}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">pu</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">U</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)],</span> <span class="n">d</span><span class="p">[</span><span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)]);</span> <span class="p">}</span>
<span class="kt">void</span> <span class="n">build_tree</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span><span class="p">(</span><span class="n">w</span><span class="p">[</span><span class="n">s</span><span class="p">],</span> <span class="n">s</span><span class="p">,</span> <span class="n">w</span><span class="p">[</span><span class="n">s</span><span class="p">],</span> <span class="n">s</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
		<span class="k">return</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">mid</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">);</span>
	<span class="n">build_tree</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
	<span class="n">build_tree</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">t</span><span class="p">,</span> <span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
	<span class="n">pu</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">del</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">pos</span><span class="p">,</span> <span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">node</span><span class="p">();</span>
        <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">delnum</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">return</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">mid</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">);</span>
	<span class="k">if</span><span class="p">(</span><span class="n">pos</span> <span class="o">&lt;=</span> <span class="n">m</span><span class="p">)</span>	<span class="n">del</span><span class="p">(</span><span class="n">s</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="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
	<span class="k">else</span>	<span class="n">del</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">t</span><span class="p">,</span> <span class="n">pos</span><span class="p">,</span> <span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
	<span class="n">pu</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">node</span> <span class="n">query</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">,</span> <span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">s</span> <span class="o">&amp;&amp;</span> <span class="n">t</span> <span class="o">&lt;=</span> <span class="n">r</span><span class="p">)</span>	<span class="k">return</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">];</span>
	<span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">mid</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">);</span>
	<span class="n">node</span> <span class="n">ret</span><span class="p">;</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">m</span><span class="p">)</span>	<span class="n">ret</span> <span class="o">=</span> <span class="n">U</span><span class="p">(</span><span class="n">ret</span><span class="p">,</span> <span class="n">query</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)));</span>
	<span class="k">if</span><span class="p">(</span><span class="n">r</span> <span class="o">&gt;</span> <span class="n">m</span><span class="p">)</span>	<span class="n">ret</span> <span class="o">=</span> <span class="n">U</span><span class="p">(</span><span class="n">ret</span><span class="p">,</span> <span class="n">query</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">t</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)));</span>
	<span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">ll</span> <span class="n">solve</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&gt;=</span> <span class="n">r</span><span class="p">)</span>	<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
	<span class="n">node</span> <span class="n">P</span> <span class="o">=</span> <span class="n">query</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">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
	<span class="k">if</span><span class="p">(</span><span class="n">P</span><span class="p">.</span><span class="n">mnpos</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="mi">1</span><span class="p">;</span>
	<span class="k">if</span><span class="p">(</span><span class="n">P</span><span class="p">.</span><span class="n">mn</span> <span class="o">+</span> <span class="n">P</span><span class="p">.</span><span class="n">mx</span> <span class="o">&lt;=</span> <span class="n">W</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">del</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">P</span><span class="p">.</span><span class="n">mnpos</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
		<span class="k">return</span> <span class="n">solve</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">r</span> <span class="o">-</span> <span class="n">l</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">P</span><span class="p">.</span><span class="n">delnum</span><span class="p">)</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="k">else</span>	<span class="k">return</span> <span class="n">solve</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">P</span><span class="p">.</span><span class="n">mxpos</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">solve</span><span class="p">(</span><span class="n">P</span><span class="p">.</span><span class="n">mxpos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">W</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">w</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<span class="n">build_tree</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="mi">1</span><span class="p">);</span>
	<span class="n">write</span><span class="p">(</span><span class="n">solve</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="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="addition-and-subtraction">Addition and Subtraction</h2>

<p><a href="https://atcoder.jp/contests/arc066/tasks/arc066_c">ARC066C</a></p>

<p>给你一个只包含’+’、’-‘、正整数的式子，你需要在式子中添加一些括号，使运算结果最大，输出最大的结果。</p>

<p>$n\leq 10^5$</p>

<h3 id="题解-4">题解</h3>

<p>考虑贪心。</p>

<p>首先在加号后面添括号是毫无意义的。假设我们现在要在某个减号后面添括号，考虑它的最大贡献。考察一个例子：</p>

\[a_1-a_3+a_4+a_5-a_6+a_7-a_8+a_9\]

<p>我们尝试在第一个负号后面添加括号。</p>

\[a_1-(a_3+a_4+a_5-a_6+a_7-a_8+a_9)\]

<p>这样添加，看来 $a_3,a_4,a_5$ 的贡献只能为负了。但是对于后面的数，我们这样添加括号：</p>

\[a_1-(a_3+a_4+a_5-(a_6+a_7)-(a_8+a_9))\]

<p>所以括号里的第一个负号后面的贡献都能为正。容易发现，这是在第一个负号后添加括号，能得到的最好结果。</p>

<p>那么枚举在第几个负号后面添加减号即可。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ll</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="kt">char</span> <span class="n">c</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">();</span>
	<span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>	<span class="p">{</span> <span class="k">if</span><span class="p">(</span><span class="n">c</span> <span class="o">==</span> <span class="sc">'-'</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 class="n">c</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">();</span> <span class="p">}</span>
	<span class="k">while</span><span class="p">(</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>	<span class="p">{</span> <span class="n">ret</span> <span class="o">=</span> <span class="p">(</span><span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">c</span> <span class="o">^</span> <span class="mi">48</span><span class="p">);</span> <span class="n">c</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">();</span> <span class="p">}</span>
	<span class="k">return</span> <span class="n">ret</span> <span class="o">*</span> <span class="n">w</span><span class="p">;</span>
<span class="p">}</span>
<span class="kr">inline</span> <span class="kt">int</span> <span class="n">readc</span><span class="p">()</span> <span class="p">{</span>
	<span class="kt">char</span> <span class="n">c</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">();</span>
	<span class="k">while</span><span class="p">(</span><span class="n">c</span> <span class="o">!=</span> <span class="sc">'+'</span> <span class="o">&amp;&amp;</span> <span class="n">c</span> <span class="o">!=</span> <span class="sc">'-'</span><span class="p">)</span>	<span class="n">c</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">();</span>
	<span class="k">return</span> <span class="n">c</span> <span class="o">==</span> <span class="sc">'+'</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span>	<span class="n">x</span> <span class="o">=</span> <span class="o">-</span><span class="n">x</span><span class="p">,</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'-'</span><span class="p">);</span>
	<span class="kt">int</span> <span class="n">tp</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="k">do</span> <span class="p">{</span> <span class="n">buf</span><span class="p">[</span><span class="o">++</span><span class="n">tp</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">+</span> <span class="mi">48</span><span class="p">;</span> <span class="n">x</span> <span class="o">/=</span> <span class="mi">10</span><span class="p">;</span> <span class="p">}</span> <span class="k">while</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
	<span class="k">while</span><span class="p">(</span><span class="n">tp</span><span class="p">)</span>	<span class="n">putchar</span><span class="p">(</span><span class="n">buf</span><span class="p">[</span><span class="n">tp</span><span class="o">--</span><span class="p">]);</span>
<span class="p">}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">1e6</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
<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">sub</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">ans</span><span class="p">,</span> <span class="n">sum1</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">sum2</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<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">w</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="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">if</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="n">w</span> <span class="o">=</span> <span class="n">readc</span><span class="p">();</span>
		<span class="n">x</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<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 class="n">sub</span><span class="p">[</span><span class="o">++</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
		<span class="n">sum1</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sum1</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">w</span> <span class="o">*</span> <span class="n">x</span><span class="p">;</span>
		<span class="n">sum2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sum2</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">x</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="n">ans</span> <span class="o">=</span> <span class="n">sum1</span><span class="p">[</span><span class="n">n</span><span class="p">];</span>
	<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">cnt</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">ll</span> <span class="n">A</span> <span class="o">=</span> <span class="n">sum1</span><span class="p">[</span><span class="n">sub</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">ll</span> <span class="n">B</span> <span class="o">=</span> <span class="n">sum2</span><span class="p">[</span><span class="n">sub</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="mi">1</span><span class="p">]</span> <span class="o">-</span> <span class="n">sum2</span><span class="p">[</span><span class="n">sub</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">ll</span> <span class="n">C</span> <span class="o">=</span> <span class="n">sum2</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">-</span> <span class="n">sum2</span><span class="p">[</span><span class="n">sub</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="mi">1</span><span class="p">];</span>
		<span class="n">ans</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">ans</span><span class="p">,</span> <span class="n">A</span> <span class="o">-</span> <span class="n">B</span> <span class="o">+</span> <span class="n">C</span><span class="p">);</span>
	<span class="p">}</span>
	<span class="n">write</span><span class="p">(</span><span class="n">ans</span><span class="p">);</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="rectangle-painting-1">Rectangle Painting 1</h2>

<p><a href="http://codeforces.com/problemset/problem/1198/D">CF1198D</a></p>

<p>给定一个 $n\times n$ 的黑白矩阵，请用价值和最少的一些矩形覆盖所有黑格。</p>

<p>一个矩形的价值是长与宽的最大值。</p>

<p>$1\le n\le 50$</p>

<h3 id="题解-5">题解</h3>

<p>二维区间 dp。设计状态 $dp_{x,y,X,Y}$ 表示以 $(x,y)$ 为左上角，$(X,Y)$ 为右下角的矩形的答案。</p>

<p>则枚举“断线”，把矩形切成上下/左右两个小矩形，合并答案即可。</p>

<p>具体实现可以记忆化搜索。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">bool</span> <span class="n">readc</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mi">55</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">dp</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">int</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="kt">int</span> <span class="n">X</span><span class="p">,</span> <span class="kt">int</span> <span class="n">Y</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">dp</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">X</span><span class="p">][</span><span class="n">Y</span><span class="p">]</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">dp</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">X</span><span class="p">][</span><span class="n">Y</span><span class="p">];</span>
	<span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">X</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">Y</span> <span class="o">-</span> <span class="n">y</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
	<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">x</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">X</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span>
		<span class="n">res</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">dfs</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">Y</span><span class="p">)</span> <span class="o">+</span> <span class="n">dfs</span><span class="p">(</span><span class="n">k</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="n">X</span><span class="p">,</span> <span class="n">Y</span><span class="p">));</span>
	<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">y</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;</span> <span class="n">Y</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span>
		<span class="n">res</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">dfs</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">X</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="o">+</span> <span class="n">dfs</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">k</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="k">return</span> <span class="n">dp</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">X</span><span class="p">][</span><span class="n">Y</span><span class="p">]</span> <span class="o">=</span> <span class="n">res</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<span class="n">memset</span><span class="p">(</span><span class="n">dp</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">dp</span><span class="p">));</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span>
		<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="n">j</span><span class="o">++</span><span class="p">)</span>
			<span class="n">dp</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">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">readc</span><span class="p">();</span>			
	<span class="n">write</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="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">n</span><span class="p">)),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="abc139e-league">[ABC139E] League</h2>

<p><a href="https://www.luogu.com.cn/remoteJudgeRedirect/atcoder/abc139_e">ABC139E</a></p>

<p>$n$ 个人，每两个人之间都有一场比赛，故共 $\frac {n(n -1)} {2}$ 场比赛。</p>

<p>每个人都有自己想要的比赛顺序。例如 $x$ 要求按顺序与 $a_{x,1},a_{x,2},\cdots a_{x,n-1}$ 比赛。而且每个人每天只可以比一场比赛。</p>

<p>问最少比赛的天数为多少。若无解，输出 $-1$ 。</p>

<p>$n \leq 1000$</p>

<h3 id="题解-6">题解</h3>

<p>因为每个人都只能取当前的对手进行比赛，所以要让每一天都减少至少一场比赛，我们必须让每一天能安排的比赛都安排上。</p>

<p>所以暴力枚举每一天，考察每个元素是否满足比赛条件，即当前其对手的对手是自己。时间复杂度 $\mathcal{O}(n^3)$ 。</p>

<p>考虑优化。我们枚举到第 $i$ 天时，不需要枚举所有元素。这是因为考虑第 $i-1$ 天已经把能安排的比赛全安排完了，那现在能安排的比赛，必然要从前一天安排过的人中产生，因为只有他们的当前对手更新了。</p>

<p>这样，设每一轮安排了 $p$ 场比赛，则共有 $\mathcal{O}(\frac{n^2}{p})$ 轮。每一场的枚举也只有 $\mathcal{O}(p)$ 的复杂度。则时间复杂度为 $\mathcal{O}(n^2)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mi">1005</span><span class="p">;</span>
<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">cntt</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">lst</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">p</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">ban</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</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="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<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="n">j</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">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<span class="n">p</span><span class="p">[</span><span class="o">++</span><span class="n">cntt</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
	<span class="p">}</span>
	<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">1</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;=</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="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</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="kt">bool</span> <span class="n">flag</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
		<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="n">cntt</span><span class="p">;</span> <span class="n">c</span><span class="o">++</span><span class="p">)</span>
			<span class="n">ban</span><span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="n">c</span><span class="p">]]</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>
		<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="n">cntt</span><span class="p">;</span> <span class="n">c</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">p</span><span class="p">[</span><span class="n">c</span><span class="p">];</span>
			<span class="kt">int</span> <span class="n">aim</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">a</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="k">if</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="mi">0</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">n</span> <span class="o">||</span> <span class="n">a</span><span class="p">[</span><span class="n">aim</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">n</span> <span class="o">||</span> <span class="n">ban</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">||</span> <span class="n">ban</span><span class="p">[</span><span class="n">aim</span><span class="p">])</span>	<span class="k">continue</span><span class="p">;</span>
			<span class="k">if</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">aim</span><span class="p">][</span><span class="n">a</span><span class="p">[</span><span class="n">aim</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="p">{</span>
				<span class="n">a</span><span class="p">[</span><span class="n">aim</span><span class="p">][</span><span class="mi">0</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="mi">0</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
				<span class="n">lst</span><span class="p">[</span><span class="o">++</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
				<span class="n">lst</span><span class="p">[</span><span class="o">++</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">aim</span><span class="p">;</span>
				<span class="n">ban</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">ban</span><span class="p">[</span><span class="n">aim</span><span class="p">]</span> <span class="o">=</span> <span class="n">flag</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span> 
			<span class="p">}</span>
		<span class="p">}</span>
		<span class="n">cntt</span> <span class="o">=</span> <span class="n">cnt</span><span class="p">;</span>
		<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">c</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="n">cnt</span><span class="p">;</span> <span class="n">c</span><span class="o">++</span><span class="p">)</span> 
			<span class="n">p</span><span class="p">[</span><span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="n">lst</span><span class="p">[</span><span class="n">c</span><span class="p">];</span>
		<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">flag</span><span class="p">)</span> <span class="p">{</span>
			<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="n">i</span><span class="o">++</span><span class="p">)</span>
				<span class="k">if</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="mi">0</span><span class="p">]</span> <span class="o">!=</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
					<span class="n">write</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
					<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
				<span class="p">}</span>
			<span class="n">write</span><span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
			<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
		<span class="p">}</span>
	<span class="p">}</span>
	<span class="n">write</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="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="jsoi2007-建筑抢修">[JSOI2007] 建筑抢修</h2>

<p><a href="https://www.luogu.com.cn/problem/P4053">洛谷 P4053</a></p>

<p>$N$ 个任务，每个任务有耗时 $T_1$ 和截止时间 $T_2$。同时最多只能做一个任务。求最多能安排几个任务。</p>

<p>$1 \le N &lt; 150000$，$1 \le T_1 &lt; T_2 &lt; 2^{31}$。</p>

<h3 id="题解-7">题解</h3>

<p>反悔贪心。</p>

<p>我们按截止时间将任务排序，逐渐加入答案。如果当前任务直接接着当前的答案做可以完成，则直接加进去。否则，从答案中找到耗时最长的任务，比较一下它的耗时与当前任务的耗时。如果当前任务耗时更短，则用当前任务替换耗时最长的任务，这样一定更优，因为给之后的任务留了更多时间。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mi">150000</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">n</span><span class="p">;</span>
<span class="n">ll</span> <span class="n">lt</span><span class="p">;</span>
<span class="k">struct</span> <span class="nc">task</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">time</span><span class="p">,</span> <span class="n">ddl</span><span class="p">;</span>
<span class="p">}</span> <span class="n">a</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">priority_queue</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">pq</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <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="n">i</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">time</span> <span class="o">=</span> <span class="n">read</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">ddl</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <span class="n">sort</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="n">a</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="p">[](</span><span class="n">task</span> <span class="n">lhs</span><span class="p">,</span> <span class="n">task</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">ddl</span> <span class="o">&lt;</span> <span class="n">rhs</span><span class="p">.</span><span class="n">ddl</span><span class="p">;</span> <span class="p">});</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</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">time</span> <span class="o">+</span> <span class="n">lt</span> <span class="o">&lt;=</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">ddl</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">pq</span><span class="p">.</span><span class="n">push</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">time</span><span class="p">);</span>
            <span class="n">lt</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">time</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">else</span> <span class="k">if</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">time</span> <span class="o">&lt;</span> <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">())</span> <span class="p">{</span>
            <span class="n">lt</span> <span class="o">-=</span> <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">();</span>
            <span class="n">pq</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
            <span class="n">lt</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">time</span><span class="p">;</span>
            <span class="n">pq</span><span class="p">.</span><span class="n">push</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">time</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">write</span><span class="p">(</span><span class="n">pq</span><span class="p">.</span><span class="n">size</span><span class="p">());</span>
    <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="字符串">字符串</h2>

<p>给定两个由小写字母组成的字符串 $s,t$，你可以对 $s$ 进行以下四种操作：</p>

<ol>
  <li>
    <p>在任意位置添加任意一个字母，代价为 $a$。</p>
  </li>
  <li>
    <p>删除任意一个字母，代价为 $b$。</p>
  </li>
  <li>
    <p>替换任意一个字母，代价为 $c$。</p>
  </li>
  <li>
    <p>交换相邻两个字母，代价为 $d$。</p>
  </li>
</ol>

<p>你需要求出将 $s$ 变为 $t$ 的最小代价。</p>

<table>
  <tbody>
    <tr>
      <td>$</td>
      <td>s</td>
      <td>,</td>
      <td>t</td>
      <td>\leq 4000 ,0 &lt; a,b,c,d\leq 10000，a+b \leq 2d$</td>
    </tr>
  </tbody>
</table>

<h3 id="题解-8">题解</h3>

<p>首先对于前三个操作，就是经典的编辑距离问题，可以用类似 LCS 的 $\mathcal{O}(n^2)$ 的字符串 dp 解决。即设计状态 $f(i,j)$ 表示 $s_{1\cdots i}$ 变为 $t_{1\cdots j}$ 的最小代价，显然有如下几种情况：</p>

<ol>
  <li>
    <p>添加一个字母 $t_j$，则 $f(i,j)=f(i - 1,j) + b$。</p>
  </li>
  <li>
    <p>删除一个字母 $s_i$，则 $f(i,j)=f(i,j - 1) + a$。</p>
  </li>
  <li>
    <p>把 $s_i$ 替换成 $t_j$，则 $f(i,j) = f(i-1,j-1)+c\times [s_i\neq t_j]$。</p>
  </li>
</ol>

<p>考虑操作 $4$，我们发现「删除一次并添加一次」可以等效代替「交换两个字母」，并且数据范围中限制了 $a+b\leq 2d$，那么这告诉我们，交换操作多于一次是不优的。</p>

<p>我们还能推出，「交换后替换」是不优的。因为这也可以被「删除一次并添加一次」等效代替。</p>

<p>所以有这个限制，转移就变得简单很多了。我们找到 $s$ 中前一个 $t_j$ 的位置 $k$ 和 $t$ 中前一个 $s_i$  的位置 $l$，则有这样一个转移：</p>

\[f(i,j) = f(k-1,l-1) + d+ (i-k-1)\times b + (j-l-1)\times a\]

<p>预处理一下 $k$ 和 $l$ 即可。时间复杂度 $\mathcal{O}(n^2)$</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ll</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="kt">char</span> <span class="n">c</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">();</span>
	<span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>	<span class="p">{</span> <span class="k">if</span><span class="p">(</span><span class="n">c</span> <span class="o">==</span> <span class="sc">'-'</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 class="n">c</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">();</span> <span class="p">}</span>
	<span class="k">while</span><span class="p">(</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span>	<span class="p">{</span> <span class="n">ret</span> <span class="o">=</span> <span class="p">(</span><span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">ret</span> <span class="o">&lt;&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">c</span> <span class="o">^</span> <span class="mi">48</span><span class="p">);</span> <span class="n">c</span> <span class="o">=</span> <span class="n">getchar</span><span class="p">();</span> <span class="p">}</span>
	<span class="k">return</span> <span class="n">ret</span> <span class="o">*</span> <span class="n">w</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span>	<span class="n">x</span> <span class="o">=</span> <span class="o">-</span><span class="n">x</span><span class="p">,</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'-'</span><span class="p">);</span>
	<span class="kt">int</span> <span class="n">tp</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="k">do</span> <span class="p">{</span> <span class="n">buf</span><span class="p">[</span><span class="o">++</span><span class="n">tp</span><span class="p">]</span> <span class="o">=</span> <span class="n">x</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">+</span> <span class="mi">48</span><span class="p">;</span> <span class="n">x</span> <span class="o">/=</span> <span class="mi">10</span><span class="p">;</span> <span class="p">}</span> <span class="k">while</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="p">;</span>
	<span class="k">while</span><span class="p">(</span><span class="n">tp</span><span class="p">)</span>	<span class="n">putchar</span><span class="p">(</span><span class="n">buf</span><span class="p">[</span><span class="n">tp</span><span class="o">--</span><span class="p">]);</span>
<span class="p">}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mi">4000</span><span class="p">;</span>
<span class="n">ll</span> <span class="n">dp</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_N</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">c</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">lst</span><span class="p">[</span><span class="mi">27</span><span class="p">],</span> <span class="n">K</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="mi">27</span><span class="p">],</span> <span class="n">L</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="mi">27</span><span class="p">];</span>
<span class="kt">char</span> <span class="n">s</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">t</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">memset</span><span class="p">(</span><span class="n">dp</span><span class="p">,</span> <span class="mi">127</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">dp</span><span class="p">));</span>
	<span class="n">a</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">b</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">c</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">d</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<span class="n">scanf</span><span class="p">(</span><span class="s">"%s%s"</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="n">t</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
	<span class="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">strlen</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="n">m</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">t</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
	
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">dp</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="n">i</span> <span class="o">*</span> <span class="n">b</span><span class="p">;</span>
		<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">p</span> <span class="o">&lt;</span> <span class="mi">27</span><span class="p">;</span> <span class="n">p</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="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">lst</span><span class="p">[</span><span class="n">p</span><span class="p">];</span>
		<span class="n">lst</span><span class="p">[</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">'a'</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
	<span class="p">}</span>
	<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">27</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">lst</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 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="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">dp</span><span class="p">[</span><span class="mi">0</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="o">*</span> <span class="n">a</span><span class="p">;</span>
		<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">p</span> <span class="o">&lt;</span> <span class="mi">27</span><span class="p">;</span> <span class="n">p</span><span class="o">++</span><span class="p">)</span>
			<span class="n">L</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">lst</span><span class="p">[</span><span class="n">p</span><span class="p">];</span>
		<span class="n">lst</span><span class="p">[</span><span class="n">t</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">]</span> <span class="o">=</span> <span class="n">j</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="n">dp</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="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="n">i</span><span class="o">++</span><span class="p">)</span>
		<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="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
			<span class="k">if</span><span class="p">(</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">t</span><span class="p">[</span><span class="n">j</span><span class="p">])</span>	<span class="n">dp</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">min</span><span class="p">(</span><span class="n">dp</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">dp</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="n">dp</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">min</span><span class="p">(</span><span class="n">dp</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">dp</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">a</span><span class="p">);</span>
			<span class="n">dp</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">min</span><span class="p">(</span><span class="n">dp</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">dp</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 class="o">+</span> <span class="n">b</span><span class="p">);</span>
			<span class="n">dp</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">min</span><span class="p">(</span><span class="n">dp</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">dp</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">c</span><span class="p">);</span>
			<span class="kt">int</span> <span class="n">k</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="n">t</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">],</span> <span class="n">l</span> <span class="o">=</span> <span class="n">L</span><span class="p">[</span><span class="n">j</span><span class="p">][</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">'a'</span><span class="p">];</span>
			<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">k</span> <span class="o">||</span> <span class="o">!</span><span class="n">l</span><span class="p">)</span>	<span class="k">continue</span><span class="p">;</span>
			<span class="n">dp</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">min</span><span class="p">(</span><span class="n">dp</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">dp</span><span class="p">[</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">][</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">d</span> <span class="o">+</span> <span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">b</span> <span class="o">+</span> <span class="p">(</span><span class="n">j</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">a</span><span class="p">);</span>
		<span class="p">}</span>	
	<span class="n">write</span><span class="p">(</span><span class="n">dp</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">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="groceries-in-meteor-town">Groceries in Meteor Town</h2>

<p><a href="https://www.luogu.com.cn/problem/CF1628E">CF1628E</a></p>

<p>给定 $n$ 个点的树，起初每个节点都是黑色，有 $q$ 次操作，操作共三种：</p>

<ol>
  <li>
    <p>把下标为 $[l,r]$ 的点染成白色；</p>
  </li>
  <li>
    <p>把下标为 $[l,r]$ 的点染成黑色；</p>
  </li>
  <li>
    <p>询问从节点 $x$ 出发到达任意一个白色节点的简单路径上经过的边，最大可能的权值。不存在则输出 $-1$.</p>
  </li>
</ol>

<p>$n,q \leq 3\times 10^5$</p>

<h3 id="题解-9">题解</h3>

<p>询问操作其实就是询问树上的瓶颈路，这个我们可以用 kruskal 重构树来做，所以 $x$ 到所有白色节点的路径上最大值就是 kruskal 重构树上 $x$ 与所有白色节点的 LCA 的权值。</p>

<p>然后考虑一个套路：树上一个点集的 LCA 为其中 dfs 序最大的点和 dfs 序最小的点的 LCA。所以我们用线段树维护一下白色节点中 dfs 序的最大值和最小值即可。</p>

<p>注意区间推平操作，我们可以维护两组最值。一个是不考虑黑白的，维护区间所有节点 dfs 序的最值 $A$；另一个是考虑黑白的，维护区间白色节点 dfs 序的最值 $V$。这样区间操作我们只需要 $V\gets A$ 或 $V\gets (\inf, -\inf)$即可。</p>

<p>接下来套一个倍增 LCA 就做完了。时间复杂度 $\mathcal{O}(n\log n)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb emplace_back
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">6e5</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="n">MAX_LOG</span> <span class="o">=</span> <span class="mi">20</span><span class="p">,</span> <span class="n">INF</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">30</span><span class="p">);</span>
<span class="k">const</span> <span class="n">pii</span> <span class="n">ORI</span> <span class="o">=</span> <span class="n">make_pair</span><span class="p">(</span><span class="n">INF</span><span class="p">,</span> <span class="o">-</span><span class="n">INF</span><span class="p">);</span>
<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">tot</span><span class="p">,</span> <span class="n">dfncnt</span><span class="p">,</span> <span class="n">log_2</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">id</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">dfn</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">val</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">fa</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_LOG</span><span class="p">],</span> <span class="n">dep</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">K</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="k">struct</span> <span class="nc">edge</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">;</span>
	<span class="n">edge</span><span class="p">(</span><span class="kt">int</span> <span class="n">_u</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_v</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_w</span> <span class="o">=</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">_u</span><span class="p">),</span> <span class="n">v</span><span class="p">(</span><span class="n">_v</span><span class="p">),</span> <span class="n">w</span><span class="p">(</span><span class="n">_w</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</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">edge</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="n">w</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">.</span><span class="n">w</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span> <span class="n">E</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="k">struct</span> <span class="nc">dsu</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">fa</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
	<span class="n">dsu</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <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="n">i</span><span class="o">++</span><span class="p">)</span>	<span class="n">fa</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="p">}</span>
	<span class="kr">inline</span> <span class="kt">int</span> <span class="n">find</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">?</span> <span class="n">x</span> <span class="o">:</span> <span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">]));}</span>
<span class="p">};</span>
<span class="k">struct</span> <span class="nc">node</span> <span class="p">{</span>
	<span class="n">pii</span> <span class="n">V</span><span class="p">,</span> <span class="n">A</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">tag</span><span class="p">;</span>
	<span class="n">node</span><span class="p">(</span><span class="n">pii</span> <span class="n">_V</span> <span class="o">=</span> <span class="n">ORI</span><span class="p">,</span> <span class="n">pii</span> <span class="n">_A</span> <span class="o">=</span> <span class="n">ORI</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_tag</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">:</span>
		<span class="n">V</span><span class="p">(</span><span class="n">_V</span><span class="p">),</span> <span class="n">A</span><span class="p">(</span><span class="n">_A</span><span class="p">),</span> <span class="n">tag</span><span class="p">(</span><span class="n">_tag</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
<span class="p">}</span> <span class="n">d</span><span class="p">[</span><span class="n">MAX_N</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span><span class="p">];</span>

<span class="kt">void</span> <span class="n">kruskal</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">sort</span><span class="p">(</span><span class="n">E</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">E</span> <span class="o">+</span> <span class="n">n</span><span class="p">);</span>
	<span class="n">dsu</span> <span class="n">D</span> <span class="o">=</span> <span class="n">dsu</span><span class="p">(</span><span class="n">n</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">);</span>
	<span class="kt">int</span> <span class="n">ecnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="n">tot</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">;</span>
		<span class="kt">int</span> <span class="n">fu</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">u</span><span class="p">),</span> <span class="n">fv</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
		<span class="k">if</span><span class="p">(</span><span class="n">fu</span> <span class="o">==</span> <span class="n">fv</span><span class="p">)</span>	<span class="k">continue</span><span class="p">;</span>
		<span class="kt">int</span> <span class="n">now</span> <span class="o">=</span> <span class="o">++</span><span class="n">tot</span><span class="p">;</span>
		<span class="n">val</span><span class="p">[</span><span class="n">now</span><span class="p">]</span> <span class="o">=</span> <span class="n">w</span><span class="p">;</span>
		<span class="n">K</span><span class="p">[</span><span class="n">now</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">fu</span><span class="p">),</span> <span class="n">K</span><span class="p">[</span><span class="n">now</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">fv</span><span class="p">);</span>
		<span class="n">D</span><span class="p">.</span><span class="n">fa</span><span class="p">[</span><span class="n">fu</span><span class="p">]</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">fa</span><span class="p">[</span><span class="n">fv</span><span class="p">]</span> <span class="o">=</span> <span class="n">now</span><span class="p">;</span>
		<span class="k">if</span><span class="p">(</span><span class="o">++</span><span class="n">ecnt</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="k">return</span><span class="p">;</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">dfsk</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">pre</span><span class="p">)</span> <span class="p">{</span>
	<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">dfncnt</span><span class="p">,</span> <span class="n">id</span><span class="p">[</span><span class="n">dfncnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">;</span>
	<span class="n">fa</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="n">pre</span><span class="p">,</span> <span class="n">dep</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">dep</span><span class="p">[</span><span class="n">pre</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
	<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">MAX_LOG</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">fa</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">fa</span><span class="p">[</span><span class="n">fa</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 class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">v</span> <span class="o">:</span> <span class="n">K</span><span class="p">[</span><span class="n">u</span><span class="p">])</span>
		<span class="n">dfsk</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">u</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">init_log2</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">log_2</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="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="p">(</span><span class="n">n</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">);</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">log_2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">log_2</span><span class="p">[</span><span class="n">i</span> <span class="o">&gt;&gt;</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="p">}</span>

<span class="kt">int</span> <span class="n">lca</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">dep</span><span class="p">[</span><span class="n">y</span><span class="p">])</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 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">log_2</span><span class="p">[</span><span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">]];</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span>
		<span class="k">if</span><span class="p">(</span><span class="n">fa</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">&amp;&amp;</span> <span class="n">dep</span><span class="p">[</span><span class="n">fa</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">&gt;=</span> <span class="n">dep</span><span class="p">[</span><span class="n">y</span><span class="p">])</span>	<span class="n">x</span> <span class="o">=</span> <span class="n">fa</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="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="n">y</span><span class="p">)</span>	<span class="k">return</span> <span class="n">x</span><span class="p">;</span>
	<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">log_2</span><span class="p">[</span><span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">]];</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span>
		<span class="k">if</span><span class="p">(</span><span class="n">fa</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">&amp;&amp;</span> <span class="n">fa</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">&amp;&amp;</span> <span class="n">fa</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">fa</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="o">=</span> <span class="n">fa</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="o">=</span> <span class="n">fa</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="k">return</span> <span class="n">fa</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="p">}</span>

<span class="kr">inline</span> <span class="kt">int</span> <span class="n">lc</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">p</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
<span class="kr">inline</span> <span class="kt">int</span> <span class="n">rc</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">p</span> <span class="o">&lt;&lt;</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="p">}</span>
<span class="kr">inline</span> <span class="kt">int</span> <span class="n">mid</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">s</span> <span class="o">+</span> <span class="p">((</span><span class="n">t</span> <span class="o">-</span> <span class="n">s</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
<span class="kr">inline</span> <span class="n">pii</span> <span class="n">U</span><span class="p">(</span><span class="n">pii</span> <span class="n">x</span><span class="p">,</span> <span class="n">pii</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">make_pair</span><span class="p">(</span><span class="n">min</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">max</span><span class="p">(</span><span class="n">x</span><span class="p">.</span><span class="n">second</span><span class="p">,</span> <span class="n">y</span><span class="p">.</span><span class="n">second</span><span class="p">));</span> <span class="p">}</span>
<span class="kr">inline</span> <span class="n">node</span> <span class="n">change</span><span class="p">(</span><span class="n">node</span> <span class="n">now</span><span class="p">,</span> <span class="kt">int</span> <span class="n">type</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">type</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>	<span class="n">now</span><span class="p">.</span><span class="n">V</span> <span class="o">=</span> <span class="n">now</span><span class="p">.</span><span class="n">A</span><span class="p">;</span>
	<span class="k">if</span><span class="p">(</span><span class="n">type</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span>	<span class="n">now</span><span class="p">.</span><span class="n">V</span> <span class="o">=</span> <span class="n">ORI</span><span class="p">;</span>
	<span class="n">now</span><span class="p">.</span><span class="n">tag</span> <span class="o">=</span> <span class="n">type</span><span class="p">;</span>	
	<span class="k">return</span> <span class="n">now</span><span class="p">;</span>
<span class="p">}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">pd</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">d</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="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">d</span><span class="p">[</span><span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)]</span> <span class="o">=</span> <span class="n">change</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)],</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">);</span>
		<span class="n">d</span><span class="p">[</span><span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)]</span> <span class="o">=</span> <span class="n">change</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)],</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">);</span>
		<span class="n">d</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="o">-</span><span class="mi">1</span><span class="p">;</span>
	<span class="p">}</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">build_tree</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="n">t</span><span class="p">)</span>	<span class="p">{</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">A</span> <span class="o">=</span> <span class="n">make_pair</span><span class="p">(</span><span class="n">dfn</span><span class="p">[</span><span class="n">s</span><span class="p">],</span> <span class="n">dfn</span><span class="p">[</span><span class="n">s</span><span class="p">]);</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
	<span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">mid</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">);</span>
	<span class="n">build_tree</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
	<span class="n">build_tree</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">t</span><span class="p">,</span> <span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span> 
	<span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">A</span> <span class="o">=</span> <span class="n">U</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="n">lc</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">d</span><span class="p">[</span><span class="n">rc</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="p">}</span>
<span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">,</span> <span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="kt">int</span> <span class="n">type</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">s</span> <span class="o">&amp;&amp;</span> <span class="n">t</span> <span class="o">&lt;=</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">]</span> <span class="o">=</span> <span class="n">change</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">],</span> <span class="n">type</span><span class="p">);</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
	<span class="n">pd</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
	<span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">mid</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">);</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">m</span><span class="p">)</span>	<span class="n">update</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">s</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">type</span><span class="p">);</span>
	<span class="k">if</span><span class="p">(</span><span class="n">r</span> <span class="o">&gt;</span> <span class="n">m</span><span class="p">)</span>	<span class="n">update</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</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">t</span><span class="p">,</span> <span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">type</span><span class="p">);</span>
	<span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">V</span> <span class="o">=</span> <span class="n">U</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">V</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">V</span><span class="p">);</span>
<span class="p">}</span>


<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">q</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">v</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">w</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">edge</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">w</span><span class="p">);</span>
	<span class="p">}</span>
	<span class="n">kruskal</span><span class="p">();</span>
	<span class="n">dfsk</span><span class="p">(</span><span class="n">tot</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
	<span class="n">build_tree</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="mi">1</span><span class="p">);</span>
	<span class="n">init_log2</span><span class="p">();</span>
	<span class="k">while</span><span class="p">(</span><span class="n">q</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">t</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<span class="k">if</span><span class="p">(</span><span class="n">t</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">l</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">r</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
			<span class="n">update</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</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="mi">1</span><span class="p">,</span> <span class="n">t</span><span class="p">);</span>
		<span class="p">}</span>
		<span class="k">else</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
			<span class="n">pii</span> <span class="n">T</span> <span class="o">=</span> <span class="n">U</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">V</span><span class="p">,</span> <span class="n">make_pair</span><span class="p">(</span><span class="n">dfn</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">dfn</span><span class="p">[</span><span class="n">x</span><span class="p">]));</span>
			<span class="k">if</span><span class="p">(</span><span class="n">T</span><span class="p">.</span><span class="n">first</span> <span class="o">==</span> <span class="n">INF</span> <span class="o">||</span> <span class="p">(</span><span class="n">T</span><span class="p">.</span><span class="n">first</span> <span class="o">==</span> <span class="n">T</span><span class="p">.</span><span class="n">second</span> <span class="o">&amp;&amp;</span> <span class="n">T</span><span class="p">.</span><span class="n">first</span> <span class="o">==</span> <span class="n">dfn</span><span class="p">[</span><span class="n">x</span><span class="p">]))</span>	<span class="n">write</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
			<span class="k">else</span>	<span class="n">write</span><span class="p">(</span><span class="n">val</span><span class="p">[</span><span class="n">lca</span><span class="p">(</span><span class="n">id</span><span class="p">[</span><span class="n">T</span><span class="p">.</span><span class="n">first</span><span class="p">],</span> <span class="n">id</span><span class="p">[</span><span class="n">T</span><span class="p">.</span><span class="n">second</span><span class="p">])]);</span>
			<span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
		<span class="p">}</span>
	<span class="p">}</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span> 

</code></pre></div></div>]]></content><author><name>Joy</name></author><category term="Solution" /><summary type="html"><![CDATA[Note]]></summary></entry><entry><title type="html">OI笔记 | 2023.7-11 做题记录（二）</title><link href="https://joyslog.top/https://joyslog.top/2023/11/15/Note32/" rel="alternate" type="text/html" title="OI笔记 | 2023.7-11 做题记录（二）" /><published>2023-11-15T00:00:00+00:00</published><updated>2023-11-15T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2023/11/15/Note32</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2023/11/15/Note32/"><![CDATA[<ul>
  <li><a href="#k-小值">k 小值</a>
    <ul>
      <li><a href="#题解">题解</a>
        <ul>
          <li><a href="#solution-1">Solution 1</a></li>
          <li><a href="#solution-2">Solution 2</a></li>
        </ul>
      </li>
    </ul>
  </li>
  <li><a href="#usaco09nov-lights-g">[USACO09NOV] Lights G</a>
    <ul>
      <li><a href="#题解-1">题解</a></li>
    </ul>
  </li>
  <li><a href="#usaco18open-talent-show-g">[USACO18OPEN] Talent Show G</a>
    <ul>
      <li><a href="#题解-2">题解</a></li>
    </ul>
  </li>
  <li><a href="#线段树优化建图">线段树优化建图</a>
    <ul>
      <li><a href="#题解-3">题解</a></li>
      <li><a href="#bonus">Bonus</a></li>
    </ul>
  </li>
  <li><a href="#apio2008-免费道路">[APIO2008] 免费道路</a>
    <ul>
      <li><a href="#题解-4">题解</a></li>
    </ul>
  </li>
  <li><a href="#arc126c-maximize-gcd">[ARC126C] Maximize GCD</a>
    <ul>
      <li><a href="#题解-5">题解</a></li>
    </ul>
  </li>
  <li><a href="#二分图完美匹配方案数">二分图完美匹配方案数</a></li>
  <li><a href="#count-bracket-sequences">Count Bracket Sequences</a>
    <ul>
      <li><a href="#题解-6">题解</a></li>
    </ul>
  </li>
  <li><a href="#company">Company</a>
    <ul>
      <li><a href="#题解-7">题解</a></li>
    </ul>
  </li>
  <li><a href="#scoi2016-萌萌哒">[SCOI2016] 萌萌哒</a>
    <ul>
      <li><a href="#题解-8">题解</a></li>
    </ul>
  </li>
</ul>

<h2 id="k-小值">k 小值</h2>

<p>有两个长度为 $n$ 的数组 $a,b$，数组内的元素单调不降。</p>

<p>$q$ 次操作，操作有两种：</p>

<ol>
  <li>
    <p>单点修改：$a_x\gets y$ 或 $b_x\gets y$。保证修改后的数组内的元素仍单调不降。</p>
  </li>
  <li>
    <p>查询：将 $a$ 数组的 $[l_1,r_1]$ 内的元素和 $b$ 数组的 $[l_2, r_2]$ 内的元素合并在一起，查询这些元素的第 $k$ 小值。</p>
  </li>
</ol>

<p>$1\leq n\leq 5\times 10^5, 1\leq q,a_i,b_i\leq 10^6$</p>

<h3 id="题解">题解</h3>

<h4 id="solution-1">Solution 1</h4>

<p>$\mathcal{O}(q\log n\log a_i)$，考虑二分答案 $mid$，在两个数组中二分查找比它小的数有多少个。此方法无法通过本题。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><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">MAX_V</span><span class="p">;</span>
<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="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
  <span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">L</span> <span class="o">+</span> <span class="p">((</span><span class="n">R</span> <span class="o">-</span> <span class="n">L</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span><span class="p">);</span>
  <span class="kt">int</span> <span class="n">pos1</span> <span class="o">=</span> <span class="n">lower_bound</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="n">l1</span><span class="p">,</span> <span class="n">a</span> <span class="o">+</span> <span class="n">r1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="p">)</span> <span class="o">-</span> <span class="n">a</span> <span class="o">-</span> <span class="n">l1</span><span class="p">;</span>
  <span class="kt">int</span> <span class="n">pos2</span> <span class="o">=</span> <span class="n">lower_bound</span><span class="p">(</span><span class="n">b</span> <span class="o">+</span> <span class="n">l2</span><span class="p">,</span> <span class="n">b</span> <span class="o">+</span> <span class="n">r2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">mid</span><span class="p">)</span> <span class="o">-</span> <span class="n">b</span> <span class="o">-</span> <span class="n">l2</span><span class="p">;</span>
  <span class="k">if</span><span class="p">(</span><span class="n">pos1</span> <span class="o">+</span> <span class="n">pos2</span> <span class="o">&gt;=</span> <span class="n">k</span><span class="p">)</span>	<span class="n">R</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
  <span class="k">else</span>	<span class="n">L</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>	
<span class="p">}</span>
</code></pre></div></div>

<h4 id="solution-2">Solution 2</h4>

<p>$\mathcal{O}(q\log n)$，考虑分治（或者说倍增的一种递归实现）。设答案为 $f(l_1,r_1,l_2,r_2,k)$，则我们令 $s=l_1+\lfloor \frac{k}{2}\rfloor -1, t = l_2+\lfloor \frac{k}{2}\rfloor -1$，若 $a_s&lt;b_t$，则 $a_{l_1},a_{l_2},\dots a_{s}$ 都不可能成为答案，所以 $f(l_1,r_1,l_2,r_2,k)=f(s+1,r_1,l_2,r_2,k-(s-l_1+1))$。若 $a_s\geq b_t$ 同理。</p>

<p>每次都可以舍掉其中一个区间的一半，因此时间复杂度可以保证通过本题。递归实现即可，注意边界处理。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">f</span><span class="p">(</span><span class="kt">int</span> <span class="n">l1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">l2</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r2</span><span class="p">,</span> <span class="kt">int</span> <span class="n">k</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l1</span> <span class="o">&gt;</span> <span class="n">r1</span><span class="p">)</span>	<span class="k">return</span> <span class="n">b</span><span class="p">[</span><span class="n">l2</span> <span class="o">+</span> <span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">];</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l2</span> <span class="o">&gt;</span> <span class="n">r2</span><span class="p">)</span>	<span class="k">return</span> <span class="n">a</span><span class="p">[</span><span class="n">l1</span> <span class="o">+</span> <span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">];</span>
	<span class="k">if</span><span class="p">(</span><span class="n">k</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>	<span class="k">return</span> <span class="n">min</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">l1</span><span class="p">],</span> <span class="n">b</span><span class="p">[</span><span class="n">l2</span><span class="p">]);</span>
	<span class="kt">int</span> <span class="n">s</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">l1</span> <span class="o">+</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 class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">r1</span><span class="p">),</span> <span class="n">t</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">l2</span> <span class="o">+</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 class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">r2</span><span class="p">);</span>
	<span class="k">if</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">s</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">[</span><span class="n">t</span><span class="p">])</span>	<span class="k">return</span> <span class="n">f</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="n">r1</span><span class="p">,</span> <span class="n">l2</span><span class="p">,</span> <span class="n">r2</span><span class="p">,</span> <span class="n">k</span> <span class="o">-</span> <span class="p">(</span><span class="n">s</span> <span class="o">-</span> <span class="n">l1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
	<span class="k">else</span>	<span class="k">return</span> <span class="n">f</span><span class="p">(</span><span class="n">l1</span><span class="p">,</span> <span class="n">r1</span><span class="p">,</span> <span class="n">t</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">r2</span><span class="p">,</span> <span class="n">k</span> <span class="o">-</span> <span class="p">(</span><span class="n">t</span> <span class="o">-</span> <span class="n">l2</span> <span class="o">+</span> <span class="mi">1</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="usaco09nov-lights-g">[USACO09NOV] Lights G</h2>

<p><a href="https://www.luogu.com.cn/problem/P2962">洛谷 P2962</a></p>

<p>给出一张 $n$ 个点 $m$ 条边的无向图，每个点的初始状态都为 $0$。</p>

<p>你可以操作任意一个点，操作结束后该点以及所有与该点相邻的点的状态都会改变，由 $0$ 变成 $1$ 或由 $1$ 变成 $0$。</p>

<p>你需要求出最少的操作次数，使得在所有操作完成之后所有 $n$ 个点的状态都是 $1$。</p>

<p>$1\le n\le35,1\le m\le595, 1\le a,b\le n$。</p>

<h3 id="题解-1">题解</h3>

<p>经典开关问题的无向图上版本。</p>

<p>显然可以枚举搜索每个点选不选，也可以高斯消元。</p>

<p>这里我们使用搜索，但是 $2^{35}$ 无法接受，所以可以使用 Meet in the middle 思想，把节点拆成 $1\sim \lfloor \frac{n}{2}\rfloor $ 和 $(\lfloor \frac{n}{2}\rfloor + 1)\sim n$ 两部分，分别进行搜索，并且考虑搜索的同时把两边的状态合并。</p>

<p>时间复杂度 $\mathcal{O}(n2^{\frac{n}{2}})$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mi">40</span><span class="p">;</span>
<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">ans</span><span class="p">;</span>
<span class="n">ll</span> <span class="n">aim</span><span class="p">,</span> <span class="n">v</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">map</span><span class="o">&lt;</span><span class="n">ll</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">step</span><span class="p">;</span>

<span class="kt">void</span> <span class="nf">dfs</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">r</span><span class="p">,</span> <span class="n">ll</span> <span class="n">state</span><span class="p">,</span> <span class="kt">int</span> <span class="n">cnt</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">step</span><span class="p">.</span><span class="n">count</span><span class="p">(</span><span class="n">state</span><span class="p">))</span>	<span class="n">step</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">step</span><span class="p">[</span><span class="n">state</span><span class="p">],</span> <span class="n">cnt</span><span class="p">);</span>
	<span class="k">else</span>	<span class="n">step</span><span class="p">[</span><span class="n">state</span><span class="p">]</span> <span class="o">=</span> <span class="n">cnt</span><span class="p">;</span>
	<span class="k">if</span><span class="p">(</span><span class="n">state</span> <span class="o">==</span> <span class="n">aim</span><span class="p">)</span>	<span class="n">ans</span> <span class="o">=</span> <span class="n">min</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="k">if</span><span class="p">(</span><span class="n">u</span> <span class="o">&gt;</span> <span class="p">(</span><span class="n">n</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">step</span><span class="p">.</span><span class="n">count</span><span class="p">(</span><span class="n">state</span> <span class="o">^</span> <span class="n">aim</span><span class="p">))</span>	<span class="n">ans</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">ans</span><span class="p">,</span> <span class="n">step</span><span class="p">[</span><span class="n">state</span> <span class="o">^</span> <span class="n">aim</span><span class="p">]</span> <span class="o">+</span> <span class="n">cnt</span><span class="p">);</span>
	<span class="k">if</span><span class="p">(</span><span class="n">u</span> <span class="o">&gt;</span> <span class="n">r</span><span class="p">)</span>	<span class="k">return</span><span class="p">;</span>
	<span class="n">dfs</span><span class="p">(</span><span class="n">u</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">state</span><span class="p">,</span> <span class="n">cnt</span><span class="p">);</span>
	<span class="n">dfs</span><span class="p">(</span><span class="n">u</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="p">(</span><span class="n">state</span> <span class="o">^</span> <span class="n">v</span><span class="p">[</span><span class="n">u</span><span class="p">]),</span> <span class="n">cnt</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">m</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<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="n">i</span><span class="o">++</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="o">|=</span> <span class="p">(</span><span class="mi">1ll</span> <span class="o">&lt;&lt;</span> <span class="n">i</span><span class="p">);</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">b</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<span class="n">v</span><span class="p">[</span><span class="n">a</span><span class="p">]</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1ll</span> <span class="o">&lt;&lt;</span> <span class="n">b</span><span class="p">);</span>
		<span class="n">v</span><span class="p">[</span><span class="n">b</span><span class="p">]</span> <span class="o">|=</span> <span class="p">(</span><span class="mi">1ll</span> <span class="o">&lt;&lt;</span> <span class="n">a</span><span class="p">);</span>
	<span class="p">}</span>
	<span class="n">aim</span> <span class="o">=</span> <span class="p">(((</span><span class="mi">1ll</span> <span class="o">&lt;&lt;</span> <span class="n">n</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">),</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">n</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="p">(</span><span class="n">n</span> <span class="o">&gt;&gt;</span> <span class="mi">1</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="n">dfs</span><span class="p">((</span><span class="n">n</span> <span class="o">&gt;&gt;</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">n</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="n">write</span><span class="p">(</span><span class="n">ans</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="usaco18open-talent-show-g">[USACO18OPEN] Talent Show G</h2>

<p><a href="https://www.luogu.com.cn/problem/P4377">洛谷 P4377</a></p>

<p>$n$ 头奶牛，第 $i$ 头奶牛重量为 $w_i$，才艺水平为 $t_i$。</p>

<p>从中选一些参加比赛的奶牛。这些奶牛的总重量至少为 $W$。</p>

<p>最大化选出奶牛的才艺和与重量和的比值。</p>

<p>$1 \leq n \leq 250$，$1 \leq W \leq 1000$，$1 \leq w_i \leq 10^6$，$1 \leq t_i \leq 10^3$。</p>

<h3 id="题解-2">题解</h3>

<p>01分数规划板子。</p>

<p>题意相当于最大化 $\frac{\sum p_i t_i}{\sum p_i w_i}$，其中 $p_i\in \left{ 0,1\right}$。二分答案 $x$，则答案合法，当且仅当 $\frac{\sum p_i t_i}{\sum p_i w_i}&gt; x\iff \sum p_i(t_i-xw_i)&gt;0$。所以转化成选出一些奶牛，重量为 $w_i$，价值为 $t_i-xw_i$，且满足重量和至少为 $W$。跑一个 01 背包即可，则式子左边的最大值为 $dp_{W}$。</p>

<p>时间复杂度 $\mathcal{O}(nW\log W)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mi">255</span><span class="p">,</span> <span class="n">MAX_W</span> <span class="o">=</span> <span class="mi">1005</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">double</span> <span class="n">MAX_ANS</span> <span class="o">=</span> <span class="mf">1e3</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">eps</span> <span class="o">=</span> <span class="mf">1e-4</span><span class="p">,</span> <span class="n">INF</span> <span class="o">=</span> <span class="mf">1e9</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">W</span><span class="p">,</span> <span class="n">w</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">t</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="kt">double</span> <span class="n">dp</span><span class="p">[</span><span class="n">MAX_W</span><span class="p">];</span>

<span class="kt">bool</span> <span class="n">check</span><span class="p">(</span><span class="kt">double</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
	<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">W</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="o">-</span><span class="n">INF</span><span class="p">;</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span>
		<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">W</span><span class="p">;</span> <span class="n">j</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">k</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">W</span><span class="p">,</span> <span class="n">j</span> <span class="o">+</span> <span class="n">w</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
			<span class="n">dp</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="n">dp</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">+</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">x</span> <span class="o">*</span> <span class="n">w</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
		<span class="p">}</span>
	<span class="k">return</span> <span class="n">dp</span><span class="p">[</span><span class="n">W</span><span class="p">]</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">W</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">w</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">read</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">read</span><span class="p">();</span>
	<span class="kt">double</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">MAX_ANS</span><span class="p">;</span>
	<span class="k">while</span><span class="p">(</span><span class="n">r</span> <span class="o">-</span> <span class="n">l</span> <span class="o">&gt;</span> <span class="n">eps</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">double</span> <span class="n">mid</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="mf">0.5</span><span class="p">;</span>
		<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="n">l</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
		<span class="k">else</span>	<span class="n">r</span> <span class="o">=</span> <span class="n">mid</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="n">write</span><span class="p">(</span><span class="kt">int</span><span class="p">(</span><span class="mi">1000</span> <span class="o">*</span> <span class="n">l</span><span class="p">));</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>

</code></pre></div></div>

<h2 id="线段树优化建图">线段树优化建图</h2>

<p><a href="https://www.luogu.com.cn/problem/CF786B">CF786B</a></p>

<p>有一个 $n$ 个点的有向图，初始没有点有连边。</p>

<p>$q$ 次操作，操作有三种：</p>

<p><code class="language-plaintext highlighter-rouge">1 v u w</code>：连边 $(v,u,w)$。</p>

<p><code class="language-plaintext highlighter-rouge">2 v l r w</code>：$\forall \ l\leq u\leq r$，连边 $(v,u,w)$。</p>

<p><code class="language-plaintext highlighter-rouge">3 v l r w</code>：$\forall\ l\leq u\leq r$，连边 $(u,v,w)$。</p>

<p>在所有操作后，求 $s$ 到所有点的最短距离。</p>

<p>$1\leq n,q\leq 10^5, 1\leq w\leq 10^9$</p>

<h3 id="题解-3">题解</h3>

<p>如果暴力建边，时空复杂度无法接受。由于有区间操作，我们可以考虑使用线段树来优化。</p>

<p>我们可以把线段树上的节点纳入原图中考虑，原图中的点 $1\sim n$ 对应线段树的叶子节点，线段树的其他节点对应一些区间。</p>

<p>建立两棵线段树，一个入树，一个出树。对于入树，从左右儿子向父亲连零边；对于出树，从父亲向左右儿子连零边。并且，我们把入树和出树的相同的叶子节点相互连零边。这样以来，最后的最短路就是从 $s$ 对应入树的叶子节点出发，到达出树的叶子节点的距离。</p>

<p>那么操作 $2$ 相当于 $v$ 对应入树的叶子节点向区间 $[l,r]$ 对应出树的节点连边；操作 $3$ 同理。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb emplace_back
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">ll</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">3e6</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="n">DELTA</span> <span class="o">=</span> <span class="mf">5e5</span><span class="p">;</span>
<span class="k">const</span> <span class="n">ll</span> <span class="n">INF</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1ll</span> <span class="o">&lt;&lt;</span> <span class="mi">60</span><span class="p">);</span>
<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">s</span><span class="p">,</span> <span class="n">cnt</span><span class="p">,</span> <span class="n">leaf1</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">leaf2</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">fir</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">vis</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">dis</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="k">struct</span> <span class="nc">edge</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">nxt</span><span class="p">;</span>
	<span class="n">edge</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
	<span class="n">edge</span><span class="p">(</span><span class="kt">int</span> <span class="n">_v</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_w</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_nxt</span><span class="p">)</span> <span class="o">:</span>
		<span class="n">v</span><span class="p">(</span><span class="n">_v</span><span class="p">),</span> <span class="n">w</span><span class="p">(</span><span class="n">_w</span><span class="p">),</span> <span class="n">nxt</span><span class="p">(</span><span class="n">_nxt</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
<span class="p">}</span> <span class="n">e</span><span class="p">[</span><span class="n">MAX_N</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span><span class="p">];</span>

<span class="kt">void</span> <span class="n">AddEdge</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 class="kt">int</span> <span class="n">w</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">e</span><span class="p">[</span><span class="o">++</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">edge</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">fir</span><span class="p">[</span><span class="n">u</span><span class="p">]);</span>
	<span class="n">fir</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">cnt</span><span class="p">;</span>
<span class="p">}</span>

<span class="kr">inline</span> <span class="kt">int</span> <span class="n">lc</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">p</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
<span class="kr">inline</span> <span class="kt">int</span> <span class="n">rc</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">p</span> <span class="o">&lt;&lt;</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="kr">inline</span> <span class="kt">int</span> <span class="n">mid</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">s</span> <span class="o">+</span> <span class="p">((</span><span class="n">t</span> <span class="o">-</span> <span class="n">s</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
<span class="kt">void</span> <span class="n">build_tree</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">leaf1</span><span class="p">[</span><span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">;</span>
		<span class="n">leaf2</span><span class="p">[</span><span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span> <span class="o">+</span> <span class="n">DELTA</span><span class="p">;</span>
		<span class="n">AddEdge</span><span class="p">(</span><span class="n">leaf1</span><span class="p">[</span><span class="n">s</span><span class="p">],</span> <span class="n">leaf2</span><span class="p">[</span><span class="n">s</span><span class="p">],</span> <span class="mi">0</span><span class="p">);</span>
		<span class="n">AddEdge</span><span class="p">(</span><span class="n">leaf2</span><span class="p">[</span><span class="n">s</span><span class="p">],</span> <span class="n">leaf1</span><span class="p">[</span><span class="n">s</span><span class="p">],</span> <span class="mi">0</span><span class="p">);</span>
		<span class="k">return</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">mid</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">);</span>
	<span class="n">AddEdge</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="mi">0</span><span class="p">),</span> <span class="n">AddEdge</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="mi">0</span><span class="p">);</span>
	<span class="n">AddEdge</span><span class="p">(</span><span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="o">+</span> <span class="n">DELTA</span><span class="p">,</span> <span class="n">p</span> <span class="o">+</span> <span class="n">DELTA</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span> <span class="n">AddEdge</span><span class="p">(</span><span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="o">+</span> <span class="n">DELTA</span><span class="p">,</span> <span class="n">p</span> <span class="o">+</span> <span class="n">DELTA</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
	<span class="n">build_tree</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
	<span class="n">build_tree</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">t</span><span class="p">,</span> <span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</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">type</span><span class="p">,</span> <span class="kt">int</span> <span class="n">w</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">s</span> <span class="o">&amp;&amp;</span> <span class="n">t</span> <span class="o">&lt;=</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">if</span><span class="p">(</span><span class="n">type</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span>	<span class="n">AddEdge</span><span class="p">(</span><span class="n">leaf2</span><span class="p">[</span><span class="n">u</span><span class="p">],</span> <span class="n">p</span><span class="p">,</span> <span class="n">w</span><span class="p">);</span>
		<span class="k">else</span>	<span class="n">AddEdge</span><span class="p">(</span><span class="n">p</span> <span class="o">+</span> <span class="n">DELTA</span><span class="p">,</span> <span class="n">leaf1</span><span class="p">[</span><span class="n">u</span><span class="p">],</span> <span class="n">w</span><span class="p">);</span>
		<span class="k">return</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="kt">int</span> <span class="n">m</span> <span class="o">=</span> <span class="n">mid</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">);</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">m</span><span class="p">)</span>	<span class="n">update</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">lc</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="n">r</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">type</span><span class="p">,</span> <span class="n">w</span><span class="p">);</span>
	<span class="k">if</span><span class="p">(</span><span class="n">r</span> <span class="o">&gt;</span> <span class="n">m</span><span class="p">)</span>	<span class="n">update</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">t</span><span class="p">,</span> <span class="n">rc</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="n">r</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">type</span><span class="p">,</span> <span class="n">w</span><span class="p">);</span>
<span class="p">}</span> 

<span class="kt">void</span> <span class="n">dijkstra</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">priority_queue</span><span class="o">&lt;</span><span class="n">pii</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">pii</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">greater</span><span class="o">&lt;</span><span class="n">pii</span><span class="o">&gt;&gt;</span> <span class="n">pq</span><span class="p">;</span>
	<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">MAX_N</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">dis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">INF</span><span class="p">;</span>
	<span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">make_pair</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">s</span><span class="p">));</span>
	<span class="n">dis</span><span class="p">[</span><span class="n">s</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">pq</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">second</span><span class="p">;</span> <span class="n">pq</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
		<span class="k">if</span><span class="p">(</span><span class="n">vis</span><span class="p">[</span><span class="n">u</span><span class="p">])</span>	<span class="k">continue</span><span class="p">;</span>
		<span class="n">vis</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="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">fir</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="n">i</span> <span class="o">=</span> <span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">nxt</span><span class="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">v</span> <span class="o">=</span> <span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">;</span>
			<span class="k">if</span><span class="p">(</span><span class="n">dis</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">+</span> <span class="n">w</span> <span class="o">&lt;</span> <span class="n">dis</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="p">{</span>
				<span class="n">dis</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">dis</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">+</span> <span class="n">w</span><span class="p">;</span>
				<span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">make_pair</span><span class="p">(</span><span class="n">dis</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">v</span><span class="p">));</span>
			<span class="p">}</span>
		<span class="p">}</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">q</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">s</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<span class="n">build_tree</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="mi">1</span><span class="p">);</span>
	<span class="k">while</span><span class="p">(</span><span class="n">q</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">type</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<span class="k">if</span><span class="p">(</span><span class="n">type</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">v</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">u</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">w</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
			<span class="n">AddEdge</span><span class="p">(</span><span class="n">leaf2</span><span class="p">[</span><span class="n">v</span><span class="p">],</span> <span class="n">leaf1</span><span class="p">[</span><span class="n">u</span><span class="p">],</span> <span class="n">w</span><span class="p">);</span>
		<span class="p">}</span>
		<span class="k">else</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">v</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">l</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">r</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">w</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
			<span class="n">update</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="mi">1</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">type</span><span class="p">,</span> <span class="n">w</span><span class="p">);</span>
		<span class="p">}</span>
	<span class="p">}</span>
	<span class="n">dijkstra</span><span class="p">(</span><span class="n">leaf2</span><span class="p">[</span><span class="n">s</span><span class="p">]);</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">write</span><span class="p">(</span><span class="n">dis</span><span class="p">[</span><span class="n">leaf1</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">==</span> <span class="n">INF</span> <span class="o">?</span> <span class="o">-</span><span class="mi">1</span> <span class="o">:</span> <span class="n">dis</span><span class="p">[</span><span class="n">leaf1</span><span class="p">[</span><span class="n">i</span><span class="p">]]),</span> <span class="n">putchar</span><span class="p">(</span><span class="s">" </span><span class="se">\n</span><span class="s">"</span><span class="p">[</span><span class="n">i</span> <span class="o">==</span> <span class="n">n</span><span class="p">]);</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="bonus">Bonus</h3>

<p><a href="https://www.luogu.com.cn/problem/P6348">洛谷 P6348</a>：要求支持区间 $[a,b]$ 向区间 $[c,d]$ 连边。</p>

<p>这个可以通过建两个虚点 $x,y$，然后在入树将 $[a,b]$ 连到 $x$，在出树将 $y$ 连到 $[c,d]$，然后再连边 $(x,y,w)$ 即可。</p>

<h2 id="apio2008-免费道路">[APIO2008] 免费道路</h2>

<p><a href="https://www.luogu.com.cn/problem/P3623">洛谷 P3623</a></p>

<p>有一个 $N$ 个点，$M$ 条边的无向图，边有黑白两种。要求找出原图的一个生成树，使得树上正好有 $K$ 条白边。</p>

<p>$1\leq N\leq 2\times 10^4,1\leq M\leq 10^5, 0\leq K \leq N - 1$</p>

<h3 id="题解-4">题解</h3>

<p>先按黑边优先来排序，跑一遍 Kruskal，求出加入的白边数量的最小值 $p$，以及此时加入了哪些白边。若 $p&gt;K$，则无解。</p>

<p>再跑一遍 Kruskal，这次优先加入那些必须要加的白边，然后再加其他白边直到达到 $K$ 条，其次再加其他黑边。若白边达不到 $K$ 条或加完之后无法形成生成树，则无解。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">1e5</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
<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">k</span><span class="p">,</span> <span class="n">cnt</span><span class="p">,</span> <span class="n">tot</span><span class="p">;</span>
<span class="k">struct</span> <span class="nc">edge</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">;</span> <span class="p">}</span> <span class="n">E</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">ans</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="k">struct</span> <span class="nc">dsu</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">fa</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
	<span class="n">dsu</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
		<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="n">i</span><span class="o">++</span><span class="p">)</span>
			<span class="n">fa</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="p">}</span>
	<span class="kt">int</span> <span class="n">find</span><span class="p">(</span><span class="kt">int</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">fa</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">?</span> <span class="n">x</span> <span class="o">:</span> <span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">]);</span> <span class="p">}</span>
	<span class="kt">bool</span> <span class="n">merge</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">fx</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">x</span><span class="p">),</span> <span class="n">fy</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">y</span><span class="p">);</span>
		<span class="k">if</span><span class="p">(</span><span class="n">fx</span> <span class="o">==</span> <span class="n">fy</span><span class="p">)</span>	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
		<span class="n">fa</span><span class="p">[</span><span class="n">fx</span><span class="p">]</span> <span class="o">=</span> <span class="n">fy</span><span class="p">;</span>
		<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
	<span class="p">}</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="n">solve</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">sort</span><span class="p">(</span><span class="n">E</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">E</span> <span class="o">+</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="p">[](</span><span class="n">edge</span> <span class="n">x</span><span class="p">,</span> <span class="n">edge</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span><span class="p">.</span><span class="n">w</span> <span class="o">&gt;</span> <span class="n">y</span><span class="p">.</span><span class="n">w</span><span class="p">;</span> <span class="p">});</span>
	<span class="n">dsu</span> <span class="n">D</span> <span class="o">=</span> <span class="n">dsu</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">bool</span> <span class="n">f</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">merge</span><span class="p">(</span><span class="n">E</span><span class="p">[</span><span class="n">i</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">i</span><span class="p">].</span><span class="n">v</span><span class="p">);</span> <span class="n">tot</span> <span class="o">+=</span> <span class="n">f</span><span class="p">;</span>
		<span class="k">if</span><span class="p">(</span><span class="n">f</span> <span class="o">&amp;&amp;</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>	<span class="n">cnt</span><span class="o">++</span><span class="p">,</span> <span class="n">E</span><span class="p">[</span><span class="n">i</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 class="p">}</span>
	<span class="k">if</span><span class="p">(</span><span class="n">cnt</span> <span class="o">&gt;</span> <span class="n">k</span> <span class="o">||</span> <span class="n">tot</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="p">{</span> <span class="n">puts</span><span class="p">(</span><span class="s">"no solution"</span><span class="p">);</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
	<span class="n">sort</span><span class="p">(</span><span class="n">E</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">E</span> <span class="o">+</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="p">[](</span><span class="n">edge</span> <span class="n">x</span><span class="p">,</span> <span class="n">edge</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">x</span><span class="p">.</span><span class="n">w</span> <span class="o">&lt;</span> <span class="n">y</span><span class="p">.</span><span class="n">w</span><span class="p">;</span> <span class="p">});</span>
	<span class="n">D</span> <span class="o">=</span> <span class="n">dsu</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
	<span class="n">cnt</span> <span class="o">=</span> <span class="n">tot</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">if</span><span class="p">(</span><span class="n">cnt</span> <span class="o">==</span> <span class="n">k</span> <span class="o">&amp;&amp;</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span>	<span class="k">continue</span><span class="p">;</span>
		<span class="kt">bool</span> <span class="n">f</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">merge</span><span class="p">(</span><span class="n">E</span><span class="p">[</span><span class="n">i</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">i</span><span class="p">].</span><span class="n">v</span><span class="p">);</span>
		<span class="k">if</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>	<span class="n">ans</span><span class="p">[</span><span class="o">++</span><span class="n">tot</span><span class="p">]</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
		<span class="k">if</span><span class="p">(</span><span class="n">f</span> <span class="o">&amp;&amp;</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">)</span>	<span class="n">cnt</span><span class="o">++</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="k">if</span><span class="p">(</span><span class="n">cnt</span> <span class="o">&lt;</span> <span class="n">k</span> <span class="o">||</span> <span class="n">tot</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="p">{</span> <span class="n">puts</span><span class="p">(</span><span class="s">"no solution"</span><span class="p">);</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span>
	<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">tot</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">write</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="n">u</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">' '</span><span class="p">);</span>
		<span class="n">write</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="n">v</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">' '</span><span class="p">);</span>
		<span class="n">write</span><span class="p">(</span><span class="n">max</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="n">w</span><span class="p">,</span> <span class="mi">0</span><span class="p">)),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">m</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">k</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">u</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<span class="n">solve</span><span class="p">();</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="arc126c-maximize-gcd">[ARC126C] Maximize GCD</h2>

<p><a href="https://atcoder.jp/contests/arc126/tasks/arc126_c">ARC126C</a></p>

<p>给定一个序列 $A$，每次操作可以使 $A_i + 1$ （$i \in [1, n]$，$K$ 次操作的 $i$ 可以不同），最多可以做 $K$ 次。问 $\gcd{A_1, A_2, …, A_n}$ 的最大值。</p>

<p>$ 2\leq\ N\leq\ 3\times\ 10^5 , 1\leq\ K\leq\ 10^{18} ,1\ \leq\ A_i\leq\ 3\times\ 10^5 $</p>

<h3 id="题解-5">题解</h3>

<p>设序列 $A$ 中的最大值为 $t$。</p>

<p>当 $K\geq \sum\limits_{i=1}^n (t  - A_i)$ 时，显然我们可以把所有数先加到 $t$，然后把剩下的操作次数平均分给每一个数，得到最大的答案。</p>

<p>否则，答案一定小于 $t$，我们就从 $t$ 到 $1$ 枚举 $ans$，检验它的合法性。要让所有数的 $\gcd$ 等于 $ans$，我们就让每个数加到它以上的最接近的 $ans$ 的倍数，所以需要的最少次数为 $\sum\limits_{i=1}^n (\lceil \frac{A_i}{ans} \rceil\times ans - A_i)$，判断它与 $K$ 的大小关系即可。</p>

<p>考虑加速上面式子的计算。我们发现 $\lceil \frac{A_i}{ans} \rceil$ 的取值是连续的，对于 $A_i\in ((k-1)\cdot ans, k\cdot ans]$，取值均为 $k$。所以把 $A_i$ 按值域分成 $\lceil \frac{t}{ans} \rceil$ 段，每一段的答案为 $k\cdot ans\cdot cnt-sum$，其中 $cnt$ 为区间中 $A_i$ 的数量，$sum$ 为区间中 $A_i$ 的和，这些都可以预处理。</p>

<p>所以最终的时间复杂度为 $\mathcal{O}(n \ln n)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">6e5</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
<span class="n">ll</span> <span class="n">n</span><span class="p">,</span> <span class="n">K</span><span class="p">,</span> <span class="n">delta</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">cnt</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">sum</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">bool</span> <span class="n">check</span><span class="p">(</span><span class="kt">int</span> <span class="n">ans</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">ll</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="n">ll</span> <span class="n">k</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">k</span> <span class="o">&lt;=</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="o">+</span> <span class="n">ans</span><span class="p">)</span> <span class="o">/</span> <span class="n">ans</span><span class="p">;</span> <span class="n">k</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">ll</span> <span class="n">l</span> <span class="o">=</span> <span class="n">ans</span> <span class="o">*</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="n">r</span> <span class="o">=</span> <span class="n">ans</span> <span class="o">*</span> <span class="n">k</span><span class="p">;</span>
        <span class="n">p</span> <span class="o">+=</span> <span class="n">k</span> <span class="o">*</span> <span class="n">ans</span> <span class="o">*</span> <span class="p">(</span><span class="n">cnt</span><span class="p">[</span><span class="n">r</span><span class="p">]</span> <span class="o">-</span> <span class="n">cnt</span><span class="p">[</span><span class="n">l</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">r</span><span class="p">]</span> <span class="o">-</span> <span class="n">sum</span><span class="p">[</span><span class="n">l</span><span class="p">]);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">p</span> <span class="o">&lt;=</span> <span class="n">K</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">K</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <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="n">i</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="o">=</span> <span class="n">read</span><span class="p">();</span>
    <span class="n">sort</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="n">a</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="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="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="n">delta</span> <span class="o">+=</span> <span class="n">a</span><span class="p">[</span><span class="n">n</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="k">if</span><span class="p">(</span><span class="n">delta</span> <span class="o">&lt;=</span> <span class="n">K</span><span class="p">)</span>  <span class="n">write</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="o">+</span> <span class="p">(</span><span class="n">K</span> <span class="o">-</span> <span class="n">delta</span><span class="p">)</span> <span class="o">/</span> <span class="n">n</span><span class="p">);</span>
    <span class="k">else</span> <span class="p">{</span>
        <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="n">i</span><span class="o">++</span><span class="p">)</span>
            <span class="n">cnt</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="p">;</span>
        <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">2</span> <span class="o">*</span> <span class="n">a</span><span class="p">[</span><span class="n">n</span><span class="p">];</span> <span class="n">i</span><span class="o">++</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">cnt</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="n">cnt</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+=</span> <span class="n">cnt</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="kt">int</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">a</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 class="k">for</span><span class="p">(;</span> <span class="n">ans</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">ans</span><span class="o">--</span><span class="p">)</span>
            <span class="k">if</span><span class="p">(</span><span class="n">check</span><span class="p">(</span><span class="n">ans</span><span class="p">))</span>  <span class="k">break</span><span class="p">;</span>
        <span class="n">write</span><span class="p">(</span><span class="n">ans</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="二分图完美匹配方案数">二分图完美匹配方案数</h2>

<p>有一个左部和右部均为 $n$ 个点的二分图，求它的完美匹配方案数。</p>

<p>这个可以状压 dp，设 $dp[i][S]$ 为考虑到左部的第 $i$ 个点，右部的选择情况为状态 $S$ 的方案数。显然 $i=\text{popcount}(S)$，所以可以省略掉第一维。有转移方程如下：</p>

\[dp[S]=\sum dp[S\oplus 2^j]\]

<p>其中 $j$ 为在 $S$ 中选中的右部点，且需要满足 $i$ 和 $j$ 有连边。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
<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="n">i</span><span class="o">++</span><span class="p">)</span>
  <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">n</span><span class="p">;</span> <span class="n">j</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">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
<span class="n">S</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">n</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">dp</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="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">s</span> <span class="o">&lt;=</span> <span class="n">S</span><span class="p">;</span> <span class="n">s</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
  <span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">__builtin_popcount</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
  <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">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
    <span class="k">if</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">j</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="p">((</span><span class="n">s</span> <span class="o">&gt;&gt;</span> <span class="n">j</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">))</span>   <span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">s</span><span class="p">]</span> <span class="o">+=</span> <span class="n">dp</span><span class="p">[</span><span class="n">s</span> <span class="o">^</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">j</span><span class="p">)])</span> <span class="o">%=</span> <span class="n">MOD</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">write</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">S</span><span class="p">]);</span> 
</code></pre></div></div>

<h2 id="count-bracket-sequences">Count Bracket Sequences</h2>

<p><a href="https://atcoder.jp/contests/abc312/tasks/abc312_d">ABC312D</a></p>

<p>给定一个非空字符串包含 <code class="language-plaintext highlighter-rouge">(</code>，<code class="language-plaintext highlighter-rouge">)</code> 和 <code class="language-plaintext highlighter-rouge">?</code>。</p>

<p>其中 <code class="language-plaintext highlighter-rouge">?</code> 需要用 <code class="language-plaintext highlighter-rouge">(</code> 或者 <code class="language-plaintext highlighter-rouge">)</code> 替换掉，求替换后的字符串是合法的括号串的方案数对 $ 998244353$ 取模的值。</p>

<h3 id="题解-6">题解</h3>

<p>对于合法括号序列的判定问题，我们往往将左括号视为 $1$，右括号视为 $-1$，则序列为合法括号序列的充要条件为：</p>

<ol>
  <li>
    <p>序列所有数之和为 $0$。</p>
  </li>
  <li>
    <p>序列的所有前缀和都非负。</p>
  </li>
</ol>

<p>所以考虑 $f_{i,j}$ 表示考虑前 $i$ 个数，前缀和为 $j$ 的方案数。</p>

<p>如果第 $i$ 位是左括号，则 $f_{i,j}=\sum f_{i-1,j-1}$。</p>

<p>如果第 $i$ 位是右括号，则 $f_{i,j}=\sum f_{i-1,j+1}$。</p>

<p>如果第 $i$ 位是问号，则 $f_{i,j}=\sum f_{i-1,j-1} + \sum f_{i-1,j+1}$</p>

<p>时间复杂度：$\mathcal{O}(n^2)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mi">3005</span><span class="p">,</span> <span class="n">MOD</span> <span class="o">=</span> <span class="mi">998244353</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">s</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">dp</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">scanf</span><span class="p">(</span><span class="s">"%s"</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="n">n</span> <span class="o">=</span> <span class="n">strlen</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="n">dp</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">1</span><span class="p">;</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">if</span><span class="p">(</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">'('</span><span class="p">)</span> <span class="p">{</span>
			<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">i</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
				<span class="p">(</span><span class="n">dp</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">dp</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">MOD</span><span class="p">;</span>
		<span class="p">}</span>
		<span class="k">else</span> <span class="k">if</span><span class="p">(</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">')'</span><span class="p">)</span> <span class="p">{</span>
			<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">i</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
				<span class="p">(</span><span class="n">dp</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">dp</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">MOD</span><span class="p">;</span>
		<span class="p">}</span>
		<span class="k">else</span> <span class="p">{</span>
			<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">i</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
				<span class="p">(</span><span class="n">dp</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">dp</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">MOD</span><span class="p">;</span>			
			<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">i</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
				<span class="p">(</span><span class="n">dp</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">dp</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">MOD</span><span class="p">;</span>
		<span class="p">}</span>
	<span class="p">}</span>
	<span class="n">write</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="mi">0</span><span class="p">]);</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="company">Company</h2>

<p><a href="https://codeforces.com/problemset/problem/1062/E">CF1062E</a></p>

<p>给定一颗树，有若干个询问，每个询问给出 $l$，$r$，要求编号为 $l$~$r$ 的点任意删去一个之后剩余点的 LCA 深度最大，输出删去点的编号和 LCA 的最大深度。</p>

<h3 id="题解-7">题解</h3>

<p>经典小 Trick：一个点集内的点的 LCA 为他们之中 dfn 最大和 dfn 最小的点的 LCA。</p>

<p>所以，只有当删的点是 dfn 最大或最小的点时，LCA 才有可能改变。分两类讨论，用 ST 表维护 dfn 序的最大最小值的位置即可。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb emplace_back 
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mi">100005</span><span class="p">,</span> <span class="n">MAX_LOG</span> <span class="o">=</span> <span class="mi">18</span><span class="p">;</span>
<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">dfncnt</span><span class="p">,</span> <span class="n">dep</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">dfn</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">fa</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_LOG</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">log_2</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">stmin</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_LOG</span><span class="p">],</span> <span class="n">stmax</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_LOG</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">G</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">int</span> <span class="n">Min</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">dfn</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">dfn</span><span class="p">[</span><span class="n">y</span><span class="p">]</span> <span class="o">?</span> <span class="n">x</span> <span class="o">:</span> <span class="n">y</span><span class="p">;</span> <span class="p">}</span>
<span class="kt">int</span> <span class="n">Max</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">dfn</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">dfn</span><span class="p">[</span><span class="n">y</span><span class="p">]</span> <span class="o">?</span> <span class="n">x</span> <span class="o">:</span> <span class="n">y</span><span class="p">;</span> <span class="p">}</span>

<span class="kt">int</span> <span class="n">qmin</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">len</span> <span class="o">=</span> <span class="n">log_2</span><span class="p">[</span><span class="n">r</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="k">return</span> <span class="n">Min</span><span class="p">(</span><span class="n">stmin</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">len</span><span class="p">],</span> <span class="n">stmin</span><span class="p">[</span><span class="n">r</span> <span class="o">-</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">len</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="n">len</span><span class="p">]);</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">qmax</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">len</span> <span class="o">=</span> <span class="n">log_2</span><span class="p">[</span><span class="n">r</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="k">return</span> <span class="n">Max</span><span class="p">(</span><span class="n">stmax</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">len</span><span class="p">],</span> <span class="n">stmax</span><span class="p">[</span><span class="n">r</span> <span class="o">-</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">len</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">][</span><span class="n">len</span><span class="p">]);</span>
<span class="p">}</span> 

<span class="kt">void</span> <span class="n">pre</span><span class="p">(</span><span class="kt">int</span> <span class="n">N</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">log_2</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">log_2</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="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">3</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="p">)</span>
		<span class="n">log_2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">log_2</span><span class="p">[</span><span class="n">i</span> <span class="o">&gt;&gt;</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="p">}</span>

<span class="kt">void</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">u</span><span class="p">)</span> <span class="p">{</span>
	<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">dfncnt</span><span class="p">;</span>
	<span class="n">dep</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">dep</span><span class="p">[</span><span class="n">fa</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 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">MAX_LOG</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">fa</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">fa</span><span class="p">[</span><span class="n">fa</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 class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">v</span> <span class="o">:</span> <span class="n">G</span><span class="p">[</span><span class="n">u</span><span class="p">])</span>
		<span class="n">dfs</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">lca</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">x</span> <span class="o">||</span> <span class="o">!</span><span class="n">y</span><span class="p">)</span>	<span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span><span class="p">;</span>
	<span class="k">if</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">dep</span><span class="p">[</span><span class="n">y</span><span class="p">])</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 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">MAX_LOG</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span>
		<span class="k">if</span><span class="p">(</span><span class="n">fa</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">&amp;&amp;</span> <span class="n">dep</span><span class="p">[</span><span class="n">fa</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">&gt;=</span> <span class="n">dep</span><span class="p">[</span><span class="n">y</span><span class="p">])</span>	<span class="n">x</span> <span class="o">=</span> <span class="n">fa</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="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="n">y</span><span class="p">)</span>	<span class="k">return</span> <span class="n">x</span><span class="p">;</span>
	<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">MAX_LOG</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span>
		<span class="k">if</span><span class="p">(</span><span class="n">fa</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">&amp;&amp;</span> <span class="n">fa</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">&amp;&amp;</span> <span class="n">fa</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">fa</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="o">=</span> <span class="n">fa</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="o">=</span> <span class="n">fa</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="k">return</span> <span class="n">fa</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="p">}</span>

<span class="kt">int</span> <span class="n">cal</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">mid</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">lca1</span><span class="p">,</span> <span class="n">lca2</span><span class="p">;</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;</span> <span class="n">mid</span><span class="p">)</span>	<span class="n">lca1</span> <span class="o">=</span> <span class="n">lca</span><span class="p">(</span><span class="n">qmin</span><span class="p">(</span><span class="n">l</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">qmax</span><span class="p">(</span><span class="n">l</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="k">if</span><span class="p">(</span><span class="n">mid</span> <span class="o">&lt;</span> <span class="n">r</span><span class="p">)</span>	<span class="n">lca2</span> <span class="o">=</span> <span class="n">lca</span><span class="p">(</span><span class="n">qmin</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">r</span><span class="p">),</span> <span class="n">qmax</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">r</span><span class="p">));</span>
	<span class="k">if</span><span class="p">(</span><span class="n">mid</span> <span class="o">==</span> <span class="n">r</span><span class="p">)</span>	<span class="k">return</span> <span class="n">lca1</span><span class="p">;</span>
	<span class="k">if</span><span class="p">(</span><span class="n">mid</span> <span class="o">==</span> <span class="n">l</span><span class="p">)</span>	<span class="k">return</span> <span class="n">lca2</span><span class="p">;</span>
	<span class="k">return</span> <span class="n">lca</span><span class="p">(</span><span class="n">lca1</span><span class="p">,</span> <span class="n">lca2</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">q</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<span class="n">pre</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">fa</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="n">read</span><span class="p">();</span> 
		<span class="n">G</span><span class="p">[</span><span class="n">fa</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="n">pb</span><span class="p">(</span><span class="n">i</span><span class="p">);</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="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="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">stmin</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="n">stmax</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="n">i</span><span class="p">;</span> 
	<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">MAX_LOG</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
		<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">+</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">j</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</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="p">)</span> <span class="p">{</span>
			<span class="n">stmin</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">Min</span><span class="p">(</span><span class="n">stmin</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="n">stmin</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</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="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]);</span>
			<span class="n">stmax</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">Max</span><span class="p">(</span><span class="n">stmax</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="n">stmax</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</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="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]);</span>
		<span class="p">}</span>
	<span class="k">while</span><span class="p">(</span><span class="n">q</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">l</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">r</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<span class="kt">int</span> <span class="n">mn</span> <span class="o">=</span> <span class="n">qmin</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">),</span> <span class="n">mx</span> <span class="o">=</span> <span class="n">qmax</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">);</span>
		<span class="kt">int</span> <span class="n">ans1</span> <span class="o">=</span> <span class="n">cal</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">mn</span><span class="p">,</span> <span class="n">r</span><span class="p">),</span> <span class="n">ans2</span> <span class="o">=</span> <span class="n">cal</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">mx</span><span class="p">,</span> <span class="n">r</span><span class="p">);</span>
		<span class="k">if</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">ans1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">dep</span><span class="p">[</span><span class="n">ans2</span><span class="p">])</span>	<span class="n">write</span><span class="p">(</span><span class="n">mn</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">' '</span><span class="p">),</span> <span class="n">write</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">ans1</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
		<span class="k">else</span>	<span class="n">write</span><span class="p">(</span><span class="n">mx</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">' '</span><span class="p">),</span> <span class="n">write</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">ans2</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
		<span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<span class="p">}</span>
<span class="p">}</span>

</code></pre></div></div>

<h2 id="scoi2016-萌萌哒">[SCOI2016] 萌萌哒</h2>

<p>一个长度为 $n$ 的大数，用 $S_1S_2S_3 \cdots S_n$表示，其中 $S_i$ 表示数的第 $i$ 位, $S_1$ 是数的最高位。有 $m$ 个限制条件，每个条件表示为四个数，$l_1,r_1,l_2,r_2$，即两个长度相同的区间，表示子串$S_{l_1}S_{l_1+1}S_{l_1+2} \cdots S_{r_1}$与$S_{l_2}S_{l_2+1}S_{l_2+2} \cdots S_{r_2}$完全相同。</p>

<p>求有多少个满足所有条件的数。</p>

<h3 id="题解-8">题解</h3>

<p>一个朴素的想法是把区间的对应转化为点的对应，然后用并查集把对应的相同的点合并起来，最后答案即为 $9\times 10^{C-1}$，其中 $C$ 为集合个数。</p>

<p>然后你发现集合的合并具有可加性。用倍增的思想，把长为 $L$ 的区间分成若干长度为 $2$ 的幂的区间，创建 $\lfloor \log_2 n\rfloor$ 层并查集，设 $fa(x, k)$ 为以 $x$ 为左端点，长度为 $2^k$ 的区间的那一层并查集的父亲。这样合并就是 $\mathcal{O}(\log n)$ 的。</p>

<p>然后最后我们想看 $k=0$ 的那层并查集有多少个集合，所以下放一下，从第 $k$ 层的对应关系推到第 $k-1$ 层。最后统计答案即可。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb emplace_back 
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">1e5</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="n">MAX_LOG</span> <span class="o">=</span> <span class="mi">17</span><span class="p">,</span> <span class="n">MOD</span> <span class="o">=</span> <span class="mf">1e9</span> <span class="o">+</span> <span class="mi">7</span><span class="p">;</span>
<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">log_2</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">void</span> <span class="n">init_log2</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">log_2</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="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="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="n">log_2</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">log_2</span><span class="p">[</span><span class="n">i</span> <span class="o">&gt;&gt;</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="p">}</span>

<span class="k">struct</span> <span class="nc">dsu</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">fa</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">][</span><span class="n">MAX_LOG</span><span class="p">];</span>
	<span class="n">dsu</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
		<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="n">i</span><span class="o">++</span><span class="p">)</span>
			<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">MAX_LOG</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
				<span class="n">fa</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">i</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="kt">int</span> <span class="n">find</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">k</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">if</span><span class="p">(</span><span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">==</span> <span class="n">x</span><span class="p">)</span>	<span class="k">return</span> <span class="n">x</span><span class="p">;</span>
		<span class="k">return</span> <span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">k</span><span class="p">],</span> <span class="n">k</span><span class="p">);</span>
	<span class="p">}</span> 
	<span class="kt">void</span> <span class="n">merge</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">,</span> <span class="kt">int</span> <span class="n">k</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">fx</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">k</span><span class="p">),</span> <span class="n">fy</span> <span class="o">=</span> <span class="n">find</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">fa</span><span class="p">[</span><span class="n">fx</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">fy</span><span class="p">;</span>
	<span class="p">}</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">m</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<span class="n">init_log2</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
	<span class="n">dsu</span> <span class="n">D</span> <span class="o">=</span> <span class="n">dsu</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">l1</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">r1</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">l2</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">r2</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<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">MAX_LOG</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="mi">0</span><span class="p">;</span> <span class="n">k</span><span class="o">--</span><span class="p">)</span>
			<span class="k">if</span><span class="p">(</span><span class="n">l1</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">k</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">r1</span><span class="p">)</span> <span class="p">{</span>
				<span class="n">D</span><span class="p">.</span><span class="n">merge</span><span class="p">(</span><span class="n">l1</span><span class="p">,</span> <span class="n">l2</span><span class="p">,</span> <span class="n">k</span><span class="p">);</span>
				<span class="n">l1</span> <span class="o">+=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">k</span><span class="p">),</span> <span class="n">l2</span> <span class="o">+=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">k</span><span class="p">);</span>
			<span class="p">}</span>
	<span class="p">}</span>
	<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">MAX_LOG</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="mi">1</span><span class="p">;</span> <span class="n">k</span><span class="o">--</span><span class="p">)</span>
		<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">+</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">k</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</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="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">I</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">find</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="n">D</span><span class="p">.</span><span class="n">merge</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">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="n">D</span><span class="p">.</span><span class="n">merge</span><span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">k</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="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)),</span> <span class="n">k</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
		<span class="p">}</span>
	<span class="n">ll</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
	<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="n">i</span><span class="o">++</span><span class="p">)</span>
		<span class="k">if</span><span class="p">(</span><span class="n">D</span><span class="p">.</span><span class="n">fa</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="n">i</span><span class="p">)</span>	<span class="n">ans</span> <span class="o">=</span> <span class="mi">1ll</span> <span class="o">*</span> <span class="n">ans</span> <span class="o">*</span> <span class="p">(</span><span class="n">ans</span> <span class="o">==</span> <span class="mi">1</span> <span class="o">?</span> <span class="mi">9</span> <span class="o">:</span> <span class="mi">10</span><span class="p">)</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">;</span>
	<span class="n">write</span><span class="p">(</span><span class="n">ans</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Joy</name></author><category term="Solution" /><summary type="html"><![CDATA[Note]]></summary></entry><entry><title type="html">OI笔记 | 2023.7-11 做题记录（三）</title><link href="https://joyslog.top/https://joyslog.top/2023/11/15/Note33/" rel="alternate" type="text/html" title="OI笔记 | 2023.7-11 做题记录（三）" /><published>2023-11-15T00:00:00+00:00</published><updated>2023-11-15T00:00:00+00:00</updated><id>https://joyslog.top/https://joyslog.top/2023/11/15/Note33</id><content type="html" xml:base="https://joyslog.top/https://joyslog.top/2023/11/15/Note33/"><![CDATA[<ul>
  <li><a href="#无不恒">无不恒</a>
    <ul>
      <li><a href="#题解">题解</a></li>
    </ul>
  </li>
  <li><a href="#hnoi2005-狡猾的商人">[HNOI2005] 狡猾的商人</a>
    <ul>
      <li><a href="#题解-1">题解</a></li>
    </ul>
  </li>
  <li><a href="#存储管理">存储管理</a>
    <ul>
      <li><a href="#题解-2">题解</a></li>
    </ul>
  </li>
  <li><a href="#ugu">Ugu</a>
    <ul>
      <li><a href="#solution-1">Solution 1</a></li>
      <li><a href="#solution-2">Solution 2</a></li>
    </ul>
  </li>
  <li><a href="#edges-in-mst">Edges in MST</a>
    <ul>
      <li><a href="#题解-3">题解</a></li>
    </ul>
  </li>
  <li><a href="#饼干">饼干</a>
    <ul>
      <li><a href="#题解-4">题解</a></li>
    </ul>
  </li>
  <li><a href="#noip2020-字符串匹配">[NOIP2020] 字符串匹配</a>
    <ul>
      <li><a href="#题解-5">题解</a></li>
    </ul>
  </li>
</ul>

<h2 id="无不恒">无不恒</h2>

<p>有一个 $n$ 个数的排列 $a$。</p>

<p>$q$ 次操作，每次操作交换 $a$ 中的两个数。</p>

<p>每次操作后，求一个最小的 $k$，使得在把 $a$ 的前 $k$ 个数放到排列末尾之后，$a$ 的逆序对数最大。</p>

<p>$q, n\leq 10^6$</p>

<h3 id="题解">题解</h3>

<p>设当前序列原来的逆序对数为 $x$。我们把序列的开头 $a_1$ 放到序列的最后时，由于有 $a_1-1$ 个数比它小， $n-a_1$ 个数比它大，所以逆序对数的变化量为 $(n-a_1)-(a_1-1)=n+1-2a_1$。</p>

<p>所以我们之后把 $a_2$ 放到末尾，逆序对数的变化量为 $n+1-2a_2$。以此类推，把前 $k$ 个元素放到末尾的逆序对数为 $x +\sum\limits_{i=1}^k (n+1-2a_i)$。这个数最大就是 $(n+1-2a_i)$ 的前缀和最大。</p>

<p>所以我们可以用线段树维护前缀和数组的最大值，交换可以拆成两个原数组的单点修改，即前缀和数组的区间加。</p>

<p>时间复杂度 $\mathcal{O}(n+q\log n)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">1e6</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
<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">ll</span> <span class="n">a</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">sum</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="k">struct</span> <span class="nc">node</span> <span class="p">{</span>
	<span class="n">ll</span> <span class="n">val</span><span class="p">,</span> <span class="n">tag</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">mxpos</span><span class="p">;</span>
<span class="p">}</span> <span class="n">d</span><span class="p">[</span><span class="n">MAX_N</span> <span class="o">&lt;&lt;</span> <span class="mi">2</span><span class="p">];</span>

<span class="kr">inline</span> <span class="kt">int</span> <span class="n">lc</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">p</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
<span class="kr">inline</span> <span class="kt">int</span> <span class="n">rc</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">p</span> <span class="o">&lt;&lt;</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="p">}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">pu</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">val</span> <span class="o">&gt;=</span> <span class="n">d</span><span class="p">[</span><span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">val</span><span class="p">)</span>	<span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">val</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">val</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">mxpos</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">mxpos</span><span class="p">;</span>
	<span class="k">else</span>	<span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">val</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">val</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">mxpos</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">mxpos</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">pd</span><span class="p">(</span><span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">d</span><span class="p">[</span><span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">val</span> <span class="o">+=</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">)].</span><span class="n">val</span> <span class="o">+=</span> <span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">;</span>
		<span class="n">d</span><span class="p">[</span><span class="n">lc</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">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="n">rc</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">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">tag</span><span class="p">;</span>
		<span class="n">d</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="mi">0</span><span class="p">;</span>
	<span class="p">}</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">build_tree</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="n">t</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">val</span> <span class="o">=</span> <span class="n">sum</span><span class="p">[</span><span class="n">s</span><span class="p">];</span>
		<span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">mxpos</span> <span class="o">=</span> <span class="n">s</span><span class="p">;</span>
		<span class="n">d</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="mi">0</span><span class="p">;</span>
		<span class="k">return</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">s</span> <span class="o">+</span> <span class="n">t</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span><span class="p">;</span>
	<span class="n">build_tree</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
	<span class="n">build_tree</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">t</span><span class="p">,</span> <span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">));</span>
	<span class="n">pu</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="kt">int</span> <span class="n">t</span><span class="p">,</span> <span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">,</span> <span class="kt">int</span> <span class="n">p</span><span class="p">,</span> <span class="n">ll</span> <span class="n">D</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">s</span> <span class="o">&amp;&amp;</span> <span class="n">t</span> <span class="o">&lt;=</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">d</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">val</span> <span class="o">+=</span> <span class="n">D</span><span class="p">;</span>
		<span class="n">d</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">D</span><span class="p">;</span>
		<span class="k">return</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="n">pd</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
	<span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="p">(</span><span class="n">s</span> <span class="o">+</span> <span class="n">t</span><span class="p">)</span> <span class="o">&gt;&gt;</span> <span class="mi">1</span><span class="p">;</span>
	<span class="k">if</span><span class="p">(</span><span class="n">l</span> <span class="o">&lt;=</span> <span class="n">mid</span><span class="p">)</span>	<span class="n">update</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">mid</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">lc</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">D</span><span class="p">);</span>
	<span class="k">if</span><span class="p">(</span><span class="n">r</span> <span class="o">&gt;</span> <span class="n">mid</span><span class="p">)</span>	<span class="n">update</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">t</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">,</span> <span class="n">rc</span><span class="p">(</span><span class="n">p</span><span class="p">),</span> <span class="n">D</span><span class="p">);</span>
	<span class="n">pu</span><span class="p">(</span><span class="n">p</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">solve</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">d</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">mxpos</span> <span class="o">==</span> <span class="n">n</span> <span class="o">?</span> <span class="mi">0</span> <span class="o">:</span> <span class="n">d</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">mxpos</span><span class="p">;</span> <span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">q</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<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="n">i</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="o">=</span> <span class="n">read</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">n</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">-</span> <span class="mi">2</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">build_tree</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="mi">1</span><span class="p">);</span>
	<span class="n">write</span><span class="p">(</span><span class="n">solve</span><span class="p">()),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<span class="k">while</span><span class="p">(</span><span class="n">q</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">v</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<span class="n">update</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">u</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">a</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">a</span><span class="p">[</span><span class="n">v</span><span class="p">]);</span>
		<span class="n">update</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">v</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">a</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">*</span> <span class="n">a</span><span class="p">[</span><span class="n">u</span><span class="p">]);</span>
		<span class="n">swap</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">u</span><span class="p">],</span> <span class="n">a</span><span class="p">[</span><span class="n">v</span><span class="p">]);</span>
		<span class="n">write</span><span class="p">(</span><span class="n">solve</span><span class="p">()),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
	<span class="p">}</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="hnoi2005-狡猾的商人">[HNOI2005] 狡猾的商人</h2>

<p><a href="https://www.luogu.com.cn/problem/P2294">洛谷 P2294</a></p>

<p>本题有 $t$ 组数据。</p>

<p>现在有一个长度为 $n$ 的数列 $a_i$，给出 $m$ 个条件，每个条件形如 $(l,r,w)$，表示这个数列满足 $\sum\limits_{i=l}^r a_i = w$。问是否存在满足条件的数列。</p>

<p>$t\leq 100, n\leq 100, m\leq 1000$</p>

<h3 id="题解-1">题解</h3>

<p>考虑前缀和数组 $s_i$，则每个条件等价于 $s_{l-1}+w=s_r$。这个显然可以差分约束，但是这里条件只有等于，所以我们有更简单的做法。若存在条件 $(l,r,w)$，我们则称 $l-1$ 和 $r$ 连通，且它们的距离为 $w$。对于一个连通块，不如直接用 dfs，从连通块中任选一点为原点搜出其他点的距离。接下来只需要枚举所有条件，检验是否满足 $dis_r-dis_{l-1}=w$ 即可。</p>

<p>时间复杂度 $\mathcal{O}(t(m+n))$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
#define pb emplace_back
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">2e5</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">T</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">dis</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="k">struct</span> <span class="nc">qry</span> <span class="p">{</span>
	<span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">;</span>
<span class="p">}</span> <span class="n">Q</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">pii</span><span class="o">&gt;</span> <span class="n">G</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">vis</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">void</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">u</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">for</span><span class="p">(</span><span class="n">pii</span> <span class="n">x</span> <span class="o">:</span> <span class="n">G</span><span class="p">[</span><span class="n">u</span><span class="p">])</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">v</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="n">first</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">x</span><span class="p">.</span><span class="n">second</span><span class="p">;</span>
		<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">vis</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="p">{</span>
			<span class="n">vis</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
			<span class="n">dis</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">=</span> <span class="n">dis</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">+</span> <span class="n">w</span><span class="p">;</span>
			<span class="n">dfs</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
		<span class="p">}</span>
	<span class="p">}</span>	
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">T</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
	<span class="k">while</span><span class="p">(</span><span class="n">T</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">m</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
		<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
			<span class="n">dis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">vis</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 class="n">G</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">clear</span><span class="p">();</span>
		<span class="p">}</span>
		<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">read</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">w</span> <span class="o">=</span> <span class="n">read</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">u</span> <span class="o">=</span> <span class="n">u</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">v</span> <span class="o">=</span> <span class="n">v</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">w</span> <span class="o">=</span> <span class="n">w</span><span class="p">;</span> 
			<span class="n">G</span><span class="p">[</span><span class="n">u</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">make_pair</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">)),</span> <span class="n">G</span><span class="p">[</span><span class="n">v</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">make_pair</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="o">-</span><span class="n">w</span><span class="p">));</span>	
		<span class="p">}</span>
		<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="n">i</span><span class="o">++</span><span class="p">)</span>
			<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">vis</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>	<span class="n">vis</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">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
		<span class="kt">bool</span> <span class="n">flag</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">Q</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">Q</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">Q</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">;</span>
			<span class="k">if</span><span class="p">(</span><span class="n">dis</span><span class="p">[</span><span class="n">v</span><span class="p">]</span> <span class="o">-</span> <span class="n">dis</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">!=</span> <span class="n">w</span><span class="p">)</span> <span class="p">{</span>
				<span class="n">flag</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 class="p">}</span>
		<span class="n">puts</span><span class="p">(</span><span class="n">flag</span> <span class="o">?</span> <span class="s">"true"</span> <span class="o">:</span> <span class="s">"false"</span><span class="p">);</span>
	<span class="p">}</span> 
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="存储管理">存储管理</h2>

<p>小 P 最近参加了华为挑战赛，比赛中题目给定了 $n$ 个不同的元素和 $k$ 个存储位置。</p>

<p>接下来题目给出了一个元素的访问顺序 $a_1, a_2,\dots, a_m$。当一个元素被访问时它必须处于某个存储位置中，同时任意时刻小 P 都可以将某个元素插入到一个空的存储位置中，或者删除一个存储位置上的元素。</p>

<p>最初所有位置都是空的，题目的目标是最小化插入元素的次数。小 P 为了解决这个问题学习了 LRU 算法，即记录下每个存储位置元素的最后一次访问的时刻，随后如果需要删除就删除最后一次访问时刻最小的那个元素。</p>

<p>例如 $n=3, k=2$，且 $a = {1, 2, 3, 2, 1, 2}$，那么在需要访问 $a_1 , a_2$ 直接插入即可；访问 $a_3$ 的时候位置已满，LRU 算法会选择删除 $1$ 这个元素因为它的访问时刻更早，随后插入 $3$；当访问 $a_4$ 的时候可以发现 $2$ 存在于一个位置中所以不用操作；当访问 $a_5$ 的时候需要删除 $3$ 这个元素因为 $2$ 在 $a_4$ 时又被访问了一次,最后一次访问比 $3$ 要更晚，随
后插入 $1$；访问 $a_6$ 时 $2$ 仍在一个位置中，故不用操作。故总插入次数为 $4$。</p>

<p>现在小 P 为了测试 LRU 的效率，它给了你 $n$ 和 $a_1,a_2,\dots,a_m$，希望你对 $k = 1, 2,\dots, n$ 求出答案。</p>

<p>$1\leq n,m\leq 5\times 10^5, 1\leq a_i\leq n$</p>

<h3 id="题解-2">题解</h3>

<p>$\mathcal{O}(n^2)$：用队列模拟即可。</p>

<p>$\mathcal{O}(m\log n)$：考虑一个数 $a_i$ 可以对什么样的 $k$ 造成贡献。如果 $a_i$ 已经在一个位置中，而且在上一次到现在的时间内没有被换掉，则不需要插入，也就不会造成贡献。设 $a_i$ 上一次出现的位置为 $pre_i$，若 $[pre_i+1,i-1]$ 内的元素种类大于或等于 $k$，那么就会进行插入。我们可以通过扫描线 $\mathcal{O}(m\log n)$ 预处理出 $f_i$ 表示 $[pre_i+1,i-1]$ 的元素个数，则这会让 $k\in [1,f_i]$ 的答案加一，差分前缀和维护一下即可求出答案。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">5e5</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
<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">a</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">pre</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">pos</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">f</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">ans</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="k">struct</span> <span class="nc">BIT</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">t</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">mx</span><span class="p">;</span>
    <span class="n">BIT</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">mx</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
        <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">mx</span><span class="p">;</span> <span class="n">i</span><span class="o">++</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="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="n">lowbit</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">i</span> <span class="o">&amp;</span> <span class="o">-</span><span class="n">i</span><span class="p">;</span> <span class="p">}</span>
    <span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">for</span><span class="p">(;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">mx</span><span class="p">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">lowbit</span><span class="p">(</span><span class="n">i</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">x</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="n">query</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</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="n">i</span> <span class="o">-=</span> <span class="n">lowbit</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
            <span class="n">ret</span> <span class="o">+=</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
        <span class="k">return</span> <span class="n">ret</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="nc">qry</span> <span class="p">{</span>
    <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="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">qry</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="n">r</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">.</span><span class="n">r</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span> <span class="n">Q</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">freopen</span><span class="p">(</span><span class="s">"manage.in"</span><span class="p">,</span> <span class="s">"r"</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span>
    <span class="n">freopen</span><span class="p">(</span><span class="s">"manage.out"</span><span class="p">,</span> <span class="s">"w"</span><span class="p">,</span> <span class="n">stdout</span><span class="p">);</span>
    <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">m</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="n">pre</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="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="n">i</span><span class="o">++</span><span class="p">)</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">read</span><span class="p">();</span>
        <span class="n">pre</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">pos</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">Q</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">l</span> <span class="o">=</span> <span class="n">pre</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">Q</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">r</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">pos</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 class="p">}</span>
    <span class="n">sort</span><span class="p">(</span><span class="n">Q</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">Q</span> <span class="o">+</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
    <span class="n">BIT</span> <span class="n">tree</span> <span class="o">=</span> <span class="n">BIT</span><span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">10</span><span class="p">);</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="n">pre</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="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">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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">while</span><span class="p">(</span><span class="n">j</span> <span class="o">&lt;=</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 class="p">{</span>
            <span class="k">if</span><span class="p">(</span><span class="n">pre</span><span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="n">j</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">tree</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">pre</span><span class="p">[</span><span class="n">a</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 class="n">pre</span><span class="p">[</span><span class="n">a</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 class="n">tree</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
            <span class="n">j</span><span class="o">++</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">if</span><span class="p">(</span><span class="n">pre</span><span class="p">[</span><span class="n">a</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">r</span> <span class="o">+</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 class="n">f</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">r</span> <span class="o">+</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 class="k">else</span>    <span class="n">f</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">r</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">tree</span><span class="p">.</span><span class="n">query</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">r</span><span class="p">)</span> <span class="o">-</span> <span class="n">tree</span><span class="p">.</span><span class="n">query</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">l</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span><span class="p">(</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="o">-</span><span class="mi">1</span><span class="p">)</span>  <span class="n">ans</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">++</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</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="mi">1</span><span class="p">]</span><span class="o">--</span><span class="p">;</span>
        <span class="k">else</span>    <span class="n">ans</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">++</span><span class="p">,</span> <span class="n">ans</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="p">;</span>
    <span class="p">}</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</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="o">+=</span> <span class="n">ans</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">write</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="n">putchar</span><span class="p">(</span><span class="s">" </span><span class="se">\n</span><span class="s">"</span><span class="p">[</span><span class="n">i</span> <span class="o">==</span> <span class="n">n</span><span class="p">]);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="ugu">Ugu</h2>

<p><a href="https://codeforces.com/contest/1732/problem/B">CF1732B</a></p>

<p>给定一个仅由 $0$ 或 $1$ 组成的长度为 $n$ 的数列。定义一次操作是选择一个后缀并把这个后缀的所有元素取反，求最少使用多少次操作可以让这个序列单调不降。</p>

<p>$\sum n\leq 2\times 10^5$</p>

<h3 id="solution-1">Solution 1</h3>

<p>首先，一个后缀最多只会取一次反。如果你选了以 $p_1,p_2,\dots,p_k$ 为开头的一系列后缀进行操作，你的操作实际上相当于 $[p_1,p_2-1]$ 取反，$[p_2,p_3-1]$ 不变，$[p_3,p_4-1]$ 取反，以此类推，奇数块取反，偶数块不变。</p>

<p>之后，观察到你对一段 $0/1$ 连通块同时取反，是不劣于把它拆开取反的。所以我们可以把连通块缩成一个元素，这时数列就等价转化成了 $0/1$ 交替出现的形式。丢掉开头的 $0$ 不管，最终数列一定变成以下形式：</p>

\[10101010\dots\]

<p>接下来你可以构造一个对于这个数列进行操作的最优方案，不妨拆成 $10, 1, 0, 1, 0,\dots$ 这些块，其中奇数块取反，偶数块不变。那么答案就是缩成的序列的长度减一。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">bool</span> <span class="n">read_bool</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">1e5</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">cnt</span><span class="p">;</span>
<span class="kt">bool</span> <span class="n">f</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">T</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <span class="k">while</span><span class="p">(</span><span class="n">T</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">f</span> <span class="o">=</span> <span class="mi">0</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="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="n">i</span><span class="o">++</span><span class="p">)</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">read_bool</span><span class="p">();</span>
            <span class="n">f</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="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">f</span><span class="p">)</span>  <span class="k">continue</span><span class="p">;</span>
            <span class="k">if</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">a</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">cnt</span><span class="o">++</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">f</span><span class="p">)</span>  <span class="n">cnt</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="n">write</span><span class="p">(</span><span class="n">cnt</span> <span class="o">-</span> <span class="mi">1</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="solution-2">Solution 2</h3>

<p>既然是操作后缀，那么考虑从前往后 dp，每个点需不需要操作只和上一个有没有被取反有关。设计状态 $f(i, 0/1, 0/1)$ 表示考虑前 $i$ 个数，第 $i$ 个数取多少，第 $i$ 位是否和原数列中不同。转移显然，但代码写得有点抽象。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">bool</span> <span class="n">read_bool</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">INF</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">30</span><span class="p">);</span>
<span class="kt">int</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">dp</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="mi">2</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">T</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <span class="k">while</span><span class="p">(</span><span class="n">T</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
        <span class="n">dp</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="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">dp</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="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">dp</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="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">dp</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="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">INF</span><span class="p">;</span>
        <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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="kt">bool</span> <span class="n">now</span> <span class="o">=</span> <span class="n">read_bool</span><span class="p">();</span>
            <span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</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">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</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="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</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">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</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">INF</span><span class="p">;</span>
            <span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">now</span><span class="p">]</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">now</span><span class="p">],</span> <span class="n">dp</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">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">now</span><span class="p">]);</span>
            <span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">now</span><span class="p">]</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">now</span><span class="p">],</span> <span class="n">dp</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">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</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">1</span><span class="p">);</span>
            <span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">1</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="n">min</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">1</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="n">min</span><span class="p">(</span><span class="n">dp</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">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</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="n">dp</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">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">1</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="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">1</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="n">min</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">1</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="n">min</span><span class="p">(</span><span class="n">dp</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">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="n">now</span><span class="p">],</span> <span class="n">dp</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">&amp;</span> <span class="mi">1</span><span class="p">][</span><span class="mi">1</span><span class="p">][</span><span class="n">now</span><span class="p">])</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="n">write</span><span class="p">(</span><span class="n">min</span><span class="p">({</span><span class="n">dp</span><span class="p">[</span><span class="n">n</span> <span class="o">&amp;</span> <span class="mi">1</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="n">dp</span><span class="p">[</span><span class="n">n</span> <span class="o">&amp;</span> <span class="mi">1</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">dp</span><span class="p">[</span><span class="n">n</span> <span class="o">&amp;</span> <span class="mi">1</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">dp</span><span class="p">[</span><span class="n">n</span> <span class="o">&amp;</span> <span class="mi">1</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">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="edges-in-mst">Edges in MST</h2>

<p><a href="https://codeforces.com/problemset/problem/160/D">CF160D</a></p>

<p>给定一个 $n$ 个点，$m$ 条边的带权无向图，考虑它的最小生成树。每条边有三种情况：</p>

<ol>
  <li>
    <p>一定在最小生成树上。</p>
  </li>
  <li>
    <p>有可能在最小生成树上，但不一定在最小生成树上。</p>
  </li>
  <li>
    <p>不可能在最小生成树上。</p>
  </li>
</ol>

<p>请你确定每条边属于哪种情况。</p>

<p>$n,m\leq 10^5$</p>

<h3 id="题解-3">题解</h3>

<p>先用 Kruskal 跑出任意一个最小生成树，现在这棵树的树边属于情况 1/2，非树边属于情况 2/3，不妨分别考虑。</p>

<p>对于非树边 $e(u,v,w)$，如果想要纳入最小生成树中，它就要在 Kruskal 的时候，作为较小的边，完成让 $u$ 和 $v$ 连通的任务。那么考虑树上的 $u$ 到 $v$ 的路径，只要在这条路径上存在一条边 $e_0(u_0,v_0,w_0)$，使得 $w_0\geq w$，那么我们就可以用 $e$ 替换 $e_0$，构造出合法的最小生成树。考虑充要转化，「存在一个大于或等于」等价于「最大值大于或等于」，那么我们只需要支持查询路径 $\max$ 即可，这个可以用倍增维护。</p>

<p>类似的，对于树边 $e(u,v,w)$，如果它不一定在最小生成树中，它就要能被一条非树边替换，也就是存在一条非树边 $e_0(u_0,v_0,w_0)$，使得 $e$ 属于树上 $u_0$ 到 $v_0$ 的路径，且 $w_0\leq w$，那么我们就可以用 $e_0$ 替换 $e$，构造出合法的最小生成树。考虑充要转化，「存在一个小于或等于」等价于「最小值小于或等于」。我们可以枚举非树边，然后将它两端的路径对这条边的权值取 $\min$，这个可以树剖加线段树维护。然而这也可以并查集，从小到大枚举非树边，然后暴力跳打最小值标记，对做过的部分用并查集跳过。</p>

<p>设 $n,m$ 同数量级，并查集的复杂度视为 $\mathcal{O}(\log n)$，则时间复杂度 $\mathcal{O}(n\log n)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">&gt;</span> <span class="n">pii</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">1e6</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="n">MAX_LOG</span> <span class="o">=</span> <span class="mi">17</span><span class="p">,</span> <span class="n">INF</span> <span class="o">=</span> <span class="mf">1e9</span><span class="p">;</span>
<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">cnt</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">mn</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">fir</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">dep</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">fa</span><span class="p">[</span><span class="n">MAX_LOG</span><span class="p">][</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">mx</span><span class="p">[</span><span class="n">MAX_LOG</span><span class="p">][</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">mst</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="k">struct</span> <span class="nc">link</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">nxt</span><span class="p">;</span>
    <span class="n">link</span><span class="p">(</span><span class="kt">int</span> <span class="n">_v</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_w</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="kt">int</span> <span class="n">_nxt</span> <span class="o">=</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">_v</span><span class="p">),</span> <span class="n">w</span><span class="p">(</span><span class="n">_w</span><span class="p">),</span> <span class="n">nxt</span><span class="p">(</span><span class="n">_nxt</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>
<span class="p">}</span> <span class="n">e</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="kt">void</span> <span class="n">AddEdge</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 class="kt">int</span> <span class="n">w</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">e</span><span class="p">[</span><span class="o">++</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">link</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">fir</span><span class="p">[</span><span class="n">u</span><span class="p">]);</span>
    <span class="n">fir</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">cnt</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">struct</span> <span class="nc">edge</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">id</span><span class="p">;</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">edge</span> <span class="o">&amp;</span><span class="n">t</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="k">return</span> <span class="n">w</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">.</span><span class="n">w</span><span class="p">;</span> <span class="p">}</span>
<span class="p">}</span> <span class="n">E</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="k">struct</span> <span class="nc">dsu</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">fa</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">mx</span><span class="p">;</span>
    <span class="n">dsu</span><span class="p">(</span><span class="kt">int</span> <span class="n">_mx</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">mx</span> <span class="o">=</span> <span class="n">_mx</span><span class="p">;</span>
        <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">mx</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
            <span class="n">fa</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="p">}</span>
    <span class="kt">int</span> <span class="n">find</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">==</span> <span class="n">x</span> <span class="o">?</span> <span class="n">x</span> <span class="o">:</span> <span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">find</span><span class="p">(</span><span class="n">fa</span><span class="p">[</span><span class="n">x</span><span class="p">]);</span> <span class="p">}</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="n">kruskal</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">dsu</span> <span class="n">D</span> <span class="o">=</span> <span class="n">dsu</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
    <span class="n">sort</span><span class="p">(</span><span class="n">E</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">E</span> <span class="o">+</span> <span class="n">m</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">fu</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">u</span><span class="p">),</span> <span class="n">fv</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
        <span class="k">if</span><span class="p">(</span><span class="n">fu</span> <span class="o">==</span> <span class="n">fv</span><span class="p">)</span>    <span class="k">continue</span><span class="p">;</span>
        <span class="n">D</span><span class="p">.</span><span class="n">fa</span><span class="p">[</span><span class="n">fu</span><span class="p">]</span> <span class="o">=</span> <span class="n">fv</span><span class="p">;</span>
        <span class="n">AddEdge</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">w</span><span class="p">),</span> <span class="n">AddEdge</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">w</span><span class="p">);</span>
        <span class="n">mst</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="p">}</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">dfs</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">pre</span><span class="p">,</span> <span class="kt">int</span> <span class="n">val</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">fa</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="o">=</span> <span class="n">pre</span><span class="p">,</span> <span class="n">mx</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="o">=</span> <span class="n">val</span><span class="p">,</span> <span class="n">dep</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">dep</span><span class="p">[</span><span class="n">pre</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
    <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">MAX_LOG</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">fa</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">fa</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">u</span><span class="p">]];</span>
        <span class="n">mx</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">mx</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">u</span><span class="p">],</span> <span class="n">mx</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">fa</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">u</span><span class="p">]]);</span>
    <span class="p">}</span>
    <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">fir</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="n">i</span> <span class="o">=</span> <span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">nxt</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">v</span> <span class="o">=</span> <span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">v</span> <span class="o">==</span> <span class="n">pre</span><span class="p">)</span>    <span class="k">continue</span><span class="p">;</span>
        <span class="n">dfs</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">w</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

<span class="n">pii</span> <span class="n">query</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 class="p">{</span>
    <span class="k">if</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">dep</span><span class="p">[</span><span class="n">v</span><span class="p">])</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 class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <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">MAX_LOG</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span>
        <span class="k">if</span><span class="p">(</span><span class="n">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">dep</span><span class="p">[</span><span class="n">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">]]</span> <span class="o">&gt;=</span> <span class="n">dep</span><span class="p">[</span><span class="n">v</span><span class="p">])</span> <span class="p">{</span>
            <span class="n">res</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">mx</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">]);</span>
            <span class="n">u</span> <span class="o">=</span> <span class="n">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">];</span>
        <span class="p">}</span>
    <span class="k">if</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="k">return</span> <span class="n">make_pair</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">u</span><span class="p">);</span>
    <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">MAX_LOG</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span>
        <span class="k">if</span><span class="p">(</span><span class="n">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">v</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">]</span> <span class="o">!=</span> <span class="n">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">v</span><span class="p">])</span> <span class="p">{</span>
            <span class="n">res</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">mx</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">],</span> <span class="n">mx</span><span class="p">[</span><span class="n">i</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">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">u</span><span class="p">],</span> <span class="n">v</span> <span class="o">=</span> <span class="n">fa</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">v</span><span class="p">];</span>
        <span class="p">}</span>
    <span class="n">res</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">mx</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">mx</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">v</span><span class="p">]});</span>
    <span class="k">return</span> <span class="n">make_pair</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">fa</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="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">m</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">u</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">id</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
    <span class="n">kruskal</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="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="n">dsu</span> <span class="n">D</span> <span class="o">=</span> <span class="n">dsu</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="n">mn</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">INF</span><span class="p">;</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">mst</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="p">{</span>
            <span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">,</span> <span class="n">id</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">id</span><span class="p">;</span>            
            <span class="n">pii</span> <span class="n">res</span> <span class="o">=</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">ans</span><span class="p">[</span><span class="n">id</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">res</span><span class="p">.</span><span class="n">first</span> <span class="o">&gt;=</span> <span class="n">w</span> <span class="o">?</span> <span class="mi">2</span> <span class="o">:</span> <span class="mi">3</span><span class="p">);</span>
            <span class="kt">int</span> <span class="n">lca</span> <span class="o">=</span> <span class="n">res</span><span class="p">.</span><span class="n">second</span><span class="p">;</span>
            <span class="k">while</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">u</span><span class="p">)]</span> <span class="o">&gt;</span> <span class="n">dep</span><span class="p">[</span><span class="n">lca</span><span class="p">])</span> <span class="p">{</span>
                <span class="kt">int</span> <span class="n">t</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">u</span><span class="p">);</span>
                <span class="n">mn</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">w</span><span class="p">;</span>
                <span class="n">D</span><span class="p">.</span><span class="n">fa</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">fa</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">t</span><span class="p">]);</span>
            <span class="p">}</span>
            <span class="k">while</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">v</span><span class="p">)]</span> <span class="o">&gt;</span> <span class="n">dep</span><span class="p">[</span><span class="n">lca</span><span class="p">])</span> <span class="p">{</span>
                <span class="kt">int</span> <span class="n">t</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
                <span class="n">mn</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">w</span><span class="p">;</span>
                <span class="n">D</span><span class="p">.</span><span class="n">fa</span><span class="p">[</span><span class="n">t</span><span class="p">]</span> <span class="o">=</span> <span class="n">D</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">fa</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">t</span><span class="p">]);</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="k">if</span><span class="p">(</span><span class="n">mst</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="p">{</span>
            <span class="kt">int</span> <span class="n">u</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">v</span><span class="p">,</span> <span class="n">w</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">,</span> <span class="n">id</span> <span class="o">=</span> <span class="n">E</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">id</span><span class="p">;</span>
            <span class="k">if</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">dep</span><span class="p">[</span><span class="n">v</span><span class="p">])</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 class="n">ans</span><span class="p">[</span><span class="n">id</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">mn</span><span class="p">[</span><span class="n">u</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">w</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="p">}</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</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="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="n">puts</span><span class="p">(</span><span class="s">"any"</span><span class="p">);</span>
        <span class="k">if</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="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="n">puts</span><span class="p">(</span><span class="s">"at least one"</span><span class="p">);</span>
        <span class="k">if</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="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="n">puts</span><span class="p">(</span><span class="s">"none"</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="饼干">饼干</h2>

<p>有 $n$ 个魔咒，施展第 $i$ 个魔咒需要 $a_i$ 点能量。现在你有 $m$ 点能量。</p>

<p>如果现在你有 $a(a&lt;m)$ 点能量，你可以用 $(m-a)$ 的代价回复 $1$ 点能量。</p>

<p>你有 $k$ 次机会，每次选定一个 $a_i\geq 1$，让它减一。</p>

<p>求把所有的魔咒都施展一遍的最小代价。</p>

<p>$1\leq n \leq 10^5,1\leq a_i\leq m\leq 10^6, 1\leq k\leq  \sum a_i$</p>

<h3 id="题解-4">题解</h3>

<p>对于 $k=0$，考虑贪心。如果你需要回复能量，却不回满，那么下次回复的代价就会变大。所以答案就是有一些回满，直到剩下需要的能量和不大于 $m$ 时，就只要回到剩下需要的能量和。为了让总代价尽量小，则让不需要回的尽量多，按 $a_i$ 从小到大做这个过程即可。</p>

<p>你发现每次代价加的是一个连续段 $1,2,\dots ,a_i$。那么设 $c_i$ 表示 $i$ 被加了几次，则答案为 $\sum i\cdot c_i$。那么一次机会就是选一个 $i$，使得 $c_i\gets c_i-1$。那么贪心地优先减去较大的 $i$ 即可。而且这样的话，$i$ 被删除前，比 $i$ 大的数都被减掉了，所以这样操作肯定是合法的。</p>

<p>时间复杂度 $\mathcal{O}(n\log n +m)$。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="mf">1e6</span> <span class="o">+</span> <span class="mi">10</span><span class="p">;</span>
<span class="n">ll</span> <span class="n">n</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">res</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">s</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">c</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">n</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">m</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">k</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <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="n">i</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="o">=</span> <span class="n">read</span><span class="p">();</span>
    <span class="n">sort</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="n">a</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="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="n">i</span><span class="o">++</span><span class="p">)</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">s</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">a</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="k">if</span><span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">n</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">&lt;=</span> <span class="n">m</span><span class="p">)</span> <span class="p">{</span> <span class="n">c</span><span class="p">[</span><span class="n">m</span> <span class="o">-</span> <span class="p">(</span><span class="n">s</span><span class="p">[</span><span class="n">n</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="mi">1</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">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="o">--</span><span class="p">;</span> <span class="k">break</span><span class="p">;</span> <span class="p">}</span>
        <span class="k">else</span>    <span class="n">c</span><span class="p">[</span><span class="mi">1</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">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="o">--</span><span class="p">;</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="n">c</span><span class="p">[</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">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">];</span>
    <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="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">ll</span> <span class="n">d</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
        <span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-=</span> <span class="n">d</span><span class="p">,</span> <span class="n">k</span> <span class="o">-=</span> <span class="n">d</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">k</span><span class="p">)</span>  <span class="k">break</span><span class="p">;</span>
    <span class="p">}</span>
    <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="n">i</span><span class="o">++</span><span class="p">)</span> 
        <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="o">*</span> <span class="n">i</span><span class="p">;</span>
    <span class="n">write</span><span class="p">(</span><span class="n">res</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="noip2020-字符串匹配">[NOIP2020] 字符串匹配</h2>

<p><a href="https://www.luogu.com.cn/problem/P7114">洛谷 P7114</a></p>

<p>对于一个字符串 $S$，找到 $S$ 的所有具有下列形式的拆分方案数：</p>

<p>$S = ABC$，$S = ABABC$，$S = ABAB \ldots ABC$，其中 $A$，$B$，$C$ 均是非空字符串，且 $A$ 中出现奇数次的字符数量不超过 $C$ 中出现奇数次的字符数量。</p>

<table>
  <tbody>
    <tr>
      <td>$1 \le t \le 5$，$1 \le</td>
      <td>S</td>
      <td>\le 2^{20}$。</td>
    </tr>
  </tbody>
</table>

<p>### 题解</p>

<p>我们枚举 $AB$ 的长度 $i$，然后枚举把 $AB$ 重复 $j$ 次，这样的复杂度是 $\mathcal{O}(\frac{n}{1}+\frac{n}{2}+\dots+\frac{n}{n})=\mathcal{O}(n\log n)$ 的。在这个过程中，我们用字符串哈希检验这是否和原串对应。</p>

<p>然后考虑怎么统计答案。
 设 $\text{prec}(i)$ 表示 $[1,i]$ 中出现奇数次的字符个数，$\text{sufc}(i)$ 表示 $[i,n]$ 中出现奇数次的字符个数，那么这两个数组可以 $\mathcal{O}(n)$ 预处理。</p>

<p>设当前 $AB$ 长度为 $i$，$C$ 起点为 $k$，答案就是在可能的 $A$，也就是所有 $\text{prec}(1),\text{prec}(2),\dots,\text{prec}(i-1)$ 中，小于或等于 $\text{sufc}(k)$ 的个数。这个可以用树状数组维护。</p>

<p>时间复杂度是常数比较小的 $\mathcal{O}(t(n\log n\log 26))$，可过。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>

<span class="kr">inline</span> <span class="n">ll</span> <span class="nf">read</span><span class="p">()</span> <span class="p">{...}</span>
<span class="kt">char</span> <span class="n">buf</span><span class="p">[</span><span class="mi">50</span><span class="p">];</span>
<span class="kr">inline</span> <span class="kt">void</span> <span class="n">write</span><span class="p">(</span><span class="n">ll</span> <span class="n">x</span><span class="p">)</span> <span class="p">{...}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">MAX_N</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">20</span><span class="p">)</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="n">BASE</span> <span class="o">=</span> <span class="mi">13331</span><span class="p">,</span> <span class="n">MOD</span> <span class="o">=</span> <span class="mi">998244353</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">T</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">cnt1</span><span class="p">[</span><span class="mi">28</span><span class="p">],</span> <span class="n">cnt2</span><span class="p">[</span><span class="mi">28</span><span class="p">],</span> <span class="n">val</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">power</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">prec</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">sufc</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">ans</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">s</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">];</span>

<span class="k">struct</span> <span class="nc">BIT</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">t</span><span class="p">[</span><span class="n">MAX_N</span><span class="p">],</span> <span class="n">mx</span><span class="p">;</span>
    <span class="n">BIT</span><span class="p">(</span><span class="kt">int</span> <span class="n">_mx</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">mx</span> <span class="o">=</span> <span class="n">_mx</span><span class="p">;</span>
        <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">mx</span><span class="p">;</span> <span class="n">i</span><span class="o">++</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="mi">0</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="n">lowbit</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">i</span> <span class="o">&amp;</span> <span class="o">-</span><span class="n">i</span><span class="p">);</span> <span class="p">}</span>
    <span class="kt">void</span> <span class="n">update</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">for</span><span class="p">(;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">mx</span><span class="p">;</span> <span class="n">i</span> <span class="o">+=</span> <span class="n">lowbit</span><span class="p">(</span><span class="n">i</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">x</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="kt">int</span> <span class="n">query</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span><span class="p">)</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">res</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="k">for</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">lowbit</span><span class="p">(</span><span class="n">i</span><span class="p">))</span>
            <span class="n">res</span> <span class="o">+=</span> <span class="n">t</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
        <span class="k">return</span> <span class="n">res</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="n">get</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="p">(</span><span class="n">val</span><span class="p">[</span><span class="n">r</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1ll</span> <span class="o">*</span> <span class="n">val</span><span class="p">[</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">power</span><span class="p">[</span><span class="n">r</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">MOD</span> <span class="o">+</span> <span class="n">MOD</span><span class="p">)</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">;</span> <span class="p">}</span>
<span class="kt">void</span> <span class="n">init</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">prec</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">sufc</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">0</span><span class="p">;</span>
    <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="sc">'a'</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="sc">'z'</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="n">cnt1</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">]</span> <span class="o">=</span> <span class="n">cnt2</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <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="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="p">)</span> <span class="p">{</span>
        <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="n">power</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>    <span class="n">power</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1ll</span> <span class="o">*</span> <span class="n">power</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">BASE</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">;</span>
        <span class="n">val</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">1ll</span> <span class="o">*</span> <span class="n">val</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">BASE</span> <span class="o">%</span> <span class="n">MOD</span> <span class="o">+</span> <span class="p">(</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">'a'</span><span class="p">))</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">;</span>
        <span class="n">cnt1</span><span class="p">[</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">'a'</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">cnt1</span><span class="p">[</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">'a'</span><span class="p">]</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> <span class="n">prec</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">prec</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="mi">1</span><span class="p">;</span>
        <span class="k">else</span>    <span class="n">prec</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">prec</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="mi">1</span><span class="p">;</span>
        <span class="n">j</span> <span class="o">=</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 class="n">cnt2</span><span class="p">[</span><span class="n">s</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">cnt2</span><span class="p">[</span><span class="n">s</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">]</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">)</span> <span class="n">sufc</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">sufc</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="mi">1</span><span class="p">;</span>
        <span class="k">else</span>    <span class="n">sufc</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">sufc</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="mi">1</span><span class="p">;</span>        
    <span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="n">T</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
    <span class="n">power</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="k">while</span><span class="p">(</span><span class="n">T</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">scanf</span><span class="p">(</span><span class="s">"%s"</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="n">n</span> <span class="o">=</span> <span class="n">strlen</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="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="n">init</span><span class="p">();</span>
        <span class="n">BIT</span> <span class="n">tree</span><span class="p">(</span><span class="mi">28</span><span class="p">);</span>
        <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="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">tree</span><span class="p">.</span><span class="n">update</span><span class="p">(</span><span class="n">prec</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="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
            <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">i</span> <span class="o">*</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="p">)</span> <span class="p">{</span>
                <span class="kt">int</span> <span class="n">l</span> <span class="o">=</span> <span class="n">i</span> <span class="o">*</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="mi">1</span><span class="p">,</span> <span class="n">r</span> <span class="o">=</span> <span class="n">i</span> <span class="o">*</span> <span class="n">j</span><span class="p">;</span>
                <span class="k">if</span><span class="p">(</span><span class="n">get</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="p">)</span> <span class="o">!=</span> <span class="n">get</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="k">break</span><span class="p">;</span>
                <span class="n">ans</span> <span class="o">+=</span> <span class="n">tree</span><span class="p">.</span><span class="n">query</span><span class="p">(</span><span class="n">sufc</span><span class="p">[</span><span class="n">r</span> <span class="o">+</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="p">}</span>
        <span class="p">}</span>
        <span class="n">write</span><span class="p">(</span><span class="n">ans</span><span class="p">),</span> <span class="n">putchar</span><span class="p">(</span><span class="sc">'\n'</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>Joy</name></author><category term="Solution" /><summary type="html"><![CDATA[Note]]></summary></entry></feed>