<?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://anicoderandy.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://anicoderandy.github.io/" rel="alternate" type="text/html" /><updated>2026-03-18T10:06:18+00:00</updated><id>https://anicoderandy.github.io/feed.xml</id><title type="html">Jingye Qiu</title><subtitle>Personal homepage of Jingye Qiu</subtitle><author><name>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><entry><title type="html">谨以此文献给我的 2025</title><link href="https://anicoderandy.github.io/writings/to-my-2025/" rel="alternate" type="text/html" title="谨以此文献给我的 2025" /><published>2026-01-01T16:30:00+00:00</published><updated>2026-01-01T16:30:00+00:00</updated><id>https://anicoderandy.github.io/writings/to-my-2025</id><content type="html" xml:base="https://anicoderandy.github.io/writings/to-my-2025/"><![CDATA[<h2 id="共振-i">共振 I</h2>
<p>我看着她，那个好像只在我脑海中存在着的她……我不忌惮地触碰着她的每一寸皮肤，那样不可思议的白皙、柔软……我点燃积压在内心深处的火焰，那束危险的、无可控制的火焰……</p>

<p>我让自己相信，就是这一次。</p>

<p>在这里，从不需要靠什么“听”的艺术！只有属于我的感觉的艺术！我不明白什么是不协和音程，我不懂解决什么阻碍进行！这里只有和谐！Harmony！</p>

<p>Harmony！Energy！Explosion！</p>

<p>“我更不问我的热情、我的希望，未来与过去只是渺茫的幻想！”</p>

<p>这独属于我的作品！我倾诉我的一切，我堆砌我的所有：我供认我的罪行，我坦白我的软弱。我要你看到，我要你理解，我要你感受，我要你与我一齐共舞，我要你同我一起穿越！</p>

<p>你听！</p>

<h2 id="破镜-i">破镜 I</h2>
<p>欢聚时刻：举杯高歌！</p>

<p>让解不开的统统遗忘，让欢声笑语取代一切疑虑！</p>

<p>别再念叨着无可改变的事实，收起你那难以停止的疲倦。睁开眼，前面的不只是飘渺的幻象：这是你亲手缔造的帝国，为何不登上属于你的王座？</p>

<p>问问水：你流向哪里？要把我带去哪里？要把她带去哪里？</p>

<p>问问风：你吹向哪里？去山的那边，去水的那头？</p>

<p>听，水说：你心所向便是我的方向，你心所往便是你的归宿！</p>

<p>听，风说：去到那只有你我，无人踏足的世界！去到你渴望的悠然自得的天边！</p>

<h2 id="共振-ii">共振 II</h2>
<p>和声……泛音……共鸣……</p>

<p>我就站在天台边，摇摇欲坠。</p>

<p>这个奇幻诡谲的世界，带着我的每个器官一同震动、惊颤！这是耕种，是丰收，是重逢，是别离。</p>

<p>我用我含蓄的语言将你歌颂，我用我真挚的热情向你表白。你能看到，我沸腾的血，我平静的心；我沉重的沸腾，我热烈的平静！</p>

<p>燃尽了，只剩下了轻微的余响。</p>

<p>——那样轻微，却又那样震撼：我寻觅那消散的声响，越是用力去听，越是朦胧，越是心碎，越是彷徨，越是疲惫……</p>

<h2 id="共振-iii">共振 III</h2>
<p>引擎的轰鸣，工业革命的伟大胜利！跨越山海相见，你是如此陌生又熟悉。</p>

<p>纷乱的世界，遍地的诱惑。尽情狂欢吧！为何要惆怅？不顾一切地释放吧！何必再压抑？</p>

<p>此刻此刻，秒针分针时针带我一起放慢了脚步；我心随时光缓缓流淌，轻轻抵达每一个过去与当下。请容许我的问候，请回答我的牵念！</p>

<h2 id="破镜-ii">破镜 II</h2>
<p>时光……效率……未来……</p>

<p>这辆呼啸而过扬起千层尘土的巴士，你带上我奔赴宇宙熵增无尽头的终点吧！</p>

<p>我捎上我的稿纸，绘上你的模样。我给你谱写没有歌颂的颂歌，我为你赋予没有意义的意义，我要推倒你，我要重筑你——让我从头再来，给我以时间，给我以想象！</p>

<p>让我顺着你的流动，品赏你身体的每一个部分：拥有你、占有你、吞噬你！</p>

<p>结束了，你让我凝视你。——凝视？我不敢与你对视，我不配与你对视！你是深邃，你是危险：我不明白你意味着什么，我想不透你要带来些什么。或许，用你的磅礴改造这混沌的世界吧，用你的渊博包容这万千宇宙吧！举起你的武器，带上你的决心！改造！创造！革命！</p>

<p>拒我于门外吧！</p>

<h2 id="破镜-iii">破镜 III</h2>
<p>终于，我听到了回音。</p>

<p>几乎不费力气，或者说是冥冥中的侥幸，我听到了回音。</p>

<p>温柔的回音，踌躇的回音，铿锵的回音，那让我魂牵梦绕的回音！</p>

<p>为什么会有人因为一个声音就有了生活的希望？为什么会有人相信一个声音会给未来带去改变？为什么要奉它为信仰，尊它为最后一剂良药？它真的存在吗？它真的值得信赖吗？</p>

<p>我好像听到了答案。</p>

<p>看看那寂静的夜，那无垠的江边，那闪闪的星光……等待，双手在颤抖……等待，心脏在跳动……</p>

<p>听，就是那个声音！划破暗夜，直击心灵！</p>

<p>听……</p>

<p>那根本不是我的声音！</p>

<h2 id="共振-iv">共振 IV</h2>
<p>只需两个音符。</p>

<p>此刻，我不在人间——好像是穿越，也好像是定格。</p>

<h2 id="破镜-iv">破镜 IV</h2>
<p>离开吧。</p>

<p>她已经不是最初的模样。</p>

<p>你还在留恋什么？</p>

<p>被拥抱的刹那？被满足的瞬间？</p>

<p>留下吧。</p>

<p>那是引你进门的使者，万不可有所冒犯。</p>]]></content><author><name>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="writings" /><summary type="html"><![CDATA[共振 I 我看着她，那个好像只在我脑海中存在着的她……我不忌惮地触碰着她的每一寸皮肤，那样不可思议的白皙、柔软……我点燃积压在内心深处的火焰，那束危险的、无可控制的火焰……]]></summary></entry><entry><title type="html">HNU 2024 级 电路与电子学 模型机综合设计实验报告</title><link href="https://anicoderandy.github.io/notes/hnu-electronic-design/" rel="alternate" type="text/html" title="HNU 2024 级 电路与电子学 模型机综合设计实验报告" /><published>2025-01-23T14:36:00+00:00</published><updated>2025-01-23T14:36:00+00:00</updated><id>https://anicoderandy.github.io/notes/hnu-electronic-design</id><content type="html" xml:base="https://anicoderandy.github.io/notes/hnu-electronic-design/"><![CDATA[<h2 id="前言">前言</h2>
<p>HNU 信院的电子电路感觉是挑战性很大的一门课，综合设计当中也会遇到很多课上不会讲的知识，网上关于 Quartus II 软件的相关资料也是少之又少。这学期的课程，本人也是在各种跌跌撞撞中查阅资料、向 AI 提问的曲折过程中，最终才实现了模型机的综合设计。这篇博客希望能给以后的同学当作参考，但也希望大家不要抄袭，独立完成之后获得的成就感是无论如何都无法取代的：完成每一个元件的代码和波形测试、把每一个自己编写的元件连接在一起、用简陋的指令集实现一个程序——这其中每一个过程对我来说都是新奇且具有挑战性的。</p>

<p>祝大家顺利完成综合设计。</p>

<h2 id="一设计目的">一、设计目的</h2>
<p>以“培养现代数字系统设计能力”为目标，贯彻以 CPU 设计为核心，以层次化、模块化设计方法为抓手的组织思路，培养设计与实现数字系统的能力。</p>

<p>完整、连贯地运用课程所学知识，熟练掌握现代 EDA 工具基本使用方法，为后续课程学习和今后从事相关工作打下良好的基础或做下一些铺垫。</p>

<h2 id="二设计内容">二、设计内容</h2>
<ol>
  <li>按照给定的数据通路、数据格式和指令系统，使用 EDA 工具设计一台用硬连线逻辑控制的简易计算机；</li>
  <li>用所设计的计算机控制模拟通道对外界模拟输入信号进行采样、离散和处理，并显示在数码显示管上。</li>
</ol>

<h2 id="三详细设计">三、详细设计</h2>
<h3 id="31-模型机的设计思路">3.1 模型机的设计思路</h3>
<ol>
  <li>根据自上到下的设计方式，了解模型机整体的设计思路，根据整体原理设计下层结构功能。</li>
  <li>利用分块设计，使用 Verilog HDL 语言对每个模块进行设计，通过功能波形仿真和时序波形仿真检查功能是否实现，分析元件性能表现。</li>
  <li>根据自下至上的原则，依据整体架构对封装好的各板块进行连接，每连接一个板块进行一次仿真验证，确保无误后再进行下一个组件的连接，直到整个模型机设计完毕。</li>
</ol>

<h3 id="32-模型机的整体架构">3.2 模型机的整体架构</h3>
<p>参见 <a href="https://gitee.com/aimaier4869/vspm-ts/tree/495eeb24f2079ef7cca248ca2a889c9dcc109cee">AI 麥爾的项目</a>。
<img src="https://s2.loli.net/2025/01/09/wkvC2bAxjPhydNl.jpg" alt="模型机的架构图" /></p>

<h3 id="33-各模块的具体实现">3.3 各模块的具体实现</h3>
<h4 id="331-指令译码器">3.3.1. 指令译码器</h4>

<p><img src="https://s2.loli.net/2025/01/09/Z286XkdyWjhgGEF.png" alt="ins_decode 元件图" /></p>

<p>接口设计：见上图。模块输入为使能信号 en 和机器码 ir[3..0]，输出指令信号 mova, movb, movc, movd, add, sub, jmp, jg, in1, out1, movi, halt 将会接入控制信号发生逻辑上。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">输入 en</th>
      <th style="text-align: center">输入 Ir[3:0]</th>
      <th style="text-align: center">mova</th>
      <th style="text-align: center">movb</th>
      <th style="text-align: center">movc</th>
      <th style="text-align: center">movd</th>
      <th style="text-align: center">add</th>
      <th style="text-align: center">sub</th>
      <th style="text-align: center">jmp</th>
      <th style="text-align: center">jg</th>
      <th style="text-align: center">in1</th>
      <th style="text-align: center">out1</th>
      <th style="text-align: center">movi</th>
      <th style="text-align: center">halt</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">0</td>
      <td style="text-align: center">xxxx</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0100</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0101</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0110</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0111</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1000</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1001</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1010</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1011</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1100</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1101</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1110</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1111</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">1</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">其它组合</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
  </tbody>
</table>

<p>功能实现：当译码器的使能信号为 1 时，根据传入的机器码将对应端口输出为 1，其他端口输出 0。具体功能见上表。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">ins_decode</span><span class="p">(</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">ir</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">en</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">mova</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">movb</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">movc</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">movd</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">add</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">sub</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">jmp</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">jg</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">in1</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">out1</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">movi</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">halt</span>
<span class="p">);</span>

<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="n">ir</span><span class="p">,</span> <span class="n">en</span><span class="p">)</span> <span class="k">begin</span>
	<span class="n">mova</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">movb</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">movc</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">movd</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">add</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">sub</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">jmp</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">jg</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">in1</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">out1</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">movi</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">halt</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	
	<span class="k">if</span> <span class="p">(</span><span class="n">en</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="k">begin</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b0100</span><span class="p">)</span> <span class="n">mova</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b0101</span><span class="p">)</span> <span class="n">movb</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b0110</span><span class="p">)</span> <span class="n">movc</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b0111</span><span class="p">)</span> <span class="n">movd</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b1000</span><span class="p">)</span> <span class="n">add</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b1001</span><span class="p">)</span> <span class="n">sub</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b1010</span><span class="p">)</span> <span class="n">jmp</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b1011</span><span class="p">)</span> <span class="n">jg</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b1100</span><span class="p">)</span> <span class="n">in1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b1101</span><span class="p">)</span> <span class="n">out1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b1110</span><span class="p">)</span> <span class="n">movi</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="mb">4'b1111</span><span class="p">)</span> <span class="n">halt</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
	<span class="k">end</span>
<span class="k">end</span>

<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="332-算术单元">3.3.2. 算术单元</h4>
<p><img src="https://s2.loli.net/2025/01/09/m9WjbXlpOoQrTyg.png" alt="AU 元件图" /></p>

<p>接口设计：见上图。共 4 个输入端口，包括来自通用寄存器的数据来源 a[7..0], b[7..0]，以及来在控制信号发生逻辑的 ac[3..0] 指令码和使能信号 au_en。输出端口 t[7..0] 表示计算结果，gf 表示 sub 运算得到的标识。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">au_en</th>
      <th style="text-align: center">ac[3..0]</th>
      <th style="text-align: center">t[7..0]</th>
      <th style="text-align: center">gf</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1000</td>
      <td style="text-align: center">t = a + b</td>
      <td style="text-align: center">不影响</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1001</td>
      <td style="text-align: center">t = b - a</td>
      <td style="text-align: center">IF(b &gt; a), THEN gf = 1, ELSE gf = 0</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">0100、0101、1101</td>
      <td style="text-align: center">t = a</td>
      <td style="text-align: center">不影响</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">其它组合</td>
      <td style="text-align: center">t = 8’hZZ</td>
      <td style="text-align: center">不影响</td>
    </tr>
    <tr>
      <td style="text-align: center">0</td>
      <td style="text-align: center">XXXX</td>
      <td style="text-align: center">t = 8’hZZ</td>
      <td style="text-align: center">不影响</td>
    </tr>
  </tbody>
</table>

<p>功能实现：根据输入的指令码，实现加法运算、减法运算、直接经过三种功能。具体功能见上表。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">au</span><span class="p">(</span>
	<span class="kt">input</span> <span class="n">au_en</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">ac</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">a</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">b</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">t</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">gf</span>
<span class="p">);</span>

<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="n">au_en</span><span class="p">,</span> <span class="n">ac</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="k">begin</span>
	<span class="n">gf</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>
	<span class="n">t</span> <span class="o">=</span> <span class="mb">8'b0000_0000</span><span class="p">;</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">au_en</span> <span class="o">==</span> <span class="mb">1'b0</span><span class="p">)</span> <span class="k">begin</span>
		<span class="n">t</span> <span class="o">=</span> <span class="mi">8</span><span class="err">'</span><span class="n">hZZ</span><span class="p">;</span>
	<span class="k">end</span>
	<span class="k">else</span> <span class="k">begin</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">ac</span> <span class="o">==</span> <span class="mb">4'b1000</span><span class="p">)</span> <span class="n">t</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ac</span> <span class="o">==</span> <span class="mb">4'b1001</span><span class="p">)</span> <span class="k">begin</span>
			<span class="n">t</span> <span class="o">=</span> <span class="n">b</span> <span class="o">+</span> <span class="p">(</span><span class="o">~</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="mb">8'b0000_0001</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="mi">7</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">t</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">|</span> <span class="n">t</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">|</span> <span class="n">t</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span> <span class="o">|</span> <span class="n">t</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">|</span> <span class="n">t</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span> <span class="o">|</span> <span class="n">t</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">|</span> <span class="n">t</span><span class="p">[</span><span class="mi">6</span><span class="p">])</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span> <span class="n">gf</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
			<span class="k">else</span> <span class="n">gf</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
		<span class="k">end</span>
		<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">ac</span> <span class="o">==</span> <span class="mb">4'b0100</span> <span class="o">||</span> <span class="n">ac</span> <span class="o">==</span> <span class="mb">4'b0101</span> <span class="o">||</span> <span class="n">ac</span> <span class="o">==</span> <span class="mb">4'b1101</span><span class="p">)</span> <span class="n">t</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span>
		<span class="k">else</span> <span class="n">t</span> <span class="o">=</span> <span class="mi">8</span><span class="err">'</span><span class="n">hZZ</span><span class="p">;</span>
	<span class="k">end</span>
<span class="k">end</span>

<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="333-八重-3-1-多路复用器">3.3.3. 八重 3-1 多路复用器</h4>
<p><img src="https://s2.loli.net/2025/01/09/EpmaR98cwLVyFsB.png" alt="八重 MUX3-1 元件图" /></p>

<p>接口设计：见上图。八重 3-1 多路复用器有 3 个八位输入 a[7:0]、b[7:0]、c[7:0]，1 个输出 y[7:0]，称之为八重，s[1:0] 选择将哪个输入传至输出。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">S[1..0]</th>
      <th style="text-align: center">Y</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">00</td>
      <td style="text-align: center">a</td>
    </tr>
    <tr>
      <td style="text-align: center">01</td>
      <td style="text-align: center">b</td>
    </tr>
    <tr>
      <td style="text-align: center">10</td>
      <td style="text-align: center">c</td>
    </tr>
    <tr>
      <td style="text-align: center">其他</td>
      <td style="text-align: center">a</td>
    </tr>
  </tbody>
</table>

<p>功能实现：见上表。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">mux3_1</span><span class="p">(</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">a</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">b</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">c</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">1</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">s</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">y</span>
<span class="p">);</span>
<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">begin</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="mb">2'b01</span><span class="p">)</span> <span class="n">y</span> <span class="o">=</span> <span class="n">b</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="o">==</span> <span class="mb">2'b10</span><span class="p">)</span> <span class="n">y</span> <span class="o">=</span> <span class="n">c</span><span class="p">;</span>
	<span class="k">else</span> <span class="n">y</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span>
<span class="k">end</span>
<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="334-八重-2-1-多路复用器">3.3.4. 八重 2-1 多路复用器</h4>
<p><img src="https://s2.loli.net/2025/01/09/thH7KDOeXM9wdjT.png" alt="八重 MUX2-1 元件图" /></p>

<p>接口设计：见上图。输入包含选择信号 s 和两个 8 位输入 a[7..0], b[7..0]。输出 y[7..0] 由 s 选择。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">S</th>
      <th style="text-align: center">Y</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">0</td>
      <td style="text-align: center">a</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">b</td>
    </tr>
  </tbody>
</table>

<p>功能实现：见上表。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">mux2_1</span><span class="p">(</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">a</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">b</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">s</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">y</span>
<span class="p">);</span>
<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">begin</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="mb">1'b0</span><span class="p">)</span> <span class="n">y</span> <span class="o">=</span> <span class="n">a</span><span class="p">;</span>
	<span class="k">else</span> <span class="n">y</span> <span class="o">=</span> <span class="n">b</span><span class="p">;</span>
<span class="k">end</span>
<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="335-控制信号产生逻辑">3.3.5. 控制信号产生逻辑</h4>
<p><img src="https://s2.loli.net/2025/01/09/YAq8PJWcZas75Sm.png" alt="con_signal 元件图" /></p>

<p>接口设计：见上图。包含 15 个输入端口，其中 12 个与指令译码器的输出端口对应，另外 g 由状态寄存器输出，ir[7..0] 为输入指令，sm 信号控制当前为读取还是执行周期。输出包含 16 个控制信号。</p>

<p>功能实现：控制信号产生逻辑接受指令译码器的输出，在 sm 以及状态 g 的配合下产生每个模块需要的控制信号。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">con_signal</span><span class="p">(</span>
	<span class="kt">input</span> <span class="n">mova</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">movb</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">movc</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">movd</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">add</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">sub</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">jmp</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">jg</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">g</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">in1</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">out1</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">movi</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">halt</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">ir</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">sm</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">sm_en</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">ir_ld</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">ram_re</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">ram_wr</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">pc_ld</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">pc_in</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">1</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">reg_sr</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">1</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">reg_dr</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">reg_we</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">1</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">s</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">au_en</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">au_ac</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">gf_en</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">in_en</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">out_en</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">mux_s</span>
<span class="p">);</span>

<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">begin</span>
	<span class="n">sm_en</span> <span class="o">=</span> <span class="o">~</span><span class="n">halt</span><span class="p">;</span>
	<span class="n">ir_ld</span> <span class="o">=</span> <span class="o">~</span><span class="n">sm</span><span class="p">;</span>
	<span class="n">ram_re</span> <span class="o">=</span> <span class="p">(</span><span class="o">~</span><span class="n">sm</span><span class="p">)</span> <span class="o">|</span> <span class="n">movc</span> <span class="o">|</span> <span class="n">movi</span><span class="p">;</span>
	<span class="n">ram_wr</span> <span class="o">=</span> <span class="n">movb</span><span class="p">;</span>
	<span class="n">pc_ld</span> <span class="o">=</span> <span class="n">jmp</span> <span class="o">|</span> <span class="p">(</span><span class="n">jg</span> <span class="o">&amp;</span> <span class="n">g</span><span class="p">);</span>
	<span class="n">pc_in</span> <span class="o">=</span> <span class="n">movi</span> <span class="o">|</span> <span class="p">(</span><span class="o">~</span><span class="n">sm</span><span class="p">);</span>
	<span class="n">reg_sr</span> <span class="o">=</span> <span class="n">ir</span><span class="p">[</span><span class="mi">1</span><span class="o">:</span><span class="mi">0</span><span class="p">];</span>
	<span class="n">reg_dr</span> <span class="o">=</span> <span class="n">ir</span><span class="p">[</span><span class="mi">3</span><span class="o">:</span><span class="mi">2</span><span class="p">];</span>
	<span class="n">reg_we</span> <span class="o">=</span> <span class="n">movi</span> <span class="o">|</span> <span class="n">mova</span> <span class="o">|</span> <span class="n">movc</span> <span class="o">|</span> <span class="n">movd</span> <span class="o">|</span> <span class="n">sub</span> <span class="o">|</span> <span class="n">add</span> <span class="o">|</span> <span class="n">in1</span><span class="p">;</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">movb</span><span class="p">)</span> <span class="n">s</span> <span class="o">=</span> <span class="mb">2'b10</span><span class="p">;</span>
	<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">movc</span><span class="p">)</span> <span class="n">s</span> <span class="o">=</span> <span class="mb">2'b01</span><span class="p">;</span>
	<span class="k">else</span> <span class="n">s</span> <span class="o">=</span> <span class="mb">2'b00</span><span class="p">;</span>
	<span class="n">au_en</span> <span class="o">=</span> <span class="n">mova</span> <span class="o">|</span> <span class="n">movb</span> <span class="o">|</span> <span class="n">add</span> <span class="o">|</span> <span class="n">out1</span> <span class="o">|</span> <span class="n">sub</span><span class="p">;</span>
	<span class="n">au_ac</span> <span class="o">=</span> <span class="n">ir</span><span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">4</span><span class="p">];</span>
	<span class="n">gf_en</span> <span class="o">=</span> <span class="n">sub</span><span class="p">;</span>
	<span class="n">in_en</span> <span class="o">=</span> <span class="n">in1</span><span class="p">;</span>
	<span class="n">out_en</span> <span class="o">=</span> <span class="n">out1</span><span class="p">;</span>
	<span class="n">mux_s</span> <span class="o">=</span> <span class="n">mova</span> <span class="o">|</span> <span class="n">movi</span> <span class="o">|</span> <span class="n">add</span> <span class="o">|</span> <span class="n">sub</span> <span class="o">|</span> <span class="n">in1</span> <span class="o">|</span> <span class="n">movc</span><span class="p">;</span>
<span class="k">end</span>

<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="336-状态机-sm">3.3.6. 状态机 SM</h4>
<p><img src="https://s2.loli.net/2025/01/10/SWL9rfqUcoOiC2u.png" alt="SM 元件图" /></p>

<p>接口设计：见上图。输入时钟 clk 和使能信号 sm_en，输出 sm 指示当前周期信息。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">CLK</th>
      <th style="text-align: center">SM_EN</th>
      <th style="text-align: center">功能</th>
      <th style="text-align: center">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">下降沿</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">SM \(\Leftarrow\) SM 取反</td>
      <td style="text-align: center">SM 初始值为 0</td>
    </tr>
  </tbody>
</table>

<p>功能实现：见上表。SM 为 0 是读取指令周期；SM 为 1 是执行指令周期。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">sm</span><span class="p">(</span>
	<span class="kt">input</span> <span class="n">clk</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">sm_en</span><span class="p">,</span>
	<span class="kt">output</span> <span class="n">sm</span>
<span class="p">);</span>

<span class="kt">reg</span> <span class="n">state</span> <span class="o">=</span> <span class="mb">1'b0</span><span class="p">;</span>

<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="kt">negedge</span> <span class="n">clk</span><span class="p">)</span> <span class="k">begin</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">sm_en</span> <span class="o">==</span> <span class="mb">1'b1</span><span class="p">)</span> <span class="n">state</span> <span class="o">&lt;=</span> <span class="o">~</span><span class="n">state</span><span class="p">;</span>
<span class="k">end</span>

<span class="k">assign</span> <span class="n">sm</span> <span class="o">=</span> <span class="n">state</span><span class="p">;</span>

<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="337-指令寄存器-ir">3.3.7. 指令寄存器 IR</h4>
<p><img src="https://s2.loli.net/2025/01/10/TP9xwLiRHljU1bN.png" alt="IR 元件图" /></p>

<p>接口设计：见上图。输入时钟 clk，控制信号 ld_ir 和指令 a[7..0]。输出指令 x[7..0]。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">CLK</th>
      <th style="text-align: center">Ld_ir</th>
      <th style="text-align: center">功能</th>
      <th style="text-align: center">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">下降沿</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">a[7:0] 写入 x[7:0]</td>
      <td style="text-align: center">X 初始值为 00000000</td>
    </tr>
  </tbody>
</table>

<p>功能实现：见上表。当时钟处在下降沿且控制信号为 1 时将总线数据写入寄存器。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">ir</span><span class="p">(</span>
	<span class="kt">input</span> <span class="n">clk</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">ld_ir</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">a</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">x</span> <span class="o">=</span> <span class="mb">8'b0000_0000</span>
<span class="p">);</span>

<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="kt">negedge</span> <span class="n">clk</span><span class="p">)</span> <span class="k">begin</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">ld_ir</span> <span class="o">==</span> <span class="mb">1'b1</span><span class="p">)</span> <span class="n">x</span> <span class="o">&lt;=</span> <span class="n">a</span><span class="p">;</span>
<span class="k">end</span>

<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="338-状态寄存器-psw">3.3.8. 状态寄存器 PSW</h4>
<p><img src="https://s2.loli.net/2025/01/10/abXYNhWTMcmsfBJ.png" alt="PSW 元件图" /></p>

<p>接口设计：见上图。输入时钟 clk，使能信号 g_en 和状态信号 g。输出状态信号 gf。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">CLK</th>
      <th style="text-align: center">g_en</th>
      <th style="text-align: center">功能</th>
      <th style="text-align: center">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">下降沿</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">g 写入 gf</td>
      <td style="text-align: center">gf 初始值为 0</td>
    </tr>
  </tbody>
</table>

<p>功能实现：见上表。本模型机 PSW 用来存放 SUB 指令执行结果的状态标志。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">psw</span><span class="p">(</span>
	<span class="kt">input</span> <span class="n">clk</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">g</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">g_en</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="n">gf</span> <span class="o">=</span> <span class="mb">1'b0</span>
<span class="p">);</span>

<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="kt">negedge</span> <span class="n">clk</span><span class="p">)</span> <span class="k">begin</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">g_en</span> <span class="o">==</span> <span class="mb">1'b1</span><span class="p">)</span> <span class="n">gf</span> <span class="o">&lt;=</span> <span class="n">g</span><span class="p">;</span>
<span class="k">end</span>

<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="339-指令计数器-pc">3.3.9. 指令计数器 PC</h4>
<p><img src="https://s2.loli.net/2025/01/10/AjerZhnEOyLFfIu.png" alt="PC 元件图" /></p>

<p>接口设计：见上图。输入时钟 clk，控制信号 ld_pc 和 in_pc，以及装载数据 a[7..0]。输出当前地址 c[7..0]。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">CLK</th>
      <th style="text-align: center">in_pc</th>
      <th style="text-align: center">功能</th>
      <th style="text-align: center">备注</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">下降沿</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">c[7..0] 中数据自加 1</td>
      <td style="text-align: center">PC 初始值为 00000000（第一条指令在 RAM 中的存放地址）</td>
    </tr>
    <tr>
      <td style="text-align: center">下降沿</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">a[7..0] 写入 c[7..0]</td>
      <td style="text-align: center"> </td>
    </tr>
  </tbody>
</table>

<p>功能实现：见上表。根据不同的输入信号使寄存器中的地址自增 1 或是装载新的地址。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">pc</span><span class="p">(</span>
	<span class="kt">input</span> <span class="n">ld_pc</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">in_pc</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">clk</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">a</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">c</span> <span class="o">=</span> <span class="mh">8'h00</span>
<span class="p">);</span>

<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="kt">negedge</span> <span class="n">clk</span><span class="p">)</span> <span class="k">begin</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">in_pc</span> <span class="o">==</span> <span class="mb">1'b1</span> <span class="o">&amp;&amp;</span> <span class="n">ld_pc</span> <span class="o">==</span> <span class="mb">1'b0</span><span class="p">)</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="n">c</span> <span class="o">+</span> <span class="mh">8'h01</span><span class="p">;</span>
	<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">in_pc</span> <span class="o">==</span> <span class="mb">1'b0</span> <span class="o">&amp;&amp;</span> <span class="n">ld_pc</span> <span class="o">==</span> <span class="mb">1'b1</span><span class="p">)</span> <span class="n">c</span> <span class="o">&lt;=</span> <span class="n">a</span><span class="p">;</span>
<span class="k">end</span>

<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="3310-通用寄存器组">3.3.10. 通用寄存器组</h4>
<p><img src="https://s2.loli.net/2025/01/10/lPoINJ3qSvbMTXU.png" alt="reg_group 元件图" /></p>

<p>接口设计：见上图。输入时钟 clk，控制信号 sr[1..0] 和 dr[1..0]，以及装载数据 i[7..0]。根据控制信号输出当前寄存器的值 s[7..0], d[7..0]。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">操作</th>
      <th style="text-align: center">CLK</th>
      <th style="text-align: center">WE</th>
      <th style="text-align: center">功能</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">读</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">根据 SR[1..0] 的值从 R0、R1、R2、R3 中选择一个寄存器的值从 S 口输出。根据 DR[1..0] 的值从 R0、R1、R2、R3 中选择一个寄存器的值从 D 口输出</td>
    </tr>
    <tr>
      <td style="text-align: center">写</td>
      <td style="text-align: center">下降沿</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">控制信号 WE 为 1，根据 DR[1..0] 的值，在 CLK 下降沿将外部输入 A 写入 R0、R1、R2、R3 中的一个寄存器。</td>
    </tr>
  </tbody>
</table>

<p>功能实现：见上表。根据 sr 和 dr 输出对应寄存器的存储值（组合逻辑）。在时钟下降沿将 i 端口的数据写入 dr 对应的寄存器（时序逻辑）。</p>

<p>Verilog HDL 实现：</p>

<div class="language-verilog highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">module</span> <span class="n">reg_group</span><span class="p">(</span>
	<span class="kt">input</span> <span class="n">we</span><span class="p">,</span>
	<span class="kt">input</span> <span class="n">clk</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">1</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">sr</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">1</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">dr</span><span class="p">,</span>
	<span class="kt">input</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">i</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">s</span><span class="p">,</span>
	<span class="kt">output</span> <span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">d</span>
<span class="p">);</span>

<span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">r0</span> <span class="o">=</span> <span class="mh">8'h01</span><span class="p">;</span>
<span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">r1</span> <span class="o">=</span> <span class="mh">8'h00</span><span class="p">;</span>
<span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">r2</span> <span class="o">=</span> <span class="mh">8'h00</span><span class="p">;</span>
<span class="kt">reg</span> <span class="p">[</span><span class="mi">7</span><span class="o">:</span><span class="mi">0</span><span class="p">]</span> <span class="n">r3</span> <span class="o">=</span> <span class="mh">8'h07</span><span class="p">;</span>

<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="kt">negedge</span> <span class="n">clk</span><span class="p">)</span> <span class="k">begin</span>
	<span class="k">case</span> <span class="p">(</span><span class="o">{</span><span class="n">we</span><span class="p">,</span> <span class="n">dr</span><span class="o">}</span><span class="p">)</span>
		<span class="mb">3'b100</span><span class="o">:</span> <span class="n">r0</span> <span class="o">&lt;=</span> <span class="n">i</span><span class="p">;</span>
		<span class="mb">3'b101</span><span class="o">:</span> <span class="n">r1</span> <span class="o">&lt;=</span> <span class="n">i</span><span class="p">;</span>
		<span class="mb">3'b110</span><span class="o">:</span> <span class="n">r2</span> <span class="o">&lt;=</span> <span class="n">i</span><span class="p">;</span>
		<span class="mb">3'b111</span><span class="o">:</span> <span class="n">r3</span> <span class="o">&lt;=</span> <span class="n">i</span><span class="p">;</span>
	<span class="k">endcase</span>
<span class="k">end</span>

<span class="k">always</span> <span class="o">@</span><span class="p">(</span><span class="o">*</span><span class="p">)</span> <span class="k">begin</span>
	<span class="k">case</span><span class="p">(</span><span class="n">sr</span><span class="p">)</span>
		<span class="mb">2'b00</span><span class="o">:</span> <span class="n">s</span> <span class="o">=</span> <span class="n">r0</span><span class="p">;</span>
		<span class="mb">2'b01</span><span class="o">:</span> <span class="n">s</span> <span class="o">=</span> <span class="n">r1</span><span class="p">;</span>
		<span class="mb">2'b10</span><span class="o">:</span> <span class="n">s</span> <span class="o">=</span> <span class="n">r2</span><span class="p">;</span>
		<span class="mb">2'b11</span><span class="o">:</span> <span class="n">s</span> <span class="o">=</span> <span class="n">r3</span><span class="p">;</span>
	<span class="k">endcase</span>
	
	<span class="k">case</span><span class="p">(</span><span class="n">dr</span><span class="p">)</span>
		<span class="mb">2'b00</span><span class="o">:</span> <span class="n">d</span> <span class="o">=</span> <span class="n">r0</span><span class="p">;</span>
		<span class="mb">2'b01</span><span class="o">:</span> <span class="n">d</span> <span class="o">=</span> <span class="n">r1</span><span class="p">;</span>
		<span class="mb">2'b10</span><span class="o">:</span> <span class="n">d</span> <span class="o">=</span> <span class="n">r2</span><span class="p">;</span>
		<span class="mb">2'b11</span><span class="o">:</span> <span class="n">d</span> <span class="o">=</span> <span class="n">r3</span><span class="p">;</span>
	<span class="k">endcase</span>
<span class="k">end</span>

<span class="k">endmodule</span>
</code></pre></div></div>

<h4 id="3311-随机存取存储器-ram">3.3.11. 随机存取存储器 RAM</h4>
<p><img src="https://s2.loli.net/2025/01/10/tkiB6ZmdCRT7qwO.png" alt="RAM 元件图" /></p>

<p>接口设计：见上图。输入地址 address[] 和时钟 inclock，控制信号 we 和 outenab。</p>

<p>功能实现：当 we 和 outenab 均为 0 时，dio 端口保持高阻态。当 we 为 1，outenab 为 0 时，在时钟上升沿将把 address 处的数据从 dio 输出。当 we 为 0，outenab 为 1 时，在时钟上升沿将 dio 端口处的数据写入 address 地址。</p>

<h2 id="四系统测试">四、系统测试</h2>
<h3 id="41-测试环境">4.1 测试环境</h3>
<p>开发软件：	Quartus II Version 9.0 Build 235 06/17/2009 SJ web Edition</p>

<p>操作系统：	Windows 11 家庭中文版 24H2</p>

<p>FPGA 型号：	Cyclone II EP2C5T144C8</p>

<h3 id="42-测试代码">4.2 测试代码</h3>
<h4 id="代码一">代码一</h4>
<p>该代码系作业提供的示范代码。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">RAM 地址</th>
      <th style="text-align: center">汇编指令</th>
      <th style="text-align: center">机器码（RAM 存放内容）</th>
      <th style="text-align: center">说明</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">0</td>
      <td style="text-align: center">JMP</td>
      <td style="text-align: center">1010 0011</td>
      <td style="text-align: center">R3 的初始值为 07h，指令执行完，PC=07h</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0001 0001</td>
      <td style="text-align: center">R0 的初始值为 01h，RAM 的 01 地址单元存放 11h</td>
    </tr>
    <tr>
      <td style="text-align: center">7</td>
      <td style="text-align: center">IN R1</td>
      <td style="text-align: center">1100 0100</td>
      <td style="text-align: center">外部引脚输入 01h，指令执行完，R1=01h</td>
    </tr>
    <tr>
      <td style="text-align: center">8</td>
      <td style="text-align: center">MOVA R2, R1</td>
      <td style="text-align: center">0100 1001</td>
      <td style="text-align: center">指令执行完，R2=01h</td>
    </tr>
    <tr>
      <td style="text-align: center">9</td>
      <td style="text-align: center">MOVC R1, M</td>
      <td style="text-align: center">0110 0100</td>
      <td style="text-align: center">RAM 的 01 单元内容 11h 赋给 R1，指令执行完，R1=11h</td>
    </tr>
    <tr>
      <td style="text-align: center">10</td>
      <td style="text-align: center">SUB R1, R2</td>
      <td style="text-align: center">1001 0110</td>
      <td style="text-align: center">指令执行完，R1=10h 且 G=1</td>
    </tr>
    <tr>
      <td style="text-align: center">11</td>
      <td style="text-align: center">MOVD R3, PC</td>
      <td style="text-align: center">0111 1100</td>
      <td style="text-align: center">取指后 PC 自加 1，此时 PC=12，那么 R3=12=0Ch</td>
    </tr>
    <tr>
      <td style="text-align: center">12</td>
      <td style="text-align: center">ADD R3, R1</td>
      <td style="text-align: center">1000 1101</td>
      <td style="text-align: center">指令执行完，R3=1Ch=28</td>
    </tr>
    <tr>
      <td style="text-align: center">13</td>
      <td style="text-align: center">JG</td>
      <td style="text-align: center">1011 0011</td>
      <td style="text-align: center">G=1，满足跳转条件，执行跳转，PC=28</td>
    </tr>
    <tr>
      <td style="text-align: center">28</td>
      <td style="text-align: center">MOVB M, R3</td>
      <td style="text-align: center">0101 0011</td>
      <td style="text-align: center">将 R3 中的数据写入 RAM</td>
    </tr>
    <tr>
      <td style="text-align: center">29</td>
      <td style="text-align: center">MOVC R1, M</td>
      <td style="text-align: center">0110 0100</td>
      <td style="text-align: center">将 RAM 的数据写入 R1，两条指令执行完，R1=R3=1Ch</td>
    </tr>
    <tr>
      <td style="text-align: center">30</td>
      <td style="text-align: center">MOVI #9</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">此为两字节指令，指令执行完后，R0=09H</td>
    </tr>
    <tr>
      <td style="text-align: center">31</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 1001</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">32</td>
      <td style="text-align: center">SUB R0, R1</td>
      <td style="text-align: center">1001 0001</td>
      <td style="text-align: center">指令执行完，R0=EDh 且 G=0</td>
    </tr>
    <tr>
      <td style="text-align: center">33</td>
      <td style="text-align: center">JG</td>
      <td style="text-align: center">1011 0011</td>
      <td style="text-align: center">G=0，不满足跳转条件，不执行跳转</td>
    </tr>
    <tr>
      <td style="text-align: center">34</td>
      <td style="text-align: center">OUT R0</td>
      <td style="text-align: center">1101 0000</td>
      <td style="text-align: center">指令执行完，输出引脚为 EDh</td>
    </tr>
    <tr>
      <td style="text-align: center">35</td>
      <td style="text-align: center">HALT</td>
      <td style="text-align: center">1111 0000</td>
      <td style="text-align: center">停机指令</td>
    </tr>
    <tr>
      <td style="text-align: center">36</td>
      <td style="text-align: center">JMP</td>
      <td style="text-align: center">1010 0011</td>
      <td style="text-align: center">此指令在停机指令后用于检测停机是否正确，正确的停机指令应该是停机后面的指令不执行</td>
    </tr>
  </tbody>
</table>

<h4 id="代码二">代码二</h4>
<p>以下代码实现了一个 \(a\times b\) 的乘法功能。其中乘数 \(a\) 从外部读入，乘数 \(b\) 存储在 <code class="language-plaintext highlighter-rouge">RAM[2]</code> 位置。要求乘数 \(a\) 以有符号数补码形式输入，乘数 \(b\) 为非负整数。该代码会持续循环运行，每次根据读入的数据更新乘法结果，持续输出。若输入数字小于 \(0\) 则停机。
R3 的初始值设为 <code class="language-plaintext highlighter-rouge">0d07</code>。</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">地址（Dec）</th>
      <th style="text-align: center">汇编指令</th>
      <th style="text-align: center">机器码</th>
      <th style="text-align: center">解释（Dec）</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">0</td>
      <td style="text-align: center">JMP</td>
      <td style="text-align: center">1010 0011</td>
      <td style="text-align: center">Goto 07</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0000</td>
      <td style="text-align: center">RAM[1] 用来存运算次数</td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0100</td>
      <td style="text-align: center">RAM[2] 用来存乘数 b</td>
    </tr>
    <tr>
      <td style="text-align: center">3</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0000</td>
      <td style="text-align: center">RAM[3] 用来存结果</td>
    </tr>
    <tr>
      <td style="text-align: center">7</td>
      <td style="text-align: center">IN R2</td>
      <td style="text-align: center">1100 1000</td>
      <td style="text-align: center">R2=Input</td>
    </tr>
    <tr>
      <td style="text-align: center">8</td>
      <td style="text-align: center">MOVI #2</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=2</td>
    </tr>
    <tr>
      <td style="text-align: center">9</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0010</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">10</td>
      <td style="text-align: center">MOVC R1, M</td>
      <td style="text-align: center">0110 0100</td>
      <td style="text-align: center">R1=RAM[2]=b</td>
    </tr>
    <tr>
      <td style="text-align: center">11</td>
      <td style="text-align: center">MOVI #1</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=1</td>
    </tr>
    <tr>
      <td style="text-align: center">12</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0001</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">13</td>
      <td style="text-align: center">MOVB M, R1</td>
      <td style="text-align: center">0101 0001</td>
      <td style="text-align: center">RAM[1]=b</td>
    </tr>
    <tr>
      <td style="text-align: center">14</td>
      <td style="text-align: center">SUB R0, R1</td>
      <td style="text-align: center">1001 0001</td>
      <td style="text-align: center">R0=1-R1, G=1&gt;R1</td>
    </tr>
    <tr>
      <td style="text-align: center">15</td>
      <td style="text-align: center">MOVI #36</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=36</td>
    </tr>
    <tr>
      <td style="text-align: center">16</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0010 0100</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">17</td>
      <td style="text-align: center">MOVA R3, R0</td>
      <td style="text-align: center">0100 1100</td>
      <td style="text-align: center">R3=R0=36</td>
    </tr>
    <tr>
      <td style="text-align: center">18</td>
      <td style="text-align: center">JG</td>
      <td style="text-align: center">1011 0011</td>
      <td style="text-align: center">If (G) Goto 36</td>
    </tr>
    <tr>
      <td style="text-align: center">19</td>
      <td style="text-align: center">MOVI #3</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=3</td>
    </tr>
    <tr>
      <td style="text-align: center">20</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0011</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">21</td>
      <td style="text-align: center">MOVC R1, M</td>
      <td style="text-align: center">0110 0100</td>
      <td style="text-align: center">将结果先复制给 R1</td>
    </tr>
    <tr>
      <td style="text-align: center">22</td>
      <td style="text-align: center">ADD R1, R2</td>
      <td style="text-align: center">1000 0110</td>
      <td style="text-align: center">R1=R1+R2</td>
    </tr>
    <tr>
      <td style="text-align: center">23</td>
      <td style="text-align: center">MOVB M, R1</td>
      <td style="text-align: center">0101 0001</td>
      <td style="text-align: center">RAM[3]=R1</td>
    </tr>
    <tr>
      <td style="text-align: center">24</td>
      <td style="text-align: center">MOVI #1</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">RAM[1]=RAM[1]-1</td>
    </tr>
    <tr>
      <td style="text-align: center">25</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0001</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">26</td>
      <td style="text-align: center">MOVC R1, M</td>
      <td style="text-align: center">0110 0100</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">27</td>
      <td style="text-align: center">SUB R1, R0</td>
      <td style="text-align: center">1001 0100</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">28</td>
      <td style="text-align: center">MOVB M, R1</td>
      <td style="text-align: center">0101 0001</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">29</td>
      <td style="text-align: center">MOVI #18</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=18</td>
    </tr>
    <tr>
      <td style="text-align: center">30</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0001 0010</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">31</td>
      <td style="text-align: center">MOVD R3, PC</td>
      <td style="text-align: center">0111 1100</td>
      <td style="text-align: center">R3=32</td>
    </tr>
    <tr>
      <td style="text-align: center">32</td>
      <td style="text-align: center">SUB R3, R0</td>
      <td style="text-align: center">1001 1100</td>
      <td style="text-align: center">R3=32-18=14</td>
    </tr>
    <tr>
      <td style="text-align: center">33</td>
      <td style="text-align: center">MOVI #1</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=1</td>
    </tr>
    <tr>
      <td style="text-align: center">34</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0001</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">35</td>
      <td style="text-align: center">JMP</td>
      <td style="text-align: center">1010 0011</td>
      <td style="text-align: center">Goto 14</td>
    </tr>
    <tr>
      <td style="text-align: center">36</td>
      <td style="text-align: center">MOVI #0</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=0</td>
    </tr>
    <tr>
      <td style="text-align: center">37</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0000</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">38</td>
      <td style="text-align: center">SUB R0, R2</td>
      <td style="text-align: center">1001 0010</td>
      <td style="text-align: center">R0=R0-R2, G=R0&gt;R2</td>
    </tr>
    <tr>
      <td style="text-align: center">39</td>
      <td style="text-align: center">MOVI #57</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=57</td>
    </tr>
    <tr>
      <td style="text-align: center">40</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0011 1001</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">41</td>
      <td style="text-align: center">MOVA R3, R0</td>
      <td style="text-align: center">0100 1100</td>
      <td style="text-align: center">R3=R0=57</td>
    </tr>
    <tr>
      <td style="text-align: center">42</td>
      <td style="text-align: center">JG</td>
      <td style="text-align: center">1011 0011</td>
      <td style="text-align: center">If (G) Goto 57</td>
    </tr>
    <tr>
      <td style="text-align: center">43</td>
      <td style="text-align: center">MOVI #3</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=3</td>
    </tr>
    <tr>
      <td style="text-align: center">44</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0011</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">45</td>
      <td style="text-align: center">MOVC R1, M</td>
      <td style="text-align: center">0110 0100</td>
      <td style="text-align: center">R1=RAM[3]</td>
    </tr>
    <tr>
      <td style="text-align: center">46</td>
      <td style="text-align: center">OUT R1</td>
      <td style="text-align: center">1101 0001</td>
      <td style="text-align: center">Output RAM[3]</td>
    </tr>
    <tr>
      <td style="text-align: center">47</td>
      <td style="text-align: center">MOVI #7</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R0=7</td>
    </tr>
    <tr>
      <td style="text-align: center">48</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0111</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">49</td>
      <td style="text-align: center">MOVA R3, R0</td>
      <td style="text-align: center">0100 1100</td>
      <td style="text-align: center">R3=R0=7</td>
    </tr>
    <tr>
      <td style="text-align: center">50</td>
      <td style="text-align: center">MOVI #0</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">R2=0</td>
    </tr>
    <tr>
      <td style="text-align: center">51</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0000</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">52</td>
      <td style="text-align: center">MOVA R2, R0</td>
      <td style="text-align: center">0100 1000</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">53</td>
      <td style="text-align: center">MOVI #3</td>
      <td style="text-align: center">1110 0000</td>
      <td style="text-align: center">RAM[3]=R2=0</td>
    </tr>
    <tr>
      <td style="text-align: center">54</td>
      <td style="text-align: center"> </td>
      <td style="text-align: center">0000 0011</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">55</td>
      <td style="text-align: center">MOVB M, R2</td>
      <td style="text-align: center">0101 0010</td>
      <td style="text-align: center"> </td>
    </tr>
    <tr>
      <td style="text-align: center">56</td>
      <td style="text-align: center">JMP</td>
      <td style="text-align: center">1010 0011</td>
      <td style="text-align: center">Goto 7</td>
    </tr>
    <tr>
      <td style="text-align: center">57</td>
      <td style="text-align: center">HALT</td>
      <td style="text-align: center">1111 0000</td>
      <td style="text-align: center">Quit</td>
    </tr>
    <tr>
      <td style="text-align: center">58</td>
      <td style="text-align: center">OUT R3</td>
      <td style="text-align: center">1101 0011</td>
      <td style="text-align: center">测试是否正常停机</td>
    </tr>
  </tbody>
</table>

<h3 id="43-测试结果">4.3 测试结果</h3>
<p>代码一功能仿真（输入 0x01）：根据代码，最终应当输出 0xED，波形符合预期，正常停机</p>

<p><img src="https://s2.loli.net/2025/01/10/UZAf1e49jgL7a6h.png" alt="代码 1 功能仿真波形" /></p>

<p>代码一时序仿真（输入 0x01）：</p>

<p><img src="https://s2.loli.net/2025/01/10/fJ9O52LajVuQsSl.png" alt="代码 1 时序仿真波形" /></p>

<p>代码二功能仿真（先输入 2，后输入 -1）：输出 4 符合预期，寄存器中间数值均符合预期，输入 -1 时正常停机</p>

<p><img src="https://s2.loli.net/2025/01/10/nDvVuwyhdsBFOCL.png" alt="代码 2 功能仿真波形-I" /></p>

<p><img src="https://s2.loli.net/2025/01/10/iRJejMxdX24Bgty.png" alt="代码 2 功能仿真波形-II" /></p>

<p>代码二时序仿真（先输入 5，后输入 -3）：</p>

<p><img src="https://s2.loli.net/2025/01/10/EfRbho5INYZFG4A.png" alt="代码 2 功能时序波形-I" /></p>

<p><img src="https://s2.loli.net/2025/01/10/nvdQCYygIwVM3DG.png" alt="代码 2 功能时序波形-II" /></p>

<h3 id="44-模型机性能分析">4.4 模型机性能分析</h3>
<p><img src="https://s2.loli.net/2025/01/10/peHJT65mksDlRP3.png" alt="时序性能" /></p>

<p><img src="https://s2.loli.net/2025/01/10/jiDu394oskdPrQA.png" alt="编译情况" /></p>

<p><img src="https://s2.loli.net/2025/01/10/erQVhIbN5En7T2f.png" alt="综合性能" /></p>

<p>性能表现良好，时钟周期为 23.35ns，warning 为 13 条。</p>

<h2 id="五实验总结心得体会及建议">五、实验总结、心得体会及建议</h2>
<h3 id="51-从需要掌握的理论遇到的困难解决的办法以及经验教训等方面进行总结">5.1 从需要掌握的理论、遇到的困难、解决的办法以及经验教训等方面进行总结。</h3>
<p>本模型机需要掌握数字电路的基础原理，需要学会使用 Quartus II 软件编写具有对应功能的模块与元件，熟悉计算机数据和信号流动的过程以及模型机的基本结构，掌握如何组装并设计简易的模型机，了解如何在 FPGA 实验板上验证功能。</p>

<p>在实验过程中，本人遇到了编写测试代码的困难，是由于对汇编编程的不熟悉导致的，在了解和学习汇编的基本方法后顺利完成了代码。在测试代码时，还发现部分指令的执行和指导书中的功能描述有细微差别，在后续修改了元件代码实现了功能统一，在解决这一困难的过程中认识到了加强小模块事先测试的重要性。</p>]]></content><author><name>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="notes" /><summary type="html"><![CDATA[前言 HNU 信院的电子电路感觉是挑战性很大的一门课，综合设计当中也会遇到很多课上不会讲的知识，网上关于 Quartus II 软件的相关资料也是少之又少。这学期的课程，本人也是在各种跌跌撞撞中查阅资料、向 AI 提问的曲折过程中，最终才实现了模型机的综合设计。这篇博客希望能给以后的同学当作参考，但也希望大家不要抄袭，独立完成之后获得的成就感是无论如何都无法取代的：完成每一个元件的代码和波形测试、把每一个自己编写的元件连接在一起、用简陋的指令集实现一个程序——这其中每一个过程对我来说都是新奇且具有挑战性的。]]></summary></entry><entry><title type="html">谨以此文献给我的 2024</title><link href="https://anicoderandy.github.io/writings/to-my-2024/" rel="alternate" type="text/html" title="谨以此文献给我的 2024" /><published>2025-01-15T07:48:00+00:00</published><updated>2025-01-15T07:48:00+00:00</updated><id>https://anicoderandy.github.io/writings/to-my-2024</id><content type="html" xml:base="https://anicoderandy.github.io/writings/to-my-2024/"><![CDATA[<p>我觉得，你是一个浪漫的人。</p>

<p>何为浪漫？浪漫是坚守正义，维护底线，不阿谀奉承，不矫揉造作。你的一行行书信，一句句批判，可能并不能改变什么，但权且算是一次有力的粒子碰撞，在湮灭前总归能发出一道微弱的光亮。当量变引起质变，那会是更明亮的曙光。——也或许是更沉寂的毁灭。你一直说，讲实话做实事，那是一个艺术家该做的最艺术的事情。执起指挥棒，放下执迷的顾虑，用你起舞的双手挥动青春，用你热情的声响震彻时代！</p>

<p>何为浪漫？浪漫是字字珠玑，情真意切的纪念。纪念一个时代的落幕，纪念一场自我的重塑。每个字节里都流淌着你的故事，每个装饰里都吐露着你的情绪。纪念更不止于文字，别忘了那些音符，那些旋律——不舍的道别，意难平中的叹息，远方的祝愿。和谐中的冲突，冲突里的和谐，无声的诅咒，阴暗的爬行，词藻的堆砌，莫名的排比……歌颂纪念！赞美纪念！愿你如愿，永远的纪念！</p>

<p>“黄昏是我一天中视力最差的时候，一眼望去满街都是美女，高楼和街道也变换了通常的形状，像在电影里。你就站在楼梯的拐角，带着某种清香的味道，有点湿乎乎的奇怪的气息，擦身而过的时候，才知道你在哭，事情就在那时候发生了。”何为浪漫？大抵只有浪漫的人才懂这段台词的意思吧。哀叹！哀叹。</p>

<p>何为浪漫？浪漫是执着于理想追求，为每一个遥不可及的理想铤而走险，为每一个白日做梦的瞬间注入幻想的底气。你记录每一条光线，描绘每一个表面，你的笔触并行点缀每一个世界，你的巧思串联每一点细节。你在《黑神话：悟空》结尾工作人员名单开始滚动时学着他有模有样地叫唤道：“路还很长，风还很邪，妖气正冲天。”</p>

<p>你总说我不懂你——世界上再没有一个你认识的人像我这样不懂你的心思。你错了，我懂你，我比谁都懂你。你的无奈，你的不解，你的苦苦追求，你的回避，你的暗自伤神，你的默哀。你是用尽力气的农夫，不再能拯救荒芜的原野；你是费尽心思的大臣，不再能赓续往日的荣光；你是伤尽精神的牧师，不再能传播圣洁的真理。每一句没能说出口的话，任由它们在心底生根发芽！每一场没打赢的仗，任由它们在心底冷嘲热讽！是那一个个无眠的夜晚，或者是每一个想要逃脱进无限遐想的瞬间——流尽了你所有的眼泪，流尽了，你却嘴硬说不要为无名的伤感落泪。你总唱着“容许我的不踌躇的注视，容许我的热情的献致”，可你的眼里总带着踌躇，你的热情只悄悄在心里绽放。</p>

<p>我爱你。纵使河旁的水仙会凋谢，纵使水中的倒影在模糊与朦胧中是一团肮脏的黑影，不具人形的野兽——我仍深沉地爱你。我向你表白——真情地表白。我做你的倾听者，我做你的传递者。请你紧紧拥抱我吧。</p>

<p>或许你也会爱我吗？</p>

<p>或许你不答应，但也恳求你不要再用那样鄙夷的目光看向我，好吗？</p>

<p>写给自己</p>

<p>2025 年 1 月 14 日凌晨</p>]]></content><author><name>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="writings" /><summary type="html"><![CDATA[我觉得，你是一个浪漫的人。]]></summary></entry><entry><title type="html">谨以此文献给我的 2023</title><link href="https://anicoderandy.github.io/writings/to-my-2023/" rel="alternate" type="text/html" title="谨以此文献给我的 2023" /><published>2024-04-17T11:37:00+00:00</published><updated>2024-04-17T11:37:00+00:00</updated><id>https://anicoderandy.github.io/writings/to-my-2023</id><content type="html" xml:base="https://anicoderandy.github.io/writings/to-my-2023/"><![CDATA[<h2 id="第一幕">第一幕</h2>

<h3 id="第一场-盛宴">第一场 盛宴</h3>

<p><strong>使者：</strong> 你终于到了。带着你满腔的热血和期许，向着荣耀和自由迈出步伐。青年，我一向欣赏你们这一点，从不担忧，从不受拘束，从不惧怕未知。所有人都为你们欢呼喝彩，你也为自己加油打气。请你向前迈进吧，秉承你无畏的精神，带上你向往光明与辉煌的想象，前去赴约吧！</p>

<p><strong>诗人：</strong> 欢呼！歌颂！咏叹！哈哈哈，所谓文化人，不过也就是把些看似振奋的词汇堆叠在一起，形成看似有哲理的句子嘛！谢谢你，尊敬的使者先生，您本该为我引路，指明一条方向，可您光会说“向前走吧”。精辟！您一定明白凡人不懂的哲学道理！什么是前方？是东是南，是西是北？是高楼是原野，是喧嚣是宁静？疑点重重！困难重重！我可再等不及了，我不懂哲学，你们总把那套理论搞得高深莫测。</p>

<p><strong>使者：</strong> 我不明白你的意思，可我劝你尽快跨过这道门槛为好。</p>

<p><strong>诗人：</strong> 不明白？你在这天上人间逍遥了如此之久，这世间还有你不能洞察的道理？</p>

<p><strong>使者：</strong> 哪里有什么天上人间，哪里又有什么大彻大悟！你本像个莽撞的战士誓要冲开隔断虚实的壁垒，而现如今却在盛宴即将开始之际拖慢了延宕的步伐？</p>

<p><strong>诗人：</strong> 我听见觥筹交错，人声鼎沸，载歌载舞。我大概知道前方何所似，我大概清楚未来何时来！我从来不会担忧，我从来不会犹豫——你看我在无虑地奔跑，你听我在放声地歌唱！活着，睡醒了，什么都开始了！——醒着也不是不可以在做梦，正如睡着了也不一定在做梦一样。我的灵魂！我的热烈的青春！我要欢呼！我要歌颂！我要咏叹！</p>

<p><em>一束白色的荧火已在周遭盘旋许久，诗人这才弯下腰注意到它。</em></p>

<p><strong>荧火：</strong> 别再徘徊，别再游荡！野外的火光大抵已然熄灭，唯有前方的黑暗兴许能给你送上温暖。别再彷徨，别再惆怅！我虽不是黑暗的领主，但却能为你揭开黑暗的面纱。别再思索，别再疯狂！梦幻的世界容不得半点理智，却也无以承载猖獗。</p>

<h3 id="第二场-阳台">第二场 阳台</h3>

<p><strong>诗人：</strong> 我从不信魔鬼和神仙的存在，我笑称自己为高尚的唯物主义者。但是您让我抛弃了信仰， 让我沉醉在我本不该拥有的快乐和幸福当中，使我淹没在征服世界的快感之中，把我埋葬在极致的理智和清醒之中。你是我的神！言语从不能表达尽我对你的虔诚和臣服。我觉得，我的天使，我已经对你了如指掌。世人大概已然忘记我们如何相识相知，你大抵也从未明察我并不纯洁的精神。无论如何，站在此地，我张开双臂，迎接您的怀抱，感悟您的教诲，享受您带给我的一切欢愉！是，我就是贪婪的化身，我要摄取，我要享用！</p>

<p><strong>荧火：</strong> 何时能结束你那怪异的宗教仪式？何时将你那宝贵的精力投入现世的快乐？</p>

<p><strong>诗人：</strong> 我会得到我想要的。</p>

<h3 id="第三场-审问">第三场 审问</h3>

<p><strong>判官：</strong> 知道自己做错什么了吗。</p>

<p><strong>诗人：</strong> 不知道。</p>

<p><strong>判官：</strong> 好一个“不知道”。 你以为你对你所踏上的道路一清二楚，你以为你的才华可以傲视群雄。睁开你的眼吧，照照镜子吧，不要再为几乎没有胜算的事情耗费心思！</p>

<p><em>天使催人泪下的歌声从远处传来。</em></p>

<p><strong>诗人：</strong> 青春的梦曾似花开，我期待生活多姿多彩。迷恋那梦里永恒爱，放纵一时上帝不责怪。</p>

<p><strong>主教：</strong> 让一切过错都被遗忘，让一切灾厄成为福报。</p>

<p><em>砍刀落下。</em></p>

<h3 id="第四场-门前">第四场 门前</h3>

<p><strong>诗人：</strong> 阳光！阳光！阳光！纵使黑暗总笼罩着我，但你依旧给我送来炽热的火光！是，我就是贪婪的化身，既然没人与我争抢，那你就是独属于我的珍藏！</p>

<p><strong>荧火：</strong> 阳光！阳光！阳光！我与你同乐，我与你共舞！</p>

<h3 id="第五场-巨浪">第五场 巨浪</h3>

<p><strong>诗人：</strong> 我曾经历过更大的暴风雨，又怎会惧怕你这般微小的浪潮？我不会自诩为海燕，因为我并不会飞翔；但我并不会就此退缩，不能翱翔，至少我有屹立在暴风雨正中央的力量！</p>

<p><strong>荧火：</strong> 可我没有力量！</p>

<p><strong>诗人：</strong> 力量是坚定意志沉淀良久的产物，纵使风浪再大，意志也能将其抵御。</p>

<p><strong>荧火：</strong> 可我没有意志！</p>

<p><strong>诗人：</strong> 别再担忧，别再惧怕！没有经历，又怎知道结果？</p>

<p><em>一阵巨浪卷来，荧火消失不见。</em></p>

<p><em>一阵巨浪卷来，诗人被拖入海底。</em></p>

<h2 id="第二幕">第二幕</h2>

<h3 id="第一场-决斗">第一场 决斗</h3>

<p><strong>诗人：</strong> 人们只愿意相信他们自以为的事实。他们欢呼，他们歌颂，他们咏叹。坏的自然被褒成了好的，好的自然被贬成了坏的。念叨着念叨着，他们仿佛真的相信了。对啊，相信可不是一件好事吗？有一件他所相信的事情，他所做的一切都好像合理了起来、正当了起来。世上没有恶人，所有人都是正人君子！世上没有错事，所有事都无可挑剔！每个人都做着正确的事情，他们正当地骄奢淫逸，他们正当地杀人放火，正如每颗星球都正确地旋转着，每个星系都正确地运转着……相信可不是一件好事。有一件他所相信的事情，世界好像失常了一般，所有人都在犯错！所有人都在犯傻！所有人都在犯贱！……我不想再进行这样毫无意义的思考。有的诗人适合当个哲人，我并不像是那种人。我只是个在普通不过的诗人，一个孤立无援的诗人——一个独立自强的诗人，一个自命不凡的诗人！烈火熊熊燃烧，我的心血早已沸腾！我痛恨一切阻碍，我蔑视一切好意。我要放歌，我要让全世界都听见我的歌声！我要翱翔，我要让全世界都看到我的英姿！</p>

<p><em>诗人举起匕首，插进了心脏。</em></p>

<h3 id="第二场-问号">第二场 问号</h3>

<p><em>数不清的黑影在诗人身旁穿梭。</em></p>

<p><strong>诗人：</strong> 无尽的黑暗将人裹挟，无涯的苦难让人发怵。不要抬头，因为抬头就会让你陷入深思——深思正是无涯的苦难。为什么他们匆匆忙忙，为什么他们欢声笑语，为什么他们成群结队？诚然，我并不该属于这个世界，故并无权过问，无以知晓。或许我更不该逗留，让无端的思绪玷污纯真的世间。</p>

<p><em>半空中传来诡异的声音。</em></p>

<p><strong>异响：</strong> 前行！</p>

<p><strong>诗人：</strong> 我向哪里去前行？这里哪有留给我走的道路——我所看到的一切可能都已经被无数黑暗堵得水泄不通。</p>

<p><strong>异响：</strong> 突破！</p>

<p><strong>诗人：</strong> 我哪里来突破的勇气？任何微弱的火苗都有毁灭绵延万里的树林的潜力，一切向未知的迈进都是在敲响末日的大门！——沉默，低头，沉默……</p>

<p><strong>异响：</strong> 忘却！</p>

<p><strong>诗人：</strong> 忘却？对，我要忘却！忘掉一切虚伪的、可笑的、浮夸的！可你让我如何才能忘却？不要低头，因为低头就会让你陷入回忆——回忆正是灵魂深处的拷问，振聋发聩的拷问。</p>

<h3 id="第三场-叹号">第三场 叹号</h3>

<p><strong>诗人：</strong> 前行！突破！忘却！我要质疑，我要批判，我要进步！</p>

<p><em>黑影的流动变得缓慢。</em></p>

<p><strong>诗人：</strong> 你听，我的歌声嘹亮！你看，我的剑锋上闪烁着光芒！我没有死，我还活着，我活得很好！我是羽毛，为人爱惜；我是珍珠，为人收藏；我是神话，为人传说！</p>

<h3 id="第四场-晴空">第四场 晴空</h3>

<p><strong>诗人：</strong> 阳光！阳光！阳光！您的光芒如此璀璨，让我沐浴在圣洁的怀抱中！我要给予，我也要索取。我要奔跑，我要与您一同闪耀！</p>

<h3 id="第五场-暴雨">第五场 暴雨</h3>

<p><strong>风暴：</strong> 无理的闯入者，这片神圣的土地怎容的下你来践踏？</p>

<p><em>诗人全身淋湿。</em></p>

<p><strong>诗人：</strong> 不要再捉弄我，我知道你想要什么——再多的折磨也无济于事，你不会得逞，你也从没有赢过。</p>

<p><strong>风暴：</strong> 是谁给你的自信？</p>

<p><em>暴雨更加猛烈，诗人被击倒在地。</em></p>

<p><strong>诗人：</strong> 我并不惧怕，你接着来！</p>

<p><em>电闪雷鸣，荧光闪现。</em></p>

<p><strong>诗人：</strong> 我本要将这世界歌颂，但我，我……要在沉默中爆发，也要在沉默中灭亡。</p>

<p><em>诗人持起匕首，向荧光砍去。</em></p>

<h3 id="第六场-句号">第六场 句号</h3>

<p><strong>诗人：</strong> 你是谁？</p>

<p><strong>作家：</strong> 我是个作家。但我只会写句号。我要给世间的每一部作品画上句号。</p>

<p><strong>诗人：</strong> 你为什么这么做？</p>

<p><strong>作家：</strong> 没有句号的作品从不是完整的。每一个故事都需要被终结，就像我们的宇宙总有一天会走向终点一样。人们总是舍不得给他们的故事画上句号，总觉得会有种种希望将那个一步步走向美好与幸福的故事延续下去，那自然是极好的慰藉。但也许你知道——或不知道，那种人多半生活在虚伪和飘渺之中。沉寂在过去，意淫出各式各样谁看了都会忍不住笑的离奇续写。他们以为自己能力挽狂澜，却不知事已至此，再多挽救也无济于事。他们总以为我是残忍的刽子手，但我却以为我是引他们走出困顿的救星。——话说你来这找我有何贵干吗？没什么事的话我可要继续工作了。</p>

<p><em>作家执起笔，又在纸上画上一个句号。</em></p>

<p>Feb 25 - Mar 2, 2024</p>

<h2 id="后记">后记</h2>

<p>2023 年对我以及对于很多人来说都是经历了许多不平常的一年。我很想用些独特的方式来记录这一年中的欢乐、惆怅与迷茫。</p>

<p>于是我便在这学期刚开学的时候加班加点把这篇体裁是戏剧的文章作完了。我对戏剧有着浓厚的兴趣，但毕竟是门外汉，写出来的东西一定没什么文学和艺术上的价值，还请读者抱着图一乐的心态去看看这位作者离奇的精神状态。</p>

<p>作品当中把很多 2023 年里在我身边发生的具象的事情都做了抽象化的处理，我不知道我为什么要这么做。期待一个懂我的人去看懂？——那为什么要设下这种谜题来考验他们？在读者与作者之间建起一座高墙，防止他们窥见作者脆弱的内心？——那为什么还要写出这篇文章，还发出来呢？</p>

<p>放下读者不谈。兴许多年以后本文作者再去读它，也会忘记多年以前他所创造的这些意象、幻想都指代着什么了吧。</p>

<p>Apr 17, 2024</p>]]></content><author><name>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="writings" /><summary type="html"><![CDATA[第一幕]]></summary></entry><entry><title type="html">题解 - CodeForces 1902E Collapsing Strings</title><link href="https://anicoderandy.github.io/solution/sol-cf1902e/" rel="alternate" type="text/html" title="题解 - CodeForces 1902E Collapsing Strings" /><published>2023-12-06T11:45:00+00:00</published><updated>2023-12-06T11:45:00+00:00</updated><id>https://anicoderandy.github.io/solution/sol-cf1902e</id><content type="html" xml:base="https://anicoderandy.github.io/solution/sol-cf1902e/"><![CDATA[<p><a href="https://codeforces.com/contest/1902/problem/E">题目传送门</a></p>

<h2 id="分析">分析</h2>

<p>要求 \(\sum_i^n\sum_j^n C(i,j)\)，直接计算至少需要 \(O(n^2)\) 的时间复杂度，所以考虑使用某种数据结构维护所有字符串的相关信息，使得遍历每个字符串都能计算它对答案的贡献。既然是 \(n\) 个字符串，那么不妨使用 Trie 来维护。</p>

<p>对于每个字符串，不妨考虑它对答案的贡献取决于它的前缀和其他字符串后缀，故考虑建立一个由所有字符串的<strong>逆序</strong>串组成的 Trie。</p>

<p>对于 Trie 上的每个点，记录该点包含的字符串个数 \(cnt\) 以及该点记录的所有字符串长度之和 \(sz\)。遍历每个字符串，用 Trie 尝试将所有逆序字符串与当前字符串的正序进行匹配，对于当前字符串的某一位，如果匹配到的字符串个数减少，也就说明存在某些字符串<strong>不再能与当前字符串首尾抵消</strong>，我们可以利用当前匹配到的位数、这些字符串的长度、当前字符串的长度计算当前字符串与它们产生的贡献。具体地，当前匹配的字符串长度为 \(len\)，匹配到第 \(j\) 位时从 Trie 上的 \(u\) 节点转移到 \(v\) 节点，产生的贡献值为</p>

\[(len - j) \times (cnt[u] - cnt[v]) + (sz[u] - sz[v]) - (cnt[u] - cnt[v]) \times j\]

<p>其中 \(cnt[u] - cnt[v]\) 即为前文提到的“某些字符串”的个数，\(sz[u] - sz[v]\) 即为“某些字符串”的总长度。时间复杂度 \(O(\sum_i^n\lvert s_i\rvert)\)。</p>

<h2 id="c20-实现">C++20 实现</h2>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;utility&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;ranges&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&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="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ull</span><span class="p">;</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">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">ch</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">ch</span> <span class="o">&lt;</span> <span class="sc">'0'</span> <span class="o">||</span> <span class="n">ch</span> <span class="o">&gt;</span> <span class="sc">'9'</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span><span class="p">(</span><span class="n">ch</span> <span class="o">==</span> <span class="sc">'-'</span><span class="p">)</span> <span class="n">f</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
        <span class="n">ch</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">ch</span> <span class="o">&gt;=</span> <span class="sc">'0'</span> <span class="o">&amp;&amp;</span> <span class="n">ch</span> <span class="o">&lt;=</span> <span class="sc">'9'</span><span class="p">)</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">&lt;&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">ch</span> <span class="o">-</span> <span class="sc">'0'</span><span class="p">;</span>
        <span class="n">ch</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">x</span> <span class="o">*</span> <span class="n">f</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">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="c1">// trie[i][x]记录了节点i转移至字母x对应的节点编号</span>
<span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">trie</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">26</span><span class="p">],</span> <span class="n">tot</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">cnt</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">sz</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>
<span class="n">string</span> <span class="n">s</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>

<span class="kt">void</span> <span class="n">sol</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">cin</span> <span class="o">&gt;&gt;</span> <span class="n">s</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="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">pos</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">len</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">();</span>
        <span class="n">sz</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">+=</span> <span class="n">len</span><span class="p">,</span> <span class="n">cnt</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
        <span class="c1">// 逆序遍历</span>
        <span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="n">j</span> <span class="o">:</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">|</span> <span class="n">views</span><span class="o">::</span><span class="n">reverse</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">trie</span><span class="p">[</span><span class="n">pos</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">])</span> <span class="n">trie</span><span class="p">[</span><span class="n">pos</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">]</span> <span class="o">=</span> <span class="o">++</span><span class="n">tot</span><span class="p">;</span>
            <span class="n">pos</span> <span class="o">=</span> <span class="n">trie</span><span class="p">[</span><span class="n">pos</span><span class="p">][</span><span class="n">j</span> <span class="o">-</span> <span class="sc">'a'</span><span class="p">];</span>
            <span class="n">cnt</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">++</span><span class="p">;</span>
            <span class="n">sz</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">+=</span> <span class="n">len</span><span class="p">;</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">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="kt">int</span> <span class="n">from</span><span class="p">,</span> <span class="n">to</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">s</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</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">from</span> <span class="o">=</span> <span class="n">to</span><span class="p">,</span> <span class="n">to</span> <span class="o">=</span> <span class="n">trie</span><span class="p">[</span><span class="n">from</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="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="sc">'a'</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="p">(</span><span class="n">cnt</span><span class="p">[</span><span class="n">from</span><span class="p">]</span> <span class="o">-</span> <span class="n">cnt</span><span class="p">[</span><span class="n">to</span><span class="p">])</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="n">size</span><span class="p">()</span> <span class="o">-</span> <span class="n">j</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">sz</span><span class="p">[</span><span class="n">from</span><span class="p">]</span> <span class="o">-</span> <span class="n">sz</span><span class="p">[</span><span class="n">to</span><span class="p">]);</span>
        <span class="p">}</span>
        <span class="c1">// 特别考虑匹配完当前字符串所有字符之后的情况</span>
        <span class="n">ans</span> <span class="o">+=</span> <span class="n">sz</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">-</span> <span class="mi">1ll</span> <span class="o">*</span> <span class="n">cnt</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">*</span> <span class="n">s</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">();</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%lld</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ans</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">sol</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>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="solution" /><summary type="html"><![CDATA[题目传送门 分析 要求 \(\sum_i^n\sum_j^n C(i,j)\)，直接计算至少需要 \(O(n^2)\) 的时间复杂度，所以考虑使用某种数据结构维护所有字符串的相关信息，使得遍历每个字符串都能计算它对答案的贡献。既然是 \(n\) 个字符串，那么不妨使用 Trie 来维护。 对于每个字符串，不妨考虑它对答案的贡献取决于它的前缀和其他字符串后缀，故考虑建立一个由所有字符串的逆序串组成的 Trie。 对于 Trie 上的每个点，记录该点包含的字符串个数 \(cnt\) 以及该点记录的所有字符串长度之和 \(sz\)。遍历每个字符串，用 Trie 尝试将所有逆序字符串与当前字符串的正序进行匹配，对于当前字符串的某一位，如果匹配到的字符串个数减少，也就说明存在某些字符串不再能与当前字符串首尾抵消，我们可以利用当前匹配到的位数、这些字符串的长度、当前字符串的长度计算当前字符串与它们产生的贡献。具体地，当前匹配的字符串长度为 \(len\)，匹配到第 \(j\) 位时从 Trie 上的 \(u\) 节点转移到 \(v\) 节点，产生的贡献值为 \[(len - j) \times (cnt[u] - cnt[v]) + (sz[u] - sz[v]) - (cnt[u] - cnt[v]) \times j\] 其中 \(cnt[u] - cnt[v]\) 即为前文提到的“某些字符串”的个数，\(sz[u] - sz[v]\) 即为“某些字符串”的总长度。时间复杂度 \(O(\sum_i^n\lvert s_i\rvert)\)。 C++20 实现 #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;vector&gt; #include &lt;utility&gt; #include &lt;algorithm&gt; #include &lt;ranges&gt; #include &lt;string&gt; using namespace std; typedef long long ll; typedef unsigned long long ull; ll read() { ll x = 0, f = 1; char ch = getchar(); while(ch &lt; '0' || ch &gt; '9') { if(ch == '-') f = -1; ch = getchar(); } while(ch &gt;= '0' &amp;&amp; ch &lt;= '9') { x = (x &lt;&lt; 3) + (x &lt;&lt; 1) + ch - '0'; ch = getchar(); } return x * f; } const int N = 1e6 + 10; // trie[i][x]记录了节点i转移至字母x对应的节点编号 int n, trie[N][26], tot = 1, cnt[N], sz[N]; string s[N]; void sol() { n = read(); for (int i = 1; i &lt;= n; i++) cin &gt;&gt; s[i]; for (int i = 1; i &lt;= n; i++) { int pos = 1, len = s[i].size(); sz[1] += len, cnt[1]++; // 逆序遍历 for (auto j : s[i] | views::reverse) { if (!trie[pos][j - 'a']) trie[pos][j - 'a'] = ++tot; pos = trie[pos][j - 'a']; cnt[pos]++; sz[pos] += len; } } ll ans = 0; for (int i = 1; i &lt;= n; i++) { int from, to = 1; for (int j = 0; j &lt; s[i].size(); j++) { from = to, to = trie[from][s[i][j] - 'a']; ans += 1ll * (cnt[from] - cnt[to]) * (s[i].size() - j * 2) + (sz[from] - sz[to]); } // 特别考虑匹配完当前字符串所有字符之后的情况 ans += sz[to] - 1ll * cnt[to] * s[i].size(); } printf("%lld\n", ans); } int main() { sol(); return 0; }]]></summary></entry><entry><title type="html">题解 - CodeForces 1898E Sofia and Strings</title><link href="https://anicoderandy.github.io/solution/sol-cf1898e/" rel="alternate" type="text/html" title="题解 - CodeForces 1898E Sofia and Strings" /><published>2023-11-21T12:13:00+00:00</published><updated>2023-11-21T12:13:00+00:00</updated><id>https://anicoderandy.github.io/solution/sol-cf1898e</id><content type="html" xml:base="https://anicoderandy.github.io/solution/sol-cf1898e/"><![CDATA[<p><a href="https://codeforces.com/contest/1898/problem/E">题目传送门</a></p>
<h2 id="分析">分析</h2>
<p>注意到：对某个长度为 \(n\) 的子串进行排序操作，可以拆分成若干次对长度为 \(2\) 的子串排序的操作。具体地，对于子串 \(s_is_{i+1}\)，如果 \(s_i&gt;s_{i+1}\)，调换两者顺序；否则不进行任何操作。所以，不妨化繁为简，每次只对长度为 \(2\) 的子串考虑排序操作。</p>

<p>基于上面的思考，若能构造出目标字符串，目标字符串中的每个元素 \(t_i\)，要么是在原地没有因为排序移动过，要么被比它小的字符调换到右边，要么被比它大的字符调换到左边。形式化地，记 \(t_i\) 在 \(s\) 中的原始下标为 \(now_i\)，那么对于所有满足 \(t_j&lt;t_i\) 且 \(j&gt;i\) 的 \(j\)，有 \(now_j&gt;now_i\)，对于所有满足 \(t_j&gt;t_i\) 且 \(j&lt;i\) 的 \(j\)，有 \(now_j&lt;now_i\)。</p>

<p>不妨考虑贪心，从小到大循环 \(26\) 个小写字母，从右往左填入当前循环的字母，记录 \(now\) 在当前位置的后缀最小值 \(mi\)，最大化当前位置的 \(now_i\)，使得 \(now_i&lt; mi\)。如果不存在这样的 \(now_i\)，则无法构造目标字符串。具体实现时可以分别预先记录每个字母在原字符串、目标字符串中的位置，方便填入。时间复杂度接近 \(O(\alpha\cdot m)\)，本题 \(\alpha=26\)。</p>

<h2 id="c实现">C++实现</h2>
<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// C++11 or later</span>
<span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;utility&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstring&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="kt">unsigned</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ull</span><span class="p">;</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">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">f</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">ch</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">ch</span> <span class="o">&lt;</span> <span class="sc">'0'</span> <span class="o">||</span> <span class="n">ch</span> <span class="o">&gt;</span> <span class="sc">'9'</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span><span class="p">(</span><span class="n">ch</span> <span class="o">==</span> <span class="sc">'-'</span><span class="p">)</span> <span class="n">f</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
        <span class="n">ch</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">ch</span> <span class="o">&gt;=</span> <span class="sc">'0'</span> <span class="o">&amp;&amp;</span> <span class="n">ch</span> <span class="o">&lt;=</span> <span class="sc">'9'</span><span class="p">)</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">&lt;&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">ch</span> <span class="o">-</span> <span class="sc">'0'</span><span class="p">;</span>
        <span class="n">ch</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">x</span> <span class="o">*</span> <span class="n">f</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">const</span> <span class="kt">int</span> <span class="n">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">m</span><span class="p">,</span> <span class="n">now</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>
<span class="kt">char</span> <span class="n">given</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">target</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>
<span class="c1">// v1记录每个字母在原字符串中的位置，v2记录每个字母在目标字符串中的位置</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v1</span><span class="p">[</span><span class="mi">26</span><span class="p">],</span> <span class="n">v2</span><span class="p">[</span><span class="mi">26</span><span class="p">];</span>

<span class="kt">bool</span> <span class="n">sol</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">25</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="n">v1</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="n">v2</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="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">scanf</span><span class="p">(</span><span class="s">"%s"</span><span class="p">,</span> <span class="n">given</span> <span class="o">+</span> <span class="mi">1</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">target</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">now</span><span class="p">,</span> <span class="mh">0x7f</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">m</span> <span class="o">+</span> <span class="mi">2</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">v1</span><span class="p">[</span><span class="n">given</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="n">push_back</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">m</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
        <span class="n">v2</span><span class="p">[</span><span class="n">target</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="n">push_back</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>
    <span class="c1">// 循环26个字母：</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">25</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">v1</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;</span> <span class="n">v2</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span><span class="p">())</span> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">v2</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">empty</span><span class="p">())</span> <span class="k">continue</span><span class="p">;</span>
        <span class="k">auto</span> <span class="n">p1</span> <span class="o">=</span> <span class="n">v1</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">rbegin</span><span class="p">(),</span> <span class="n">p2</span> <span class="o">=</span> <span class="n">v2</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">rbegin</span><span class="p">();</span>

        <span class="kt">int</span> <span class="n">mi</span> <span class="o">=</span> <span class="mh">0x7f7f7f7f</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">m</span><span class="p">;</span> <span class="n">j</span> <span class="o">&gt;=</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">p1</span> <span class="o">==</span> <span class="n">v1</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">rend</span><span class="p">())</span> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
            <span class="n">mi</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">now</span><span class="p">[</span><span class="n">j</span><span class="p">],</span> <span class="n">mi</span><span class="p">);</span>
            <span class="c1">// 试图使即将填入的now[i]小于mi</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">mi</span> <span class="o">&lt;</span> <span class="o">*</span><span class="n">p1</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">while</span> <span class="p">(</span><span class="n">p1</span> <span class="o">!=</span> <span class="n">v1</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">rend</span><span class="p">())</span>
                    <span class="k">if</span> <span class="p">(</span><span class="o">*</span><span class="n">p1</span> <span class="o">&gt;</span> <span class="n">mi</span><span class="p">)</span> <span class="n">p1</span><span class="o">++</span><span class="p">;</span>
                    <span class="k">else</span> <span class="k">break</span><span class="p">;</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">p1</span> <span class="o">==</span> <span class="n">v1</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">rend</span><span class="p">())</span> <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">j</span> <span class="o">==</span> <span class="o">*</span><span class="n">p2</span><span class="p">)</span> <span class="n">now</span><span class="p">[</span><span class="o">*</span><span class="p">(</span><span class="n">p2</span><span class="o">++</span><span class="p">)]</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="n">p1</span><span class="o">++</span><span class="p">);</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">p2</span> <span class="o">==</span> <span class="n">v2</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">rend</span><span class="p">())</span> <span class="k">break</span><span class="p">;</span>  <span class="c1">// 当前字母已经填完了</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">tc</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">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="k">if</span> <span class="p">(</span><span class="n">sol</span><span class="p">())</span> <span class="n">printf</span><span class="p">(</span><span class="s">"YES</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
        <span class="k">else</span> <span class="n">printf</span><span class="p">(</span><span class="s">"NO</span><span class="se">\n</span><span class="s">"</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">tc</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>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="solution" /><summary type="html"><![CDATA[题目传送门 分析 注意到：对某个长度为 \(n\) 的子串进行排序操作，可以拆分成若干次对长度为 \(2\) 的子串排序的操作。具体地，对于子串 \(s_is_{i+1}\)，如果 \(s_i&gt;s_{i+1}\)，调换两者顺序；否则不进行任何操作。所以，不妨化繁为简，每次只对长度为 \(2\) 的子串考虑排序操作。 基于上面的思考，若能构造出目标字符串，目标字符串中的每个元素 \(t_i\)，要么是在原地没有因为排序移动过，要么被比它小的字符调换到右边，要么被比它大的字符调换到左边。形式化地，记 \(t_i\) 在 \(s\) 中的原始下标为 \(now_i\)，那么对于所有满足 \(t_j&lt;t_i\) 且 \(j&gt;i\) 的 \(j\)，有 \(now_j&gt;now_i\)，对于所有满足 \(t_j&gt;t_i\) 且 \(j&lt;i\) 的 \(j\)，有 \(now_j&lt;now_i\)。 不妨考虑贪心，从小到大循环 \(26\) 个小写字母，从右往左填入当前循环的字母，记录 \(now\) 在当前位置的后缀最小值 \(mi\)，最大化当前位置的 \(now_i\)，使得 \(now_i&lt; mi\)。如果不存在这样的 \(now_i\)，则无法构造目标字符串。具体实现时可以分别预先记录每个字母在原字符串、目标字符串中的位置，方便填入。时间复杂度接近 \(O(\alpha\cdot m)\)，本题 \(\alpha=26\)。 C++实现 // C++11 or later #include &lt;iostream&gt; #include &lt;cstdio&gt; #include &lt;vector&gt; #include &lt;utility&gt; #include &lt;algorithm&gt; #include &lt;cstring&gt; using namespace std; typedef long long ll; typedef unsigned long long ull; ll read() { ll x = 0, f = 1; char ch = getchar(); while(ch &lt; '0' || ch &gt; '9') { if(ch == '-') f = -1; ch = getchar(); } while(ch &gt;= '0' &amp;&amp; ch &lt;= '9') { x = (x &lt;&lt; 3) + (x &lt;&lt; 1) + ch - '0'; ch = getchar(); } return x * f; } const int N = 2e5 + 10; int n, m, now[N]; char given[N], target[N]; // v1记录每个字母在原字符串中的位置，v2记录每个字母在目标字符串中的位置 vector&lt;int&gt; v1[26], v2[26]; bool sol() { for (int i = 0; i &lt;= 25; i++) v1[i].clear(), v2[i].clear(); n = read(), m = read(); scanf("%s", given + 1); scanf("%s", target + 1); memset(now, 0x7f, sizeof(int) * (m + 2)); for (int i = 1; i &lt;= n; i++) v1[given[i] - 'a'].push_back(i); for (int i = 1; i &lt;= m; i++) v2[target[i] - 'a'].push_back(i); // 循环26个字母： for (int i = 0; i &lt;= 25; i++) { if (v1[i].size() &lt; v2[i].size()) return false; if (v2[i].empty()) continue; auto p1 = v1[i].rbegin(), p2 = v2[i].rbegin(); int mi = 0x7f7f7f7f; for (int j = m; j &gt;= 1; j--) { if (p1 == v1[i].rend()) return false; mi = min(now[j], mi); // 试图使即将填入的now[i]小于mi if (mi &lt; *p1) { while (p1 != v1[i].rend()) if (*p1 &gt; mi) p1++; else break; if (p1 == v1[i].rend()) return false; } if (j == *p2) now[*(p2++)] = *(p1++); if (p2 == v2[i].rend()) break; // 当前字母已经填完了 } } return true; } void tc() { int t = read(); while (t--) { if (sol()) printf("YES\n"); else printf("NO\n"); } } int main() { tc(); return 0; }]]></summary></entry><entry><title type="html">OI 2021 退役记</title><link href="https://anicoderandy.github.io/experience/oi-2021/" rel="alternate" type="text/html" title="OI 2021 退役记" /><published>2022-01-23T16:31:00+00:00</published><updated>2022-01-23T16:31:00+00:00</updated><id>https://anicoderandy.github.io/experience/oi-2021</id><content type="html" xml:base="https://anicoderandy.github.io/experience/oi-2021/"><![CDATA[<h2 id="引言">引言</h2>

<p>这篇游寄从 12 月 4 日（其实也不算早了（雾））就开始写（shui）了，但因为准备会考艺术节等等各种各样的原因，一直咕到今天才完成。</p>

<p>坐标江苏，今年高二。不出意外，这应该是我OI生涯的最后一年。</p>

<h2 id="初赛日">初赛日</h2>

<p>考前“预习”了主定理<del>（学了四年多连主定理都不知道的我是屑）</del>和计算机常识<del>（为什么信息学史也算是“常识”啊）</del>。</p>

<p>疫情原因，今年考点与往年不同，但监考老师却全是熟悉的面孔（）。</p>

<p>好耶，第一题是新鲜的Linux题！</p>

<p>好耶，前四题都是送分题！</p>

<p>好家伙，第五题不是历史悠久的历年原题（要求 \(2n\) 个数组成数列的最大值最小值，最坏情况下需要比较多少次）吗，原谅我只会暴力求解，错了 2 分。</p>

<p>然后甚至错了智障的第七题（无向图至少有多少个点），第十二题（递归求斐波那契数列的时间复杂度）。数学不好组合计数题直接废掉（）。</p>

<p>阅读程序第一题，说实话看着挺蒙，我甚至都不知道 <code class="language-plaintext highlighter-rouge">acos(0.5)=pi/3</code>，准确地说，我连 <code class="language-plaintext highlighter-rouge">acos</code> 是什么都不知道<del>（但我知道 \(\arccos\) 是什么东西）</del>……连猜带蒙，竟然做对了每一题（尽管我知道它是水题，但终究还是吃了数学不好的亏）。</p>

<p>之后的两段阅读程序，可以说直接开摆，几乎属于是完全看不懂。对于第二段程序，赛后看到巨佬发言说是“《LIS 的两种经 典 求 法》”，身为只会二分和 DP 的小蒟蒻只能瑟瑟发抖（）。第三段程序倒是看懂了，但并没有想到阴间的 CCF 会给一段错误的解码程序……</p>

<p>完善程序 T1 直接水过去了，但也花了挺久，比往年的 T1 阴间了不少（）。T2，我只能说，四毛子，笛卡尔树，Euler 序列我是一个没听说过，只能完全靠蒙（）。</p>

<p>最后得分：\(68.5\)</p>

<h2 id="csp-s-2021">CSP-S 2021</h2>

<p>SCP 之前三周内做了几套牛客的模拟赛，提前感受到了被完虐的感受（）。</p>

<p>考试前两天学校开运动会，<del>这种活动当然得直接翘掉了啊（），</del>复习了 Tarjan、快速幂等几个很水的模板。</p>

<p>10 月 20 日晚上教练开了线上会议，JS 终于有了船新的提交系统！检查数组越界好耶！不用自己建文件夹好耶！Windows 下的 VSCode 好耶！</p>

<p>10 月 23 日上午到达南京，吃完午饭看到 J 组的试题，看到 J 组的题那么水，就预言 S 组会很毒瘤（）。</p>

<p>到达南京航空航天大学，试机，立刻找到了 VSCode 并试图调教它。我想先写一个编译 <code class="language-plaintext highlighter-rouge">bat</code> 脚本，但似乎机房的 PowerShell 版本和我平时用到的似乎不太一样，所以导致我都不会在脚本中读入。但那个 VSCode 似乎支持自动查错<del>（就挺好）</del>，所以我在那一场比赛中就选择了使用 VSCode 写代码，然后手动输入指令编译……</p>

<p>发题。开 O2 好耶！（）</p>

<blockquote>
  <p><strong>4小时以后，面对收代码的监考老师，AnicoderAndy将会回想起只做了一道题甚至还没做出来的那个遥远的下午。</strong></p>

  <p>——《四小时孤独》</p>
</blockquote>

<p>看到这样的 <a href="https://www.luogu.com.cn/problem/P7913">T1</a>，立刻能反应出这是一道思维题，<del>然而也就只能反应出这是一道思维题（</del>，在草稿纸上画出来几条线段大概知道贪心策略是要尽可能使每架飞机到达靠前的廊桥。于是立刻想到要用优先队列维护，每次取出当前结束时间最早的廊桥，如果它可以接纳当前到达的飞机则更新它的结束时间，否则新开辟一个廊桥。然而很快样例 3 就打了我的脸，但当时并没有发现问题所在，于是看 T2 。</p>

<p><a href="https://www.luogu.com.cn/problem/P7914">T2</a> 题面很好懂，但就是看不出来是什么算法，<del>（当时的我甚至不知道计数题可以朝DP的方向去想。</del>开始着手写暴力，但写着写着又意识到问题不对劲了起来——对于本题，因为对于“超级括号序列”的定义过于复杂，暴力的 <code class="language-plaintext highlighter-rouge">check</code> 函数可以说是相当不好写，所以直接放弃了（）。于是赶忙看 <a href="https://www.luogu.com.cn/problem/P7915">T3</a>，立刻能反应出这是一道思维题，然而也就只能反应出这是一道思维题（梅开二度），在草稿纸上推了半天也没有得到什么有用的规律，在急急忙忙之中感觉为了稳得赶快回去再看看 T1。</p>

<p>对于原来错误的做法，显然并非只有结束时间最早的廊桥有可能接纳当前到达的飞机，还有次小、次次小的等等都可以尝试，于是我就走上了负优化的不归途，不断取出最早的廊桥，看是否能接纳当前飞机。至于那些不符合要求的廊桥……我选择了建立一个栈临时将它们存储起来，在整个过程之后把它们一个一个地塞回原序列……调试的时候依旧出了问题，所以就写了一个纯暴力的程序做对照，最后把这个奇奇怪怪的做法调出来了，并且过了那个水得不行的大样例。我不会算它的复杂度，所以姑且认作 \(O(玄学)\)。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><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">m1</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">u1</span><span class="p">)</span> <span class="n">u1</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">l1</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">b</span><span class="p">,</span> <span class="n">s1</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">pq1</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="o">-</span><span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">b</span><span class="p">,</span> <span class="mi">1</span><span class="p">));</span>
        <span class="k">else</span> <span class="p">{</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">xx</span><span class="p">;</span> <span class="n">xx</span><span class="p">.</span><span class="n">first</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">xx</span><span class="p">.</span><span class="n">second</span> <span class="o">=</span> <span class="mh">0x7f7f7f7f</span><span class="p">;</span>
            <span class="k">while</span> <span class="p">(</span><span class="n">pq1</span><span class="p">.</span><span class="n">size</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">pq1</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">first</span> <span class="o">&gt;</span> <span class="n">in</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="k">break</span><span class="p">;</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="n">second</span> <span class="o">&gt;</span> <span class="n">pq1</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">xx</span> <span class="o">=</span> <span class="n">pq1</span><span class="p">.</span><span class="n">top</span><span class="p">();</span>
                <span class="n">stk</span><span class="p">[</span><span class="o">++</span><span class="n">top</span><span class="p">]</span> <span class="o">=</span> <span class="n">pq1</span><span class="p">.</span><span class="n">top</span><span class="p">();</span> <span class="n">pq1</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
            <span class="p">}</span>
            <span class="k">while</span> <span class="p">(</span><span class="n">top</span><span class="p">)</span> <span class="p">{</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">top</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="k">if</span> <span class="p">(</span><span class="n">stk</span><span class="p">[</span><span class="n">top</span><span class="p">]</span> <span class="o">!=</span> <span class="n">xx</span><span class="p">)</span> <span class="n">pq1</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">stk</span><span class="p">[</span><span class="n">top</span><span class="p">]);</span>
                <span class="n">top</span><span class="o">--</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="c1">// cout &lt;&lt; -pq1.top().first &lt;&lt; ' ' &lt;&lt; pq1.top().second &lt;&lt; ' ' &lt;&lt; in[i].a &lt;&lt; endl;</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">xx</span><span class="p">.</span><span class="n">first</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">l1</span><span class="p">[</span><span class="o">++</span><span class="n">u1</span><span class="p">]</span> <span class="o">=</span> <span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">b</span><span class="p">;</span> <span class="n">s1</span><span class="p">[</span><span class="n">u1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">pq1</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="o">-</span><span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">b</span><span class="p">,</span> <span class="n">u1</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">pos</span> <span class="o">=</span> <span class="n">xx</span><span class="p">.</span><span class="n">second</span><span class="p">;</span>
                <span class="n">l1</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">=</span> <span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">b</span><span class="p">,</span> <span class="n">s1</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span><span class="o">++</span><span class="p">,</span> <span class="n">pq1</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="o">-</span><span class="n">in</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">b</span><span class="p">,</span> <span class="n">pos</span><span class="p">));</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>而至于其他几题，我就直接摆烂了，T2 输出 \(0\)，T3 直接输出了 \(T\) 个 \(-1\)，<a href="https://www.luogu.com.cn/problem/P7916">T4</a> 甚至连题目都没读懂，直接输出了 \(0\)。</p>

<h2 id="csp-s-出分日">CSP-S 出分日</h2>

<p>各家平台 T1 测出来都是 40 分，但仁慈的CCF给我的做法以 \(55\) 分的<em>好</em>成绩。正当我以为我这次能以 40 分总分滚粗的时候，仁慈的CCF竟然给输出 \(T\) 个 \(-1\) 的程序 \(16\) 分的<em>好</em>成绩。所以总分由民间测试的 40 分变为了 \(71\) 分，获得了人生中第二个 CSP-S 的二等（）。</p>

<h2 id="备战noip">备战NOIP</h2>

<p>这次赛前我们学校一直在跟着常州一中做模拟赛，同样且不出所料地，我一直在我们学校处于接近垫底的水平。不得不说常州一中的题目质量还挺高<del>，至少钱没有白花。</del></p>

<p>期中考试一直考到 11 月 17 日上午 9:00，考完后立刻进入了完全备赛状态。因为发现我的记性确实很差，好多算法都只是记得自己曾经学过，于是采用了一种奇怪的复习策略：在洛谷上先把模板切了，再在纸上把代码框架默写下来。而 11 月 17 日也成为了近期单日 AC 数最多的一天（15 题）（）。至于那两天做的题，除了模板题以外，似乎还做了一点字符串的题目，以防像去年那样出现字符串完全没思路的情况（）。</p>

<p><img src="https://s2.loli.net/2022/01/24/aVvhYGLTtqJSUMn.png" alt="图为赛前复习的模板，包括Dijkstra、埃氏筛、KMP、Kruskal、NlogN求解LIS、矩阵快速幂、高斯消元、SPFA、Tarjan求DCC和SCC" /></p>

\[\text{图：竞赛之前复习的一些板子（水）}\]

<p>11 月 19 日上午，基本上没做什么题（准确地说，应该是那一天一题都没做）。同学找到了一个非常好玩的 <a href="https://yorg.io/">io游戏</a>，于是整个机房几乎所有人都颓了起来（）。午饭后，稍作整理，顺好了书包，带齐了准考证身份证，在机房随便拔下了一副有线耳机<del>（上车后才发现光拿了耳机没有拿线）</del>，在学校门口的便利店买了两根士力架、一个肉松面包、一瓶咖啡，便跟着同学一起上了大巴车。到达南京酒店，和<a href="https://www.luogu.com.cn/user/153274"> cn 巨佬</a>住在一间。关上房门，房间里的气氛就蕉灼了起来（大雾）；<del>我们聊天的话题似乎全是些八卦的东西（此处不宜展开）（雾）。</del>吃完晚饭后，我躺在床上翻了翻几天前默写的代码框架，中途试图出去买耳机但便利店并不卖。为了保证自己能有充足的精神（雾），我在 21:40 就关了灯（舍友同学去别的房间打音游了）。但已经习惯了每天凌晨上床的我显然不会那么容易就睡着。在床上翻来覆去，思绪万千，有次日就要奔赴考场的紧张，亦有次日就要退役的怅惘，还有与我”并肩作战“的队友们也一一在我脑海中闪过。直到 23:00 我的舍友回来，我还没有睡着。睡着后的中途还醒了一次，那一刻我依旧认为我自己竟然还没有睡着（）。那个早晨，也是难得的没有被闹钟叫醒的一个早晨，5:44 分我便已睁开双眼思考人生（大雾）。总而言之，那晚我睡得很糟糕（）。</p>

<p><img src="https://s2.loli.net/2022/01/24/z3MUovsG8RnKd1c.jpg" alt="图为华为手表记录的睡眠状况" /></p>

\[\text{图：考前的最后一觉}\]

<h2 id="oi生涯的最后一役">OI生涯的最后一役</h2>

<p><img src="https://s2.loli.net/2022/01/24/oDqieFBm47MZj2u.jpg" alt="图为一大袋零食，系我校同学所带入考场的“行李”" /></p>

\[\text{图：我校某同学疑似计划前去度假}\]

<p>起床后经过简单的洗漱，我和舍友一同前往餐厅。毕竟是退役赛前的<em>最后一次早餐</em>，我试图对那次的饮食非常重视。但我不记得班主任曾安利过的《考试脑科学》中说早饭应该吃什么了，只记得要吃一些消化快的，于是便吃了两片面包一杯牛奶跑路。出发前我也保持迷信，循环播放着音乐老师曾经安利过的《D大调双钢琴奏鸣曲 K.448》——据说是能短效地提升智商（大雾）。我们的教练也属于是不紧不慢，带着我们向金陵中学河西分校走去，荣幸地成为了全场最后一个到达的校队（）。</p>

<p>吸取了上次的教训，这次比赛我还是决定老老实实地用 Dev-C++。试机时，打开了 C++14 和 O2，打了半个树状数组、半个线段树<del>（都是打了一半觉得肯定用不上，怎么会是忘了呢doge）</del>，以及一个Tarjan<del>（显然也用不上）</del>。</p>

<p>考试正式开始，<a href="https://www.luogu.com.cn/problem/P7960">T1</a> 没怎么想就觉得应该是个筛子。用埃氏筛预处理，二分找下一个，简单实现之后就过了所有样例。但最后一个点在本地足足花了将近980ms，虽然有点危，但我愿意相信CCF的机器能过（毕竟大样例并不水）。提交到 JSOI Linux，长舒一口气。但没过多久，\(\color{red}运行错误\)四个大字便使我顿感阴间。起初我还以为是虚拟机空间不够，正当我准备放下 T1 去看 T2 时我才发现：数组访问越界了。属实是，JSOI Linux 救我一命！我不再敢冒然往下做，便仔细检查起了 T1 的代码，也考虑到 1e7 的下一位的问题，但我的代码本身就预处理到了 1e7+9，所以之后并没有发现任何问题（）。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="kt">int</span> <span class="n">X</span> <span class="o">=</span> <span class="mf">1e7</span> <span class="o">+</span> <span class="mi">10</span><span class="p">,</span> <span class="n">N</span> <span class="o">=</span> <span class="mf">8e5</span><span class="p">;</span>
<span class="kt">bool</span> <span class="n">nop</span><span class="p">[</span><span class="n">X</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">li</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="mi">0</span><span class="p">;</span>

<span class="kt">bool</span> <span class="nf">c7</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="k">while</span> <span class="p">(</span><span class="n">val</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">val</span> <span class="o">%</span> <span class="mi">10</span> <span class="o">==</span> <span class="mi">7</span><span class="p">)</span> <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
		<span class="n">val</span> <span class="o">/=</span> <span class="mi">10</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="k">return</span> <span class="nb">false</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">"number.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">"number.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="c1">//	cout &lt;&lt; (double)(X / 1024.0 / 1024.0) &lt;&lt; endl;</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">X</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">nop</span><span class="p">[</span><span class="n">i</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">c7</span><span class="p">(</span><span class="n">i</span><span class="p">))</span> <span class="p">{</span>
			<span class="n">nop</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="k">for</span> <span class="p">(</span><span class="n">ll</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="mi">1ll</span> <span class="o">*</span> <span class="n">i</span> <span class="o">*</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">X</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">nop</span><span class="p">[</span><span class="n">i</span> <span class="o">*</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="p">}</span>
		<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
			<span class="n">li</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="p">}</span>
	<span class="p">}</span>
<span class="c1">//	cout &lt;&lt; X - 9 &lt;&lt; ' ' &lt;&lt; nop[X - 9] &lt;&lt; endl;return 0;</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">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="kt">int</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">nop</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">printf</span><span class="p">(</span><span class="s">"-1</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
		<span class="k">else</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">pos</span> <span class="o">=</span> <span class="n">lower_bound</span><span class="p">(</span><span class="n">li</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">li</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">cnt</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="n">li</span><span class="p">;</span>
			<span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">li</span><span class="p">[</span><span class="n">pos</span> <span class="o">+</span> <span class="mi">1</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>

<p>接下来就是按部就班的读题，发现 <a href="https://www.luogu.com.cn/problem/P7961">T2</a> 果然又双叒叕是道 DP。先在纸上划了半天，最后得到的似乎还是很显然的结论，然后就考虑状压，但竟然连状压应该怎么做都没想出来（）。\(k=1\) 的情况也挺复杂，所以经过若干思考，最终决定：大暴力（）。</p>

<p>一开始写的暴力似乎效率极低，即 DFS 枚举每一个可能的 \({a_i}\)，然后判断其是否是合法序列，时间复杂度 \(O(m^n)\)。这个算法只能过掉样例1（\(n=5,m=1\)），然而第一组测试数据就达到了 \(n=8,m=9\)，经过测试，我的程序跑最小的点也得花四五秒钟。当时骂 CCF 的想法立即迸发了出来：寄！CCF 汝母打暴力都没分吗！于是就想到优化这个暴力程序：序列 \({1,1,2}\) 和 \({2,1,1}\) 可以只算一次，只需 DFS 枚举出所有<strong>不降序列</strong>，检验其是否是合法序列，乘以<strong>对应的排列个数</strong>即可。设 <code class="language-plaintext highlighter-rouge">cnt[j]</code> 表示 \(j\) 在序列中出现的次数，考虑每次合并两个序列，简单计算（所谓简单计算，对我这种数学菜鸡来说依旧是个大工程（雾））得到这个个数为</p>

\[\Large C_{cnt[0]}^0\times C_{cnt[0]+cnt[1]}^{cnt[0]}\times\cdots\times C_{\sum_{i=0}^m cnt[i]}^{\sum_{i=0}^{m-1}cnt[i]}\]

<p>看到这个式子，想必各位读者已经血压高了起来，关于这个式子的优化在后文会提到（）。</p>

<p>不考虑组合数的计算，时间复杂度 \(O(不会算)\)。事后我校巨佬算到复杂度为 \(O(C_{n+m-1}^n)\)。</p>

<p>代码片段（省略了部分函数的实现和语句，注释都是事后添加的）：</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">now</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">a</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">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">now</span><span class="p">]</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">now</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">)</span> <span class="n">dfs</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="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">cnt1</span><span class="p">())</span> <span class="p">{</span> <span class="c1">//cnt1()函数线性时间内判断当前枚举的序列是否是合法序列</span>
			<span class="n">memset</span><span class="p">(</span><span class="n">cnt</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span> <span class="o">*</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="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="p">{</span>
				<span class="n">cnt</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="p">;</span>
			<span class="p">}</span>
            <span class="c1">//cc表示上面提到的组合数之积，tmp表示序列的权值，comb(n,m)是组合数函数</span>
			<span class="n">ll</span> <span class="n">tmp</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">cc</span> <span class="o">=</span> <span class="mi">1</span><span class="p">,</span> <span class="n">dd</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">0</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">cc</span> <span class="o">=</span> <span class="n">cc</span> <span class="o">*</span> <span class="n">comb</span><span class="p">((</span><span class="n">dd</span> <span class="o">+</span> <span class="n">cnt</span><span class="p">[</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="n">dd</span><span class="p">);</span>
				<span class="n">dd</span> <span class="o">=</span> <span class="p">(</span><span class="n">dd</span> <span class="o">+</span> <span class="n">cnt</span><span class="p">[</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="n">tmp</span> <span class="o">=</span> <span class="n">tmp</span> <span class="o">*</span> <span class="n">qpow</span><span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="n">j</span><span class="p">],</span> <span class="n">cnt</span><span class="p">[</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">ans</span> <span class="o">=</span> <span class="p">(</span><span class="n">ans</span> <span class="o">+</span> <span class="n">tmp</span> <span class="o">*</span> <span class="n">cc</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="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="c1">//（输入输出、return 0均已省略）</span>
    
	<span class="n">f</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">M</span><span class="p">;</span> <span class="n">i</span><span class="o">++</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="n">f</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">i</span> <span class="o">%</span> <span class="n">MOD</span><span class="p">;</span>
    <span class="c1">//如下是赛前学到的线性求阶乘数逆元的方法，inv[i]表示i!的逆元，qpow(a,b)是快速幂函数</span>
	<span class="n">inv</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="o">=</span> <span class="n">qpow</span><span class="p">(</span><span class="n">f</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">MOD</span> <span class="o">-</span> <span class="mi">2</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="o">-</span> <span class="mi">2</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="p">{</span>
		<span class="n">inv</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">inv</span><span class="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="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">MOD</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="p">}</span>
</code></pre></div></div>

<p>看了两眼 <a href="https://www.luogu.com.cn/problem/P7962">T3</a>，又看了两眼 <a href="https://www.luogu.com.cn/problem/P7963">T4</a>，不想做数学题的本能让我直接开始搞起了 T4 的暴力。</p>

<p>首先考虑存矩阵的方式，因为觉得每次考虑四个方向太麻烦，所以最后建了一张图。接着就直接考虑纯暴力的方法，对于每次询问，跑 DFS，看能到达的点有多少个。因为细节太多，我的做法是跑两遍 DFS，第一次找出 \(opt_i=1或2\) 的情况（这两种情况本质上都只能往一个方向跑，所以可以合起来考虑），第二次找出 \(opt_i=3\) 的情况。这个代码就毫无含金量可言，完全属于是大暴力解决问题。调了好长时间，终于过了小样例。至于大样例，跑了个四五秒答案没出来就直接 kill 了（）。</p>

<p>又臭又长的代码（省略快读板子和头文件）：</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="kt">int</span> <span class="n">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">Q</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">q</span><span class="p">,</span> <span class="n">ver</span><span class="p">[</span><span class="n">N</span> <span class="o">&lt;&lt;</span> <span class="mi">4</span><span class="p">],</span> <span class="n">nxt</span><span class="p">[</span><span class="n">N</span> <span class="o">&lt;&lt;</span> <span class="mi">4</span><span class="p">],</span> <span class="n">head</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="mi">0</span><span class="p">,</span> <span class="n">lv</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">cv</span> <span class="o">=</span> <span class="mi">0</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="kt">bool</span> <span class="n">col</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">vis</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">vis2</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="kt">short</span> <span class="n">opt</span><span class="p">[</span><span class="n">N</span> <span class="o">&lt;&lt;</span> <span class="mi">4</span><span class="p">];</span>
<span class="kt">char</span> <span class="n">s</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>

<span class="kt">int</span> <span class="nf">cal</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="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="n">m</span> <span class="o">+</span> <span class="n">y</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">add</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">short</span> <span class="n">z</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">ver</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">y</span><span class="p">,</span> <span class="n">nxt</span><span class="p">[</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">head</span><span class="p">[</span><span class="n">x</span><span class="p">],</span> <span class="n">opt</span><span class="p">[</span><span class="n">cnt</span><span class="p">]</span> <span class="o">=</span> <span class="n">z</span><span class="p">,</span> <span class="n">head</span><span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="o">=</span> <span class="n">cnt</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">now</span><span class="p">,</span> <span class="kt">int</span> <span class="n">ini</span><span class="p">,</span> <span class="kt">int</span> <span class="n">tmp</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">//	cout &lt;&lt; ini &lt;&lt; ' ' &lt;&lt; now &lt;&lt; ' ' &lt;&lt; tmp &lt;&lt; endl;</span>
	<span class="n">vis</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="n">ans</span><span class="o">++</span><span class="p">;</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">u</span><span class="p">[</span><span class="n">now</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">now</span> <span class="o">!=</span> <span class="n">ini</span><span class="p">)</span> <span class="k">return</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">head</span><span class="p">[</span><span class="n">now</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">nxt</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">to</span> <span class="o">=</span> <span class="n">ver</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">vis</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">||</span> <span class="p">(</span><span class="n">u</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">col</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">==</span> <span class="n">col</span><span class="p">[</span><span class="n">ini</span><span class="p">]</span> <span class="o">||</span> <span class="n">lv</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">lv</span><span class="p">[</span><span class="n">ini</span><span class="p">])))</span> <span class="k">continue</span><span class="p">;</span>
<span class="c1">//		cout &lt;&lt; "//" &lt;&lt; to &lt;&lt; endl;</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">opt</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="o">&amp;&amp;</span> <span class="n">tmp</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="n">dfs</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">ini</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">opt</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="p">{</span>
			<span class="k">if</span> <span class="p">(</span><span class="n">tmp</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
				<span class="k">if</span> <span class="p">(</span><span class="n">to</span> <span class="o">==</span> <span class="n">now</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">to</span><span class="p">,</span> <span class="n">ini</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
				<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">to</span> <span class="o">==</span> <span class="n">now</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">to</span><span class="p">,</span> <span class="n">ini</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
				<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">to</span> <span class="o">&lt;</span> <span class="n">now</span><span class="p">)</span> <span class="n">dfs</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">ini</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
				<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">to</span> <span class="o">&gt;</span> <span class="n">now</span><span class="p">)</span> <span class="n">dfs</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">ini</span><span class="p">,</span> <span class="mi">5</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">tmp</span> <span class="o">==</span> <span class="mi">2</span> <span class="o">&amp;&amp;</span> <span class="n">to</span> <span class="o">==</span> <span class="n">now</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">to</span><span class="p">,</span> <span class="n">ini</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
			<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">tmp</span> <span class="o">==</span> <span class="mi">3</span> <span class="o">&amp;&amp;</span> <span class="n">to</span> <span class="o">==</span> <span class="n">now</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">to</span><span class="p">,</span> <span class="n">ini</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
			<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">tmp</span> <span class="o">==</span> <span class="mi">4</span> <span class="o">&amp;&amp;</span> <span class="n">to</span> <span class="o">&lt;</span> <span class="n">now</span> <span class="o">&amp;&amp;</span> <span class="n">to</span> <span class="o">!=</span> <span class="n">now</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">to</span><span class="p">,</span> <span class="n">ini</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
			<span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">tmp</span> <span class="o">==</span> <span class="mi">5</span> <span class="o">&amp;&amp;</span> <span class="n">to</span> <span class="o">&gt;</span> <span class="n">now</span> <span class="o">&amp;&amp;</span> <span class="n">to</span> <span class="o">!=</span> <span class="n">now</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">to</span><span class="p">,</span> <span class="n">ini</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
		<span class="p">}</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="n">dfs2</span><span class="p">(</span><span class="kt">int</span> <span class="n">now</span><span class="p">,</span> <span class="kt">int</span> <span class="n">ini</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">//	cout &lt;&lt; ini &lt;&lt; ' ' &lt;&lt; now &lt;&lt; endl;</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">now</span><span class="p">])</span> <span class="n">ans</span><span class="o">++</span><span class="p">;</span>
	<span class="n">vis2</span><span class="p">[</span><span class="n">now</span><span class="p">]</span> <span class="o">=</span> <span class="n">vis</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="k">if</span> <span class="p">(</span><span class="n">u</span><span class="p">[</span><span class="n">now</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="n">now</span> <span class="o">!=</span> <span class="n">ini</span><span class="p">)</span> <span class="k">return</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">head</span><span class="p">[</span><span class="n">now</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">nxt</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">to</span> <span class="o">=</span> <span class="n">ver</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<span class="c1">//		cout &lt;&lt; "/" &lt;&lt; now &lt;&lt; ' ' &lt;&lt; to &lt;&lt; ' ' &lt;&lt; vis2[to] &lt;&lt; endl;</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">vis2</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">||</span> <span class="p">(</span><span class="n">u</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">col</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">==</span> <span class="n">col</span><span class="p">[</span><span class="n">ini</span><span class="p">]</span> <span class="o">||</span> <span class="n">lv</span><span class="p">[</span><span class="n">to</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">lv</span><span class="p">[</span><span class="n">ini</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">opt</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="k">continue</span><span class="p">;</span>
		<span class="n">dfs2</span><span class="p">(</span><span class="n">ver</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">ini</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">"chess.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">"chess.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="kt">int</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">memset</span><span class="p">(</span><span class="n">ver</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">ver</span><span class="p">);</span>
		<span class="n">memset</span><span class="p">(</span><span class="n">nxt</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">nxt</span><span class="p">);</span>
		<span class="n">memset</span><span class="p">(</span><span class="n">head</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">head</span><span class="p">);</span>
		<span class="n">memset</span><span class="p">(</span><span class="n">lv</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">lv</span><span class="p">);</span>
		<span class="n">memset</span><span class="p">(</span><span class="n">col</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">col</span><span class="p">);</span>
		<span class="n">memset</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="k">sizeof</span> <span class="n">u</span><span class="p">);</span>
		<span class="n">memset</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span> <span class="n">opt</span><span class="p">);</span>
		<span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
		<span class="n">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">q</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
<span class="c1">//		cout &lt;&lt; n &lt;&lt; ' ' &lt;&lt; m &lt;&lt; ' ' &lt;&lt; q &lt;&lt; endl;</span>
		<span class="n">cv</span> <span class="o">=</span> <span class="n">cal</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="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">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="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="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="p">{</span>
				<span class="kt">int</span> <span class="n">now</span> <span class="o">=</span> <span class="n">cal</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">to</span> <span class="o">=</span> <span class="n">cal</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="k">if</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">'0'</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
				<span class="k">else</span> <span class="n">add</span><span class="p">(</span><span class="n">now</span><span class="p">,</span> <span class="n">to</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">'0'</span><span class="p">),</span> <span class="n">add</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">now</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="sc">'0'</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">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="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="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="kt">int</span> <span class="n">now</span> <span class="o">=</span> <span class="n">cal</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">to</span> <span class="o">=</span> <span class="n">cal</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="k">if</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">'0'</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
				<span class="k">else</span> <span class="n">add</span><span class="p">(</span><span class="n">now</span><span class="p">,</span> <span class="n">to</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">'0'</span><span class="p">),</span> <span class="n">add</span><span class="p">(</span><span class="n">to</span><span class="p">,</span> <span class="n">now</span><span class="p">,</span> <span class="n">s</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="sc">'0'</span><span class="p">);</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="c1">//			cout &lt;&lt; q &lt;&lt; endl;</span>
			<span class="kt">int</span> <span class="n">s1</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">s2</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">s3</span> <span class="o">=</span> <span class="n">read</span><span class="p">(),</span> <span class="n">s4</span> <span class="o">=</span> <span class="n">read</span><span class="p">();</span>
			<span class="kt">int</span> <span class="n">now</span> <span class="o">=</span> <span class="n">cal</span><span class="p">(</span><span class="n">s3</span><span class="p">,</span> <span class="n">s4</span><span class="p">);</span> <span class="n">col</span><span class="p">[</span><span class="n">now</span><span class="p">]</span> <span class="o">=</span> <span class="n">s1</span><span class="p">,</span> <span class="n">lv</span><span class="p">[</span><span class="n">now</span><span class="p">]</span> <span class="o">=</span> <span class="n">s2</span><span class="p">;</span>
			<span class="n">u</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="n">memset</span><span class="p">(</span><span class="n">vis</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">bool</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">cv</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">memset</span><span class="p">(</span><span class="n">vis2</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">bool</span><span class="p">)</span> <span class="o">*</span> <span class="p">(</span><span class="n">cv</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">now</span><span class="p">,</span> <span class="n">now</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
			<span class="n">dfs2</span><span class="p">(</span><span class="n">now</span><span class="p">,</span> <span class="n">now</span><span class="p">);</span>
			<span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ans</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
		<span class="p">}</span>
<span class="c1">//		for (int i = head[8];i;i = nxt[i]) cout &lt;&lt; ver[i] &lt;&lt; ' '; cout &lt;&lt; endl;</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>

<p>距离考试结束还有 45 分钟，我没多想就直接开始搞起了 T3 的暴力，但根本想不到这题的暴力思路，随便写了一个 DFS，但又出现了灵异事件——一进入 DFS 变量 \(n\) 的值就会变成 0（，来不及思考，于是直接摆烂，输出了数列的原方差。。。</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">freopen</span><span class="p">(</span><span class="s">"variance.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">"variance.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="kt">int</span> <span class="n">n</span> <span class="o">=</span> <span class="n">read</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="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</span><span class="p">();</span>
	<span class="p">}</span>
	<span class="n">ll</span> <span class="n">sum</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">sum</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="p">}</span>
	<span class="kt">double</span> <span class="n">ave</span> <span class="o">=</span> <span class="p">(</span><span class="kt">double</span><span class="p">)(</span><span class="n">sum</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="kt">double</span><span class="p">)(</span><span class="n">n</span><span class="p">);</span>
	<span class="kt">double</span> <span class="n">fc</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">fc</span> <span class="o">+=</span> <span class="p">(</span><span class="n">ave</span> <span class="o">-</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">*</span> <span class="p">(</span><span class="n">ave</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="p">}</span>
	<span class="n">printf</span><span class="p">(</span><span class="s">"%lld</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="p">(</span><span class="n">ll</span><span class="p">)(</span><span class="n">fc</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>

<p>摆完 T3 的烂还剩十几分钟，再次检查了每一题的文件输入输出、提交的文件版本等等。然后又仔细翻了翻每一题的 Subtask 有多少分。</p>

<p>终于，伴随着 13:00 监考的一声令下，我的OI生涯就此结束了。</p>

<p>站在电脑前，脑中回忆着刚刚所做的题，心中满是怅惘。根据之前的测试，T2 可能只能拿到前 4 个点，也就是 \(20\) 分，而 T4 撑死了也就只能拿下前六个点，也就是 \(24\) 分（也许第 \(3\sim6\) 个点都拿不下）。而那个跑了 0.9s 的 T1，哪怕就是运气爆棚，真的能在最后卡进 1s，加起来也不过 \(144\) 分，还不到去年江苏的一等线，而今年的试题又显然比去年的简单……也许，又忙活了一年，最终也不过只能得到这样的结果吧……</p>

<p>在考场楼前，留下了退役后的第一张照片（）。同是高二的同学一同高喊着“退役快乐”，而我站在其中，只是和他们一起笑着，一言不发。</p>

<p><img src="https://s2.loli.net/2022/01/24/TwM5zFfL9oYXSJt.png" alt="图为我校信竞队在考点拍摄的合照" /></p>

<h2 id="最终成绩赛后总结">最终成绩&amp;赛后总结</h2>

<p>民间数据做好之后，我才知道我的 T2 做法能还能过第 \(6\sim7\) 个点，也就是能拿到 \(30\) 分（）。在跑的过程中我也发现在评测平台上我程序的效率比考试机的效率要高得多，T1 三百毫秒以内便能求出结果。可能我考场上 O2 没开好？可能考试机的配置真的太渣了？不管怎么说，这对我而言必然是一个好消息，也给我点成绩带来了很多“变数”。而这次最大的变数就在于 T4：</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">洛谷</th>
      <th style="text-align: center">小图灵第一版</th>
      <th style="text-align: center">小图灵第二版</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">\(44\)</td>
      <td style="text-align: center">\(84\)</td>
      <td style="text-align: center">\(24\)</td>
    </tr>
  </tbody>
</table>

<p>心随着小图灵预测分数线的波动一同悬了一周，我一直在祈祷：T4 水一点，T3 骗分有分。果然 CCF 还算有良心（），最终成绩：\(100+30+4+32=166\)。在接下来的一周内，则是更为煎熬的等分数线的一周。小图灵的数据依旧在上上下下地波动，我甚至测了全省的代码，但又不知道哪些不占有一等名额。</p>

<p>最后分数线放出的是那么突然，江苏线意外地又是 \(150\) 分。</p>

<p>虽然代码当中还有很多可以优化的地方，就如 T2 暴力要求的组合数，稍微想一想就知道其实是一个多重集的排列数，而那个式子稍加化简也能得到多重集排列数的计算式，本身薄弱的数学功底、微薄的算法储备也限制了我能想到“多重集”（事实上这东西我背过，但也仅限于背过，而且考试的时候都忘了）的可能；T3 因为经验不足（大概），DFS出现 \(n\) 变成 \(0\) 的原因竟然是把 \(n\) 设成了局部变量（）；T4 如果时间充裕甚至可以搞一搞第 \(9\sim 10\) 个点。当然，从结果上来看，我的退役赛，终于可以说是不留遗憾了。</p>

<h2 id="结语">结语</h2>

<p>初入竞赛圈之时，便在不停地想象退役时的场景；而在退役之际，又在回忆出入竞赛时的每一刻。2017，我记得我是怎样跟着初中的教练误打误撞混进了 OI 的圈子；我记得我是怎样在一个只有5个人的考场拿到普及初赛的 \(21.5\) 分；我记得我是怎样不懂二分，不懂递归，逻辑等号怎样写成赋值等号。我记得我曾单纯地把信息看作爱好，佛系的做题方式让我的洛谷AC数一直不超过 40；我记得我曾分不清信息技术和信息学，一直用工程的眼光去看待竞赛题目。</p>

<p>我也不会忘记 2018 年我第一次走入南航校园，更加彻底地了解了所谓自主招生，见证了史上最难的一次普及复赛。自那时起，头脑中更常地会闪过一些好似梦幻的事物——人群、聚光灯……我更不会忘记 2019 年参加的夏令营——让我<strong>融入</strong>了 OI 的圈子，感受到了信奥选手之间那独有的凝聚力。</p>

<p><a href="/experience/csp-j-2019/">CSP-J 2019</a>，240 分，压线一等。——但凡少了一分，我可能都没法进入现在所读的中学。</p>

<p><a href="/experience/oi-2020/">2020 年</a>，初入高中的我请掉了所有能请的假来训练，最终还是以我校近乎垫底的成绩拿到了 NOIP 三等。</p>

\[\displaylines{
2017.10.15\sim2021.11.20 \\
\text{1497 Days in all}
}\]

<p>做过的题目并不多，好多题最终都半途而废；好多场 CF 都打得心不在焉，也有好多算法没有学过。既然退役了，那也只能放下了。</p>

<p><img src="https://s2.loli.net/2022/01/24/I24DacGJrCjV6dQ.png" alt="图为至截稿时笔者的洛谷练习情况，其中难度未评定 4 题，红题 65 题，橙题 74 题，黄题 94 题，绿题 66 题，蓝题 52 题，紫题 6 题，黑题 0 题" /></p>

\[\text{图：水水水}\]

<p><img src="https://s2.loli.net/2022/01/24/9PuqVilaXrsf4Ih.png" alt="图为：Contest rating: 1369 (max.specialist, 1547)" /></p>

\[\text{图：这个 rating 会不会再有变化呢}\]

<p>颓废过，自责过；拼搏过，失落过。是终点，亦是起点。</p>

\[\Large
高考\mathcal{rp++}！\]

<hr />

<p>AnicoderAndy</p>

<p>Dec4.2021 - Jan24.2022</p>]]></content><author><name>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="experience" /><summary type="html"><![CDATA[引言 这篇游寄从 12 月 4 日（其实也不算早了（雾））就开始写（shui）了，但因为准备会考艺术节等等各种各样的原因，一直咕到今天才完成。 坐标江苏，今年高二。不出意外，这应该是我OI生涯的最后一年。 初赛日 考前“预习”了主定理（学了四年多连主定理都不知道的我是屑）和计算机常识（为什么信息学史也算是“常识”啊）。 疫情原因，今年考点与往年不同，但监考老师却全是熟悉的面孔（）。 好耶，第一题是新鲜的Linux题！ 好耶，前四题都是送分题！ 好家伙，第五题不是历史悠久的历年原题（要求 \(2n\) 个数组成数列的最大值最小值，最坏情况下需要比较多少次）吗，原谅我只会暴力求解，错了 2 分。 然后甚至错了智障的第七题（无向图至少有多少个点），第十二题（递归求斐波那契数列的时间复杂度）。数学不好组合计数题直接废掉（）。 阅读程序第一题，说实话看着挺蒙，我甚至都不知道 acos(0.5)=pi/3，准确地说，我连 acos 是什么都不知道（但我知道 \(\arccos\) 是什么东西）……连猜带蒙，竟然做对了每一题（尽管我知道它是水题，但终究还是吃了数学不好的亏）。 之后的两段阅读程序，可以说直接开摆，几乎属于是完全看不懂。对于第二段程序，赛后看到巨佬发言说是“《LIS 的两种经 典 求 法》”，身为只会二分和 DP 的小蒟蒻只能瑟瑟发抖（）。第三段程序倒是看懂了，但并没有想到阴间的 CCF 会给一段错误的解码程序…… 完善程序 T1 直接水过去了，但也花了挺久，比往年的 T1 阴间了不少（）。T2，我只能说，四毛子，笛卡尔树，Euler 序列我是一个没听说过，只能完全靠蒙（）。 最后得分：\(68.5\) CSP-S 2021 SCP 之前三周内做了几套牛客的模拟赛，提前感受到了被完虐的感受（）。 考试前两天学校开运动会，这种活动当然得直接翘掉了啊（），复习了 Tarjan、快速幂等几个很水的模板。 10 月 20 日晚上教练开了线上会议，JS 终于有了船新的提交系统！检查数组越界好耶！不用自己建文件夹好耶！Windows 下的 VSCode 好耶！ 10 月 23 日上午到达南京，吃完午饭看到 J 组的试题，看到 J 组的题那么水，就预言 S 组会很毒瘤（）。 到达南京航空航天大学，试机，立刻找到了 VSCode 并试图调教它。我想先写一个编译 bat 脚本，但似乎机房的 PowerShell 版本和我平时用到的似乎不太一样，所以导致我都不会在脚本中读入。但那个 VSCode 似乎支持自动查错（就挺好），所以我在那一场比赛中就选择了使用 VSCode 写代码，然后手动输入指令编译…… 发题。开 O2 好耶！（） 4小时以后，面对收代码的监考老师，AnicoderAndy将会回想起只做了一道题甚至还没做出来的那个遥远的下午。 ——《四小时孤独》 看到这样的 T1，立刻能反应出这是一道思维题，然而也就只能反应出这是一道思维题（，在草稿纸上画出来几条线段大概知道贪心策略是要尽可能使每架飞机到达靠前的廊桥。于是立刻想到要用优先队列维护，每次取出当前结束时间最早的廊桥，如果它可以接纳当前到达的飞机则更新它的结束时间，否则新开辟一个廊桥。然而很快样例 3 就打了我的脸，但当时并没有发现问题所在，于是看 T2 。 T2 题面很好懂，但就是看不出来是什么算法，（当时的我甚至不知道计数题可以朝DP的方向去想。开始着手写暴力，但写着写着又意识到问题不对劲了起来——对于本题，因为对于“超级括号序列”的定义过于复杂，暴力的 check 函数可以说是相当不好写，所以直接放弃了（）。于是赶忙看 T3，立刻能反应出这是一道思维题，然而也就只能反应出这是一道思维题（梅开二度），在草稿纸上推了半天也没有得到什么有用的规律，在急急忙忙之中感觉为了稳得赶快回去再看看 T1。 对于原来错误的做法，显然并非只有结束时间最早的廊桥有可能接纳当前到达的飞机，还有次小、次次小的等等都可以尝试，于是我就走上了负优化的不归途，不断取出最早的廊桥，看是否能接纳当前飞机。至于那些不符合要求的廊桥……我选择了建立一个栈临时将它们存储起来，在整个过程之后把它们一个一个地塞回原序列……调试的时候依旧出了问题，所以就写了一个纯暴力的程序做对照，最后把这个奇奇怪怪的做法调出来了，并且过了那个水得不行的大样例。我不会算它的复杂度，所以姑且认作 \(O(玄学)\)。 for (int i = 1; i &lt;= m1; i++) { if (!u1) u1 = 1, l1[1] = in[i].b, s1[1] = 1, pq1.push(make_pair(-in[i].b, 1)); else { pair&lt;int, int&gt; xx; xx.first = -1, xx.second = 0x7f7f7f7f; while (pq1.size()) { if (-pq1.top().first &gt; in[i].a) break; if (xx.second &gt; pq1.top().second) xx = pq1.top(); stk[++top] = pq1.top(); pq1.pop(); } while (top) { if (top == 0) break; if (stk[top] != xx) pq1.push(stk[top]); top--; } // cout &lt;&lt; -pq1.top().first &lt;&lt; ' ' &lt;&lt; pq1.top().second &lt;&lt; ' ' &lt;&lt; in[i].a &lt;&lt; endl; if (xx.first == -1) { l1[++u1] = in[i].b; s1[u1] = 1, pq1.push(make_pair(-in[i].b, u1)); } else { int pos = xx.second; l1[pos] = in[i].b, s1[pos]++, pq1.push(make_pair(-in[i].b, pos)); } } } } 而至于其他几题，我就直接摆烂了，T2 输出 \(0\)，T3 直接输出了 \(T\) 个 \(-1\)，T4 甚至连题目都没读懂，直接输出了 \(0\)。 CSP-S 出分日 各家平台 T1 测出来都是 40 分，但仁慈的CCF给我的做法以 \(55\) 分的好成绩。正当我以为我这次能以 40 分总分滚粗的时候，仁慈的CCF竟然给输出 \(T\) 个 \(-1\) 的程序 \(16\) 分的好成绩。所以总分由民间测试的 40 分变为了 \(71\) 分，获得了人生中第二个 CSP-S 的二等（）。 备战NOIP 这次赛前我们学校一直在跟着常州一中做模拟赛，同样且不出所料地，我一直在我们学校处于接近垫底的水平。不得不说常州一中的题目质量还挺高，至少钱没有白花。 期中考试一直考到 11 月 17 日上午 9:00，考完后立刻进入了完全备赛状态。因为发现我的记性确实很差，好多算法都只是记得自己曾经学过，于是采用了一种奇怪的复习策略：在洛谷上先把模板切了，再在纸上把代码框架默写下来。而 11 月 17 日也成为了近期单日 AC 数最多的一天（15 题）（）。至于那两天做的题，除了模板题以外，似乎还做了一点字符串的题目，以防像去年那样出现字符串完全没思路的情况（）。 \[\text{图：竞赛之前复习的一些板子（水）}\] 11 月 19 日上午，基本上没做什么题（准确地说，应该是那一天一题都没做）。同学找到了一个非常好玩的 io游戏，于是整个机房几乎所有人都颓了起来（）。午饭后，稍作整理，顺好了书包，带齐了准考证身份证，在机房随便拔下了一副有线耳机（上车后才发现光拿了耳机没有拿线），在学校门口的便利店买了两根士力架、一个肉松面包、一瓶咖啡，便跟着同学一起上了大巴车。到达南京酒店，和 cn 巨佬住在一间。关上房门，房间里的气氛就蕉灼了起来（大雾）；我们聊天的话题似乎全是些八卦的东西（此处不宜展开）（雾）。吃完晚饭后，我躺在床上翻了翻几天前默写的代码框架，中途试图出去买耳机但便利店并不卖。为了保证自己能有充足的精神（雾），我在 21:40 就关了灯（舍友同学去别的房间打音游了）。但已经习惯了每天凌晨上床的我显然不会那么容易就睡着。在床上翻来覆去，思绪万千，有次日就要奔赴考场的紧张，亦有次日就要退役的怅惘，还有与我”并肩作战“的队友们也一一在我脑海中闪过。直到 23:00 我的舍友回来，我还没有睡着。睡着后的中途还醒了一次，那一刻我依旧认为我自己竟然还没有睡着（）。那个早晨，也是难得的没有被闹钟叫醒的一个早晨，5:44 分我便已睁开双眼思考人生（大雾）。总而言之，那晚我睡得很糟糕（）。 \[\text{图：考前的最后一觉}\] OI生涯的最后一役 \[\text{图：我校某同学疑似计划前去度假}\] 起床后经过简单的洗漱，我和舍友一同前往餐厅。毕竟是退役赛前的最后一次早餐，我试图对那次的饮食非常重视。但我不记得班主任曾安利过的《考试脑科学》中说早饭应该吃什么了，只记得要吃一些消化快的，于是便吃了两片面包一杯牛奶跑路。出发前我也保持迷信，循环播放着音乐老师曾经安利过的《D大调双钢琴奏鸣曲 K.448》——据说是能短效地提升智商（大雾）。我们的教练也属于是不紧不慢，带着我们向金陵中学河西分校走去，荣幸地成为了全场最后一个到达的校队（）。 吸取了上次的教训，这次比赛我还是决定老老实实地用 Dev-C++。试机时，打开了 C++14 和 O2，打了半个树状数组、半个线段树（都是打了一半觉得肯定用不上，怎么会是忘了呢doge），以及一个Tarjan（显然也用不上）。 考试正式开始，T1 没怎么想就觉得应该是个筛子。用埃氏筛预处理，二分找下一个，简单实现之后就过了所有样例。但最后一个点在本地足足花了将近980ms，虽然有点危，但我愿意相信CCF的机器能过（毕竟大样例并不水）。提交到 JSOI Linux，长舒一口气。但没过多久，\(\color{red}运行错误\)四个大字便使我顿感阴间。起初我还以为是虚拟机空间不够，正当我准备放下 T1 去看 T2 时我才发现：数组访问越界了。属实是，JSOI Linux 救我一命！我不再敢冒然往下做，便仔细检查起了 T1 的代码，也考虑到 1e7 的下一位的问题，但我的代码本身就预处理到了 1e7+9，所以之后并没有发现任何问题（）。 const int X = 1e7 + 10, N = 8e5; bool nop[X]; int li[N], cnt = 0; bool c7(int val) { while (val) { if (val % 10 == 7) return true; val /= 10; } return false; } int main() { freopen("number.in", "r", stdin); freopen("number.out", "w", stdout); // cout &lt;&lt; (double)(X / 1024.0 / 1024.0) &lt;&lt; endl; for (int i = 1; i &lt; X; i++) { if (nop[i]) continue; if (c7(i)) { nop[i] = 1; for (ll j = 2; 1ll * i * j &lt;= X; j++) { nop[i * j] = 1; } } else { li[++cnt] = i; } } // cout &lt;&lt; X - 9 &lt;&lt; ' ' &lt;&lt; nop[X - 9] &lt;&lt; endl;return 0; int T = read(); while (T--) { int x = read(); if (nop[x]) printf("-1\n"); else { int pos = lower_bound(li + 1, li + 1 + cnt, x) - li; printf("%d\n", li[pos + 1]); } } return 0; } 接下来就是按部就班的读题，发现 T2 果然又双叒叕是道 DP。先在纸上划了半天，最后得到的似乎还是很显然的结论，然后就考虑状压，但竟然连状压应该怎么做都没想出来（）。\(k=1\) 的情况也挺复杂，所以经过若干思考，最终决定：大暴力（）。 一开始写的暴力似乎效率极低，即 DFS 枚举每一个可能的 \({a_i}\)，然后判断其是否是合法序列，时间复杂度 \(O(m^n)\)。这个算法只能过掉样例1（\(n=5,m=1\)），然而第一组测试数据就达到了 \(n=8,m=9\)，经过测试，我的程序跑最小的点也得花四五秒钟。当时骂 CCF 的想法立即迸发了出来：寄！CCF 汝母打暴力都没分吗！于是就想到优化这个暴力程序：序列 \({1,1,2}\) 和 \({2,1,1}\) 可以只算一次，只需 DFS 枚举出所有不降序列，检验其是否是合法序列，乘以对应的排列个数即可。设 cnt[j] 表示 \(j\) 在序列中出现的次数，考虑每次合并两个序列，简单计算（所谓简单计算，对我这种数学菜鸡来说依旧是个大工程（雾））得到这个个数为 \[\Large C_{cnt[0]}^0\times C_{cnt[0]+cnt[1]}^{cnt[0]}\times\cdots\times C_{\sum_{i=0}^m cnt[i]}^{\sum_{i=0}^{m-1}cnt[i]}\] 看到这个式子，想必各位读者已经血压高了起来，关于这个式子的优化在后文会提到（）。 不考虑组合数的计算，时间复杂度 \(O(不会算)\)。事后我校巨佬算到复杂度为 \(O(C_{n+m-1}^n)\)。 代码片段（省略了部分函数的实现和语句，注释都是事后添加的）： void dfs(int now) { for (int i = a[now - 1]; i &lt;= m; i++) { a[now] = i; if (now &lt; n) dfs(now + 1); else if (cnt1()) { //cnt1()函数线性时间内判断当前枚举的序列是否是合法序列 memset(cnt, 0, sizeof(int) * (m + 1)); for (int j = 1; j &lt;= n; j++) { cnt[a[j]]++; } //cc表示上面提到的组合数之积，tmp表示序列的权值，comb(n,m)是组合数函数 ll tmp = 1, cc = 1, dd = 0; for (int j = 0; j &lt;= m; j++) { cc = cc * comb((dd + cnt[j]) % MOD, dd); dd = (dd + cnt[j]) % MOD; tmp = tmp * qpow(v[j], cnt[j]) % MOD; } ans = (ans + tmp * cc % MOD) % MOD; } } } int main() { //（输入输出、return 0均已省略） f[0] = 1; for (int i = 1; i &lt; M; i++) f[i] = f[i - 1] * i % MOD; //如下是赛前学到的线性求阶乘数逆元的方法，inv[i]表示i!的逆元，qpow(a,b)是快速幂函数 inv[M - 1] = qpow(f[M - 1], MOD - 2); for (int i = M - 2; i &gt;= 0; i--) { inv[i] = inv[i + 1] * (i + 1) % MOD; } dfs(1); } 看了两眼 T3，又看了两眼 T4，不想做数学题的本能让我直接开始搞起了 T4 的暴力。 首先考虑存矩阵的方式，因为觉得每次考虑四个方向太麻烦，所以最后建了一张图。接着就直接考虑纯暴力的方法，对于每次询问，跑 DFS，看能到达的点有多少个。因为细节太多，我的做法是跑两遍 DFS，第一次找出 \(opt_i=1或2\) 的情况（这两种情况本质上都只能往一个方向跑，所以可以合起来考虑），第二次找出 \(opt_i=3\) 的情况。这个代码就毫无含金量可言，完全属于是大暴力解决问题。调了好长时间，终于过了小样例。至于大样例，跑了个四五秒答案没出来就直接 kill 了（）。 又臭又长的代码（省略快读板子和头文件）： const int N = 2e5 + 10, Q = 1e5 + 10; int n, m, q, ver[N &lt;&lt; 4], nxt[N &lt;&lt; 4], head[N], cnt = 0, lv[N], cv = 0, ans = 0; bool col[N], vis[N], vis2[N], u[N]; short opt[N &lt;&lt; 4]; char s[N]; int cal(int x, int y) { return (x - 1) * m + y; } void add(int x, int y, short z) { ver[++cnt] = y, nxt[cnt] = head[x], opt[cnt] = z, head[x] = cnt; } void dfs(int now, int ini, int tmp) { // cout &lt;&lt; ini &lt;&lt; ' ' &lt;&lt; now &lt;&lt; ' ' &lt;&lt; tmp &lt;&lt; endl; vis[now] = 1, ans++; if (u[now] &amp;&amp; now != ini) return; for (int i = head[now]; i; i = nxt[i]) { int to = ver[i]; if (vis[to] || (u[to] &amp;&amp; (col[to] == col[ini] || lv[to] &gt; lv[ini]))) continue; // cout &lt;&lt; "//" &lt;&lt; to &lt;&lt; endl; if (opt[i] == 1 &amp;&amp; tmp == 0) dfs(to, ini, 1); if (opt[i] == 2) { if (tmp == 0) { if (to == now + 1) dfs(to, ini, 2); else if (to == now - 1) dfs(to, ini, 3); else if (to &lt; now) dfs(to, ini, 4); else if (to &gt; now) dfs(to, ini, 5); } else if (tmp == 2 &amp;&amp; to == now + 1) dfs(to, ini, 2); else if (tmp == 3 &amp;&amp; to == now - 1) dfs(to, ini, 3); else if (tmp == 4 &amp;&amp; to &lt; now &amp;&amp; to != now - 1) dfs(to, ini, 4); else if (tmp == 5 &amp;&amp; to &gt; now &amp;&amp; to != now + 1) dfs(to, ini, 5); } } } void dfs2(int now, int ini) { // cout &lt;&lt; ini &lt;&lt; ' ' &lt;&lt; now &lt;&lt; endl; if (!vis[now]) ans++; vis2[now] = vis[now] = 1; if (u[now] &amp;&amp; now != ini) return; for (int i = head[now]; i; i = nxt[i]) { int to = ver[i]; // cout &lt;&lt; "/" &lt;&lt; now &lt;&lt; ' ' &lt;&lt; to &lt;&lt; ' ' &lt;&lt; vis2[to] &lt;&lt; endl; if (vis2[to] || (u[to] &amp;&amp; (col[to] == col[ini] || lv[to] &gt; lv[ini]))) continue; if (opt[i] != 3) continue; dfs2(ver[i], ini); } } int main() { freopen("chess.in", "r", stdin); freopen("chess.out", "w", stdout); int T = read(); while (T--) { memset(ver, 0, sizeof ver); memset(nxt, 0, sizeof nxt); memset(head, 0, sizeof head); memset(lv, 0, sizeof lv); memset(col, 0, sizeof col); memset(u, 0, sizeof u); memset(opt, 0, sizeof opt); cnt = 0; n = read(), m = read(), q = read(); // cout &lt;&lt; n &lt;&lt; ' ' &lt;&lt; m &lt;&lt; ' ' &lt;&lt; q &lt;&lt; endl; cv = cal(n, m); for (int i = 1; i &lt;= n; i++) { scanf("%s", s + 1); for (int j = 1; j &lt;= m - 1; j++) { int now = cal(i, j), to = cal(i, j + 1); if (s[j] == '0') continue; else add(now, to, s[j] - '0'), add(to, now, s[j] - '0'); } } for (int i = 1; i &lt;= n - 1; i++) { scanf("%s", s + 1); for (int j = 1; j &lt;= m; j++) { int now = cal(i, j), to = cal(i + 1, j); if (s[j] == '0') continue; else add(now, to, s[j] - '0'), add(to, now, s[j] - '0'); } } while (q--) { // cout &lt;&lt; q &lt;&lt; endl; int s1 = read(), s2 = read(), s3 = read(), s4 = read(); int now = cal(s3, s4); col[now] = s1, lv[now] = s2; u[now] = 1; memset(vis, 0, sizeof(bool) * (cv + 1)); ans = 0; memset(vis2, 0, sizeof(bool) * (cv + 1)); dfs(now, now, 0); dfs2(now, now); printf("%d\n", ans - 1); } // for (int i = head[8];i;i = nxt[i]) cout &lt;&lt; ver[i] &lt;&lt; ' '; cout &lt;&lt; endl; } return 0; } 距离考试结束还有 45 分钟，我没多想就直接开始搞起了 T3 的暴力，但根本想不到这题的暴力思路，随便写了一个 DFS，但又出现了灵异事件——一进入 DFS 变量 \(n\) 的值就会变成 0（，来不及思考，于是直接摆烂，输出了数列的原方差。。。 int main() { freopen("variance.in", "r", stdin); freopen("variance.out", "w", stdout); int n = read(); cnt = 1; for (int i = 1; i &lt;= n; i++) { a[i] = read(); } ll sum = 0; for (int i = 1; i &lt;= n; i++) { sum += a[i]; } double ave = (double)(sum) / (double)(n); double fc = 0; for (int i = 1; i &lt;= n; i++) { fc += (ave - a[i]) * (ave - a[i]); } printf("%lld\n", (ll)(fc * n)); return 0; } 摆完 T3 的烂还剩十几分钟，再次检查了每一题的文件输入输出、提交的文件版本等等。然后又仔细翻了翻每一题的 Subtask 有多少分。 终于，伴随着 13:00 监考的一声令下，我的OI生涯就此结束了。 站在电脑前，脑中回忆着刚刚所做的题，心中满是怅惘。根据之前的测试，T2 可能只能拿到前 4 个点，也就是 \(20\) 分，而 T4 撑死了也就只能拿下前六个点，也就是 \(24\) 分（也许第 \(3\sim6\) 个点都拿不下）。而那个跑了 0.9s 的 T1，哪怕就是运气爆棚，真的能在最后卡进 1s，加起来也不过 \(144\) 分，还不到去年江苏的一等线，而今年的试题又显然比去年的简单……也许，又忙活了一年，最终也不过只能得到这样的结果吧…… 在考场楼前，留下了退役后的第一张照片（）。同是高二的同学一同高喊着“退役快乐”，而我站在其中，只是和他们一起笑着，一言不发。 最终成绩&amp;赛后总结 民间数据做好之后，我才知道我的 T2 做法能还能过第 \(6\sim7\) 个点，也就是能拿到 \(30\) 分（）。在跑的过程中我也发现在评测平台上我程序的效率比考试机的效率要高得多，T1 三百毫秒以内便能求出结果。可能我考场上 O2 没开好？可能考试机的配置真的太渣了？不管怎么说，这对我而言必然是一个好消息，也给我点成绩带来了很多“变数”。而这次最大的变数就在于 T4： 洛谷 小图灵第一版 小图灵第二版 \(44\) \(84\) \(24\) 心随着小图灵预测分数线的波动一同悬了一周，我一直在祈祷：T4 水一点，T3 骗分有分。果然 CCF 还算有良心（），最终成绩：\(100+30+4+32=166\)。在接下来的一周内，则是更为煎熬的等分数线的一周。小图灵的数据依旧在上上下下地波动，我甚至测了全省的代码，但又不知道哪些不占有一等名额。 最后分数线放出的是那么突然，江苏线意外地又是 \(150\) 分。 虽然代码当中还有很多可以优化的地方，就如 T2 暴力要求的组合数，稍微想一想就知道其实是一个多重集的排列数，而那个式子稍加化简也能得到多重集排列数的计算式，本身薄弱的数学功底、微薄的算法储备也限制了我能想到“多重集”（事实上这东西我背过，但也仅限于背过，而且考试的时候都忘了）的可能；T3 因为经验不足（大概），DFS出现 \(n\) 变成 \(0\) 的原因竟然是把 \(n\) 设成了局部变量（）；T4 如果时间充裕甚至可以搞一搞第 \(9\sim 10\) 个点。当然，从结果上来看，我的退役赛，终于可以说是不留遗憾了。 结语 初入竞赛圈之时，便在不停地想象退役时的场景；而在退役之际，又在回忆出入竞赛时的每一刻。2017，我记得我是怎样跟着初中的教练误打误撞混进了 OI 的圈子；我记得我是怎样在一个只有5个人的考场拿到普及初赛的 \(21.5\) 分；我记得我是怎样不懂二分，不懂递归，逻辑等号怎样写成赋值等号。我记得我曾单纯地把信息看作爱好，佛系的做题方式让我的洛谷AC数一直不超过 40；我记得我曾分不清信息技术和信息学，一直用工程的眼光去看待竞赛题目。 我也不会忘记 2018 年我第一次走入南航校园，更加彻底地了解了所谓自主招生，见证了史上最难的一次普及复赛。自那时起，头脑中更常地会闪过一些好似梦幻的事物——人群、聚光灯……我更不会忘记 2019 年参加的夏令营——让我融入了 OI 的圈子，感受到了信奥选手之间那独有的凝聚力。 CSP-J 2019，240 分，压线一等。——但凡少了一分，我可能都没法进入现在所读的中学。 2020 年，初入高中的我请掉了所有能请的假来训练，最终还是以我校近乎垫底的成绩拿到了 NOIP 三等。 \[\displaylines{ 2017.10.15\sim2021.11.20 \\ \text{1497 Days in all} }\] 做过的题目并不多，好多题最终都半途而废；好多场 CF 都打得心不在焉，也有好多算法没有学过。既然退役了，那也只能放下了。 \[\text{图：水水水}\] \[\text{图：这个 rating 会不会再有变化呢}\] 颓废过，自责过；拼搏过，失落过。是终点，亦是起点。 \[\Large 高考\mathcal{rp++}！\] AnicoderAndy Dec4.2021 - Jan24.2022]]></summary></entry><entry><title type="html">OI 2020 游记</title><link href="https://anicoderandy.github.io/experience/oi-2020/" rel="alternate" type="text/html" title="OI 2020 游记" /><published>2021-01-01T15:04:00+00:00</published><updated>2021-01-01T15:04:00+00:00</updated><id>https://anicoderandy.github.io/experience/oi-2020</id><content type="html" xml:base="https://anicoderandy.github.io/experience/oi-2020/"><![CDATA[<h2 id="intro">Intro</h2>
<p>迷迷糊糊地就这么过去了，为期三个月的 2020 赛季也许就结束了。熟悉而又陌生的赛制，奇奇怪怪的赛题。今年，从初中到高中，从未见识的面孔（全是巨佬），从未见过的题目，从未听闻的算法，别了初中，在高中，我深感自己只会被吊打得更惨。</p>

<p>也许，就像是一场梦……</p>

<h2 id="day-2459133">Day 2459133</h2>
<p><del>初赛</del> CSP-S 第一轮。赛季的开始，也是高中 OI 生涯的第一役。单项选择错了四五题，其中有一道常识题。阅读理解题我也不知道应该如何评价，反正很毒瘤就是了。我从来都没学过如何判断时间复杂度，而第二题就连着来了四道时间复杂度的选择。第三段 99 行的程序看完我只能说一句：NB。完形填空 1 看错整除符号跪一题，完形填空 2，emm，不会状压，直接 0 分……</p>

<h2 id="day-2459160">Day 2459160</h2>
<p>CSP-S 第二轮。第一次只有一天的提高比赛（文 艺 复 兴）。拿到题目，我一看，哦，原来是大膜你（这篇游记小标题的灵感来源？）。好家伙，直接跳过看第二题。T2 签到题，在草稿纸上简单地推了推式子，半小时左右调好。出去上了趟厕所，回来测大样例，似乎过了？非常欣喜地关了做第三题。据蒻太菜，第三题知道要把加法运算和乘法运算统一起来，但是蒟蒻太菜根本不会，我也看出来是图论，但是不知道怎么下手，于是就写了个暴力跑路。T4，嗯，码完 20pts’ subtask 跑路。然后开始码 T1，一直没思路，我也从来没写过大膜你，就打了一张公元前的天数对应年份表，用二分确定年份，应该可以打到公元前的 40 分。</p>

<h2 id="day-2459161">Day 2459161</h2>
<p>测了民间数据……T1，好家伙，只有 10 分？T2，好家伙，只有 60 分？T3，好家伙，只有 10 分？ <del>T4，好家伙，只有20分？</del> T1 是真不会写；T2，仔细查错发现，没强制转换类型…………（但凡大样例满足 \(k&gt;32\) 我铁定能查出来啊啊啊），真・开了 ull 见祖宗；T3，忘记取模了：-）……</p>

<h2 id="day-2459185">Day 2459185</h2>
<p>开始停课训练。学了一两天 Tarjan 算法，做了一两道水题。</p>

<h2 id="day-2459188">Day 2459188</h2>
<p>NOIP 复活了！</p>

<p><del>“全体起立，背对电脑站好，现在还没到试机时间！”</del></p>

<p>试机，调教 vim，打了段<del>绝对用不到的</del>模板。</p>

<p>发题。T1 大水题？图论拓扑排序 + gcd,lcm。40 分钟码完。然后就到了整场考试最无聊的时间了。看看T2，字符串？！好家伙，不会。想了半天想出来一个错解，测完样例 1 才意识到自己全想错了。再去看 T3，我的表情：？？？CCF竟然开 SPJ？好家伙，checker 还 CE 了？（我们考场为什么没人来说要开 C++11？）T4，不会写暴力，输出 -1 跑路。看完后面几题，大概还有三个小时左右的时间，大脑几乎处于放空的状态，我也根本不知道自己在想什么，也不知道自己码出来了什么，三个小时就这样迷迷糊糊地过去了。</p>

<h2 id="reflection">Reflection</h2>
<p>2020 的信竞算是打完了。新的赛制，也让我见识到了新的折磨……CSP 的低级错误，NOIP 的大挫败……纵观今年正赛的 8 道赛题，似乎没有一道算是“主流算法”。从开学到现在我所上的竞赛课讲授的算法，我所新学的算法，似乎也没能体现在这两场比赛中。字符串，数论，那些以前摸都没摸过都东西……要学的还有很多，要走的路还有很长……</p>

<p>幻想总能在头脑中熠熠生辉，所想拥有的却总能在眼前烟消云散。“那是梦啊。”“那不是梦，只是意淫罢了。”回首望向自己曾走过的路，果然是一样的坑坑洼洼。</p>

<p>为了 A，总会要失去 B，但最终却未得到 A。</p>

<p>新年到了，愿能紧拥……</p>

\[\large
\mathcal{CSP-S2021}加油！\]

\[\large
\mathcal{NOIP2021}加油！\]

<p>AnicoderAndy</p>

<p>Dec5.2020 - Jan1.2020</p>

<p><del>好像就这么写完了，好一篇水文呢</del></p>]]></content><author><name>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="experience" /><summary type="html"><![CDATA[Intro 迷迷糊糊地就这么过去了，为期三个月的 2020 赛季也许就结束了。熟悉而又陌生的赛制，奇奇怪怪的赛题。今年，从初中到高中，从未见识的面孔（全是巨佬），从未见过的题目，从未听闻的算法，别了初中，在高中，我深感自己只会被吊打得更惨。 也许，就像是一场梦…… Day 2459133 初赛 CSP-S 第一轮。赛季的开始，也是高中 OI 生涯的第一役。单项选择错了四五题，其中有一道常识题。阅读理解题我也不知道应该如何评价，反正很毒瘤就是了。我从来都没学过如何判断时间复杂度，而第二题就连着来了四道时间复杂度的选择。第三段 99 行的程序看完我只能说一句：NB。完形填空 1 看错整除符号跪一题，完形填空 2，emm，不会状压，直接 0 分…… Day 2459160 CSP-S 第二轮。第一次只有一天的提高比赛（文 艺 复 兴）。拿到题目，我一看，哦，原来是大膜你（这篇游记小标题的灵感来源？）。好家伙，直接跳过看第二题。T2 签到题，在草稿纸上简单地推了推式子，半小时左右调好。出去上了趟厕所，回来测大样例，似乎过了？非常欣喜地关了做第三题。据蒻太菜，第三题知道要把加法运算和乘法运算统一起来，但是蒟蒻太菜根本不会，我也看出来是图论，但是不知道怎么下手，于是就写了个暴力跑路。T4，嗯，码完 20pts’ subtask 跑路。然后开始码 T1，一直没思路，我也从来没写过大膜你，就打了一张公元前的天数对应年份表，用二分确定年份，应该可以打到公元前的 40 分。 Day 2459161 测了民间数据……T1，好家伙，只有 10 分？T2，好家伙，只有 60 分？T3，好家伙，只有 10 分？ T4，好家伙，只有20分？ T1 是真不会写；T2，仔细查错发现，没强制转换类型…………（但凡大样例满足 \(k&gt;32\) 我铁定能查出来啊啊啊），真・开了 ull 见祖宗；T3，忘记取模了：-）…… Day 2459185 开始停课训练。学了一两天 Tarjan 算法，做了一两道水题。 Day 2459188 NOIP 复活了！ “全体起立，背对电脑站好，现在还没到试机时间！” 试机，调教 vim，打了段绝对用不到的模板。 发题。T1 大水题？图论拓扑排序 + gcd,lcm。40 分钟码完。然后就到了整场考试最无聊的时间了。看看T2，字符串？！好家伙，不会。想了半天想出来一个错解，测完样例 1 才意识到自己全想错了。再去看 T3，我的表情：？？？CCF竟然开 SPJ？好家伙，checker 还 CE 了？（我们考场为什么没人来说要开 C++11？）T4，不会写暴力，输出 -1 跑路。看完后面几题，大概还有三个小时左右的时间，大脑几乎处于放空的状态，我也根本不知道自己在想什么，也不知道自己码出来了什么，三个小时就这样迷迷糊糊地过去了。 Reflection 2020 的信竞算是打完了。新的赛制，也让我见识到了新的折磨……CSP 的低级错误，NOIP 的大挫败……纵观今年正赛的 8 道赛题，似乎没有一道算是“主流算法”。从开学到现在我所上的竞赛课讲授的算法，我所新学的算法，似乎也没能体现在这两场比赛中。字符串，数论，那些以前摸都没摸过都东西……要学的还有很多，要走的路还有很长…… 幻想总能在头脑中熠熠生辉，所想拥有的却总能在眼前烟消云散。“那是梦啊。”“那不是梦，只是意淫罢了。”回首望向自己曾走过的路，果然是一样的坑坑洼洼。 为了 A，总会要失去 B，但最终却未得到 A。 新年到了，愿能紧拥…… \[\large \mathcal{CSP-S2021}加油！\] \[\large \mathcal{NOIP2021}加油！\] AnicoderAndy Dec5.2020 - Jan1.2020 好像就这么写完了，好一篇水文呢]]></summary></entry><entry><title type="html">九年</title><link href="https://anicoderandy.github.io/experience/nine-years/" rel="alternate" type="text/html" title="九年" /><published>2020-10-08T14:31:00+00:00</published><updated>2020-10-08T14:31:00+00:00</updated><id>https://anicoderandy.github.io/experience/nine-years</id><content type="html" xml:base="https://anicoderandy.github.io/experience/nine-years/"><![CDATA[<h2 id="匆匆">匆匆</h2>
<p>就这样过去了。本来计划着的离别也只是匆匆。匆匆。离开校门的那一刻，也许就是这九年的终章。</p>

<p>中考的那几天，我总是让自己显得淡定从容，和大家约定着考完之后一起得瑟试卷简单。但我当然记得当提笔时沾满汗水的右手，记得看到不会的数学题时颤抖的身躯，记得卡在简单化学题时急促呼吸的口腔。</p>

<p>从容，也许都是假的。</p>

<p>回到教室，被留下收拾考场。我奔去一间间办公室，想道一句感谢，却不见一个人影；眼看着并不整齐的队伍渐行渐远，想留一句祝福，却无从追赶。</p>

<p>只有匆匆。</p>

<h2 id="备战">备战</h2>
<p>每一天都是平常的，但每一天都不是重复的。每天都有模拟考试，每天都有知识梳理，每天都有语数外物化史政。</p>

<p>我们有心急焦躁的老师，有从容不迫的老师，亦有考前仍能风趣幽默的老师。我们并没有布置作业死多的老师，也没有因为成绩狠批学生的老师。每一位老师，都在付出。</p>

<p>教室里并没有临近重大事件的气氛，全主科的课表早已是习以为常。没有怨言，没有懈怠。虽该聊的聊，该笑的笑，但该听时听，该写时写，谈笑的话题也不仅仅是游戏动漫了……</p>

<p>也有人不满这样的环境，也有人不愿拘泥于无聊的校规。尽管如此，每个人都在进步，每个人都在向<strong>更好</strong>前进。</p>

<h2 id="战疫">战疫</h2>
<blockquote>
  <p>政治题的命题以及作答通常分国家、社会、个人三个角度</p>
</blockquote>

<p>每个人都会犯错，每个人都会受伤。</p>

<p>每个人都会犯错，每个人都会受伤。</p>

<p>每个人都会犯错，每个人都会受伤。</p>

<hr />

<p><em>梦境与幻想</em></p>

<p><em>美好与希冀</em></p>

<p><em>为何会在不经意间</em></p>

<p><em>破碎</em></p>

<hr />

<p>呆在家里的日子，并不无聊，但也说不上是有意义……</p>

<h2 id="终启">终•启</h2>
<p>带着希望与梦想，我踏进了九年级的大门。面对着 56 张陌生的面孔，恐惧与激动交织在心间。那一刻，我并未意识到，我已经改变。这样的改变，是好是坏？而初三的启航，还有更多的不解。没了 NOIP，没了自主招生。生命路的两旁，左是迷，右是疑……终之启，充满这迷幻。</p>

<h2 id="盛夏">盛夏</h2>
<p>那应该是我唯一一次参加的<strong>正经</strong>一些的夏令营。JSOI的讲师虽然普遍头发稀少，但讲起课都能让我印象深刻。那可能是我度过的最<strong>快乐</strong>的夏天：熬夜被通报，组队玩游戏，刷虐题调程序<del>到掉头发</del>……</p>

<hr />

<p><em>不敢恭维。</em></p>

<p><em>不敢恭维！</em></p>

<p><em>不敢恭维？</em></p>

<p><em>流动的水在散着光亮的台阶上泠泠作响</em></p>

<p><em>净洁的镜在宛转流动的星河下熠熠生辉</em></p>

<p><em>倒影中</em></p>

<p><em>一只手，另一只手</em></p>

<p><em>只如幻影</em></p>

<p><em>紧紧相握</em>。</p>

\[\mathcal{\color{white}{We \ are \ simply \ friends, \ aren't \ we?}}\]

<h2 id="脸面">脸面</h2>
<p>“每天起床第一句”“让我们以热烈的掌声对两位领导的到来表示祝贺！”</p>

<p>“你看看你这次考的这个分数，能望啊？说明了什么？考试的时候状态不好？就是没好好学！这段时间学习效果很差。晚上几点钟睡的？平常有没有做什么额外的练习？我看你最近也不怎么忙吧。很忙吗？你忙什么东西的？你下次准备考多少？准备考年级第几？给我说清楚了！达不到怎么办！”</p>

<p>“上次怎么跟你说的，把你说的眼泪水都流下来了。有用啊？有没有下点决心啊？你平常晚上弄到几点的？啊？周围有没有什么人你觉得影响到你的？啊？好。那马上把他坐到你旁边来！为什么？督促你学习！”</p>

<p>“这双鞋可是当年我舅舅送给我的，还是当时的限量款的！你想赔现在都赔不了的！我这两天都在等你给我道歉，你还跟你妈说你受委屈了。你那件破衣服值什么钱？我这双鞋子（……）呢！你说你还要点脸面不要？”</p>

<h2 id="旗下">旗下</h2>
<p>“升过旗，唱国歌！”</p>

<ul>
  <li>我当了挺长时间的升旗仪式主持人（虽然不及我的“接班人”），也因此博得许多校领导的关注。但这种关注也许并非好事。一天上课我无(<del>you</del>)意冒犯了代课老师，次日就告上了一把手校长，紧接着是二把手校长，德育处主任，年级主任，班主任……一级接一级，我在领导班子眼中的形象，也变得微妙起来。</li>
</ul>

<p>“你知道你升旗仪式主持人的职位为什么会被撤下吗！”那天我又无意冒犯了班主任，他恼火地说……</p>

<h2 id="领读">领读</h2>
<p>用盛气凌人这个词来形容当时的我也许挺合适。</p>

<p>站上了讲台，我就把自己想象成了老师。我试着用老师的口吻，高谈阔论，口若悬河，讲错了，不要紧，反正没人在意;遇到连自己都把握不了的，不要紧，直接当众上网查。我总是那么自以为是……</p>

<h2 id="道别">道别</h2>
<p>那年，有人选择了树人，有人选择了邗实。但我们之间有了约定：三年后，扬中见……</p>

<h2 id="六一">六一</h2>
<p>在小学部的最后一期，学校终于给我们开展了儿童节的活动。这也是我小学阶段最后一次登台。挤出笑容，看着台下，一年级二年级三年级四年级五年级，当然还有同一级的笑脸，我顿时感到怅然。六年时光仿佛就在一晃间过去了，六年时光，仿佛就像眼前的纷乱的讲话声嘈杂声中，默默地过去。一年级被追着跑进厕所，二年级在肩上带上了两道横杠，三年级体育课上被全班喊着“漏油”的失落，四年级班会课上尴尬地讲着价值观，五年级在广播台大谈理想，六年级在鼓号队挥舞鼓槌……眼前，……</p>

<h2 id="萌芽">萌芽</h2>
<p>六年级，六年级，六年级。</p>

<p>青春，从这里萌发。</p>

<p>一对，一对，一对……</p>

<h2 id="神">神。</h2>
<p>三年级，分班。全班上下，又是许许多多的，陌生的面孔。我选上了班长。得罪人的生活也就此开始了。</p>

<h2 id="模糊">模糊</h2>
<p>选择了邗实……</p>

<p>那时怎知，邗实能与我共度3285天……</p>

<p>那时怎知，3285天后的自己会有多么的不舍……</p>

<p>感谢陪伴。</p>

<hr />

<h3 id="to-dream-with-love">To Dream with Love.</h3>

<p>With Love</p>

<p>2020.7.28 - 2020.10.8</p>

<p>本文章严禁转载。</p>]]></content><author><name>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="experience" /><summary type="html"><![CDATA[匆匆 就这样过去了。本来计划着的离别也只是匆匆。匆匆。离开校门的那一刻，也许就是这九年的终章。 中考的那几天，我总是让自己显得淡定从容，和大家约定着考完之后一起得瑟试卷简单。但我当然记得当提笔时沾满汗水的右手，记得看到不会的数学题时颤抖的身躯，记得卡在简单化学题时急促呼吸的口腔。 从容，也许都是假的。 回到教室，被留下收拾考场。我奔去一间间办公室，想道一句感谢，却不见一个人影；眼看着并不整齐的队伍渐行渐远，想留一句祝福，却无从追赶。 只有匆匆。 备战 每一天都是平常的，但每一天都不是重复的。每天都有模拟考试，每天都有知识梳理，每天都有语数外物化史政。 我们有心急焦躁的老师，有从容不迫的老师，亦有考前仍能风趣幽默的老师。我们并没有布置作业死多的老师，也没有因为成绩狠批学生的老师。每一位老师，都在付出。 教室里并没有临近重大事件的气氛，全主科的课表早已是习以为常。没有怨言，没有懈怠。虽该聊的聊，该笑的笑，但该听时听，该写时写，谈笑的话题也不仅仅是游戏动漫了…… 也有人不满这样的环境，也有人不愿拘泥于无聊的校规。尽管如此，每个人都在进步，每个人都在向更好前进。 战疫 政治题的命题以及作答通常分国家、社会、个人三个角度 每个人都会犯错，每个人都会受伤。 每个人都会犯错，每个人都会受伤。 每个人都会犯错，每个人都会受伤。 梦境与幻想 美好与希冀 为何会在不经意间 破碎 呆在家里的日子，并不无聊，但也说不上是有意义…… 终•启 带着希望与梦想，我踏进了九年级的大门。面对着 56 张陌生的面孔，恐惧与激动交织在心间。那一刻，我并未意识到，我已经改变。这样的改变，是好是坏？而初三的启航，还有更多的不解。没了 NOIP，没了自主招生。生命路的两旁，左是迷，右是疑……终之启，充满这迷幻。 盛夏 那应该是我唯一一次参加的正经一些的夏令营。JSOI的讲师虽然普遍头发稀少，但讲起课都能让我印象深刻。那可能是我度过的最快乐的夏天：熬夜被通报，组队玩游戏，刷虐题调程序到掉头发…… 不敢恭维。 不敢恭维！ 不敢恭维？ 流动的水在散着光亮的台阶上泠泠作响 净洁的镜在宛转流动的星河下熠熠生辉 倒影中 一只手，另一只手 只如幻影 紧紧相握。 \[\mathcal{\color{white}{We \ are \ simply \ friends, \ aren't \ we?}}\] 脸面 “每天起床第一句”“让我们以热烈的掌声对两位领导的到来表示祝贺！” “你看看你这次考的这个分数，能望啊？说明了什么？考试的时候状态不好？就是没好好学！这段时间学习效果很差。晚上几点钟睡的？平常有没有做什么额外的练习？我看你最近也不怎么忙吧。很忙吗？你忙什么东西的？你下次准备考多少？准备考年级第几？给我说清楚了！达不到怎么办！” “上次怎么跟你说的，把你说的眼泪水都流下来了。有用啊？有没有下点决心啊？你平常晚上弄到几点的？啊？周围有没有什么人你觉得影响到你的？啊？好。那马上把他坐到你旁边来！为什么？督促你学习！” “这双鞋可是当年我舅舅送给我的，还是当时的限量款的！你想赔现在都赔不了的！我这两天都在等你给我道歉，你还跟你妈说你受委屈了。你那件破衣服值什么钱？我这双鞋子（……）呢！你说你还要点脸面不要？” 旗下 “升过旗，唱国歌！” 我当了挺长时间的升旗仪式主持人（虽然不及我的“接班人”），也因此博得许多校领导的关注。但这种关注也许并非好事。一天上课我无(you)意冒犯了代课老师，次日就告上了一把手校长，紧接着是二把手校长，德育处主任，年级主任，班主任……一级接一级，我在领导班子眼中的形象，也变得微妙起来。 “你知道你升旗仪式主持人的职位为什么会被撤下吗！”那天我又无意冒犯了班主任，他恼火地说…… 领读 用盛气凌人这个词来形容当时的我也许挺合适。 站上了讲台，我就把自己想象成了老师。我试着用老师的口吻，高谈阔论，口若悬河，讲错了，不要紧，反正没人在意;遇到连自己都把握不了的，不要紧，直接当众上网查。我总是那么自以为是…… 道别 那年，有人选择了树人，有人选择了邗实。但我们之间有了约定：三年后，扬中见…… 六一 在小学部的最后一期，学校终于给我们开展了儿童节的活动。这也是我小学阶段最后一次登台。挤出笑容，看着台下，一年级二年级三年级四年级五年级，当然还有同一级的笑脸，我顿时感到怅然。六年时光仿佛就在一晃间过去了，六年时光，仿佛就像眼前的纷乱的讲话声嘈杂声中，默默地过去。一年级被追着跑进厕所，二年级在肩上带上了两道横杠，三年级体育课上被全班喊着“漏油”的失落，四年级班会课上尴尬地讲着价值观，五年级在广播台大谈理想，六年级在鼓号队挥舞鼓槌……眼前，…… 萌芽 六年级，六年级，六年级。 青春，从这里萌发。 一对，一对，一对…… 神。 三年级，分班。全班上下，又是许许多多的，陌生的面孔。我选上了班长。得罪人的生活也就此开始了。 模糊 选择了邗实…… 那时怎知，邗实能与我共度3285天…… 那时怎知，3285天后的自己会有多么的不舍…… 感谢陪伴。 To Dream with Love. With Love 2020.7.28 - 2020.10.8 本文章严禁转载。]]></summary></entry><entry><title type="html">CSP-J 2019 游记</title><link href="https://anicoderandy.github.io/experience/csp-j-2019/" rel="alternate" type="text/html" title="CSP-J 2019 游记" /><published>2019-11-12T15:27:00+00:00</published><updated>2019-11-12T15:27:00+00:00</updated><id>https://anicoderandy.github.io/experience/csp-j-2019</id><content type="html" xml:base="https://anicoderandy.github.io/experience/csp-j-2019/"><![CDATA[<h3 id="intro">Intro</h3>
<p>初三还在打 J 组的蒟蒻来写这种东西简直是在主动丢脸；但想想，这初中两年一个月，我的脸反正是丢的差不多了，在全站写篇丢脸的东西也算是“不足为奇”吧。</p>

<p>我，JS 蒟蒻，生在弱市，就读于弱校（<del>在 OIerDB 上评级 H</del>），但在学校里，我却几乎算得上是最强的。我们这里对这个很不重视，停课练习是 100% 不可能的，<del>更别谈报销车费房费了</del>……</p>

<h3 id="day--1">Day -1</h3>
<p><del>7:00 到达学校，学习文化课</del></p>

<p>20:35 到达酒店，拿出电脑，打开 <del>B 站和</del>洛谷，稍微看了下自己跳过的坑，睡觉。</p>

<h3 id="day-1">Day 1</h3>
<p>早上又看了看夏令营的东西，吃了顿快餐，然后前往南京航天航空大学。</p>

<p><img src="https://i.loli.net/2019/11/22/YTOPKH25XMqnSvh.jpg" alt="一点排面都没有" /></p>

<p>13:50 机房出锅，陪着成百上千的选手在实验楼下晒了二十分钟太阳。</p>

<p><img src="https://i.loli.net/2019/11/22/jtyOwVopRLI4Une.jpg" alt="嘤嘤嘤" /></p>

<p>14:20 进入考场，宣布延长时间。</p>

<p>14:55 下发试卷。</p>

<p><del>是的，在几经周折后，我们居然还能看到试题。</del></p>

<ul>
  <li>T1
    <ul>
      <li>全体都会的大水题，5 分钟左右写完。</li>
    </ul>
  </li>
  <li>T2
    <ul>
      <li>模拟水题，然而第二重循环居然需要优化，其实优化一下循环变量就可以了，但我却摸门不着，想到了栈……后来发现栈不对，立刻改用队列……队列不对，改写优先队列……堆也不对，用模拟链表！！！（<del>然而写着写着发现自己已经不会写模拟链表了</del>）最后，还是用一个不完全优化的循环过了。</li>
      <li>
        <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stack&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;queue&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;map&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;utility&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;iostream&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="c1">//看看这几经周折的头文件。。。</span>
</code></pre></div>        </div>
      </li>
      <li>
        <div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="n">cnt</span><span class="p">;</span> <span class="n">j</span> <span class="o">&gt;=</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">tickets</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">t</span><span class="p">)</span> <span class="k">break</span><span class="p">;</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="n">j</span> <span class="o">&lt;=</span> <span class="n">cnt</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">tickets</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="o">&gt;=</span> <span class="n">price</span> <span class="o">&amp;&amp;</span> <span class="n">tickets</span><span class="p">[</span><span class="n">j</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="p">{</span>
        <span class="n">price</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="n">tickets</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>
<span class="p">}</span>
  <span class="c1">//最后写出来的蛇皮版本</span>
</code></pre></div>        </div>
      </li>
    </ul>
  </li>
  <li>T3
    <ul>
      <li>个人感觉难度最大的一题，考前把几乎所有精力都放在 DP 上，还是爆零……想输出 \(m\) 骗分，结果输入语句写错，输出的却又是 \(n\)……最后当然是爆零。（我太菜了嘤嘤嘤）</li>
      <li><code class="language-plaintext highlighter-rouge">scanf("%d", &amp;t, &amp;n, &amp;m);//我为什么能够把输入写成这样</code></li>
      <li><code class="language-plaintext highlighter-rouge">printf("%d\n", n);//我为什么会想到输出n</code></li>
      <li>说到底还是太菜，主动放弃，程序本地都没编译就直接交了，就是现在我也没看出来这题是完全背包。（我太菜了嘤嘤嘤）</li>
    </ul>
  </li>
  <li>T4
    <ul>
      <li>考前特地看了弗洛伊德，但没怎么做过图论，更不会想到 pj 考图论，用 dfs 水了一个，预计得分 \(40-50\)。</li>
    </ul>
  </li>
</ul>

<p>18:25 考官宣布停止作答，全体起立，收程序。我便和周围的大佬们交流。我旁边的一个比我矮至少两个头的小家伙问我怎么样，我跟他说：“太难了，我这种蒟蒻什么都不会。”他却道：“啊！不是挺简单的吗？”我跟他说：“害，我连第一题都不会，您们都是大佬啊！我估计第一题都没几个人做出来。”想不到，这位大佬居然一本正经地向我讲解第一题有多么多么简单：“只要读入一个字符串输出 1 的个数啊，不是这有什么难的？” <del>我猜测，这个同学没上过洛谷……？</del> 亦或是艰苦的训练使他失去了那么一点点的幽默感？还是，仅仅因他如此年轻致使他如此单纯亦自信地当一个大佬？……</p>
<h3 id="day-2">Day 2</h3>
<p><del>J 组没有 Day 2……</del></p>

<p>在洛谷和 oitiku 上估了下分，</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Topic</th>
      <th style="text-align: center">Luogu</th>
      <th style="text-align: center">OItiku</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">100</td>
      <td style="text-align: center">100</td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center">100</td>
      <td style="text-align: center">100</td>
    </tr>
    <tr>
      <td style="text-align: center">3</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
    </tr>
    <tr>
      <td style="text-align: center">4</td>
      <td style="text-align: center">50</td>
      <td style="text-align: center">40</td>
    </tr>
    <tr>
      <td style="text-align: center">Total</td>
      <td style="text-align: center">250</td>
      <td style="text-align: center">240</td>
    </tr>
  </tbody>
</table>

<p>估了分，就是回归文化课了。该上的补习班还得要上，该补的作业还是要补……</p>

<h3 id="summary">Summary</h3>
<p>还记得去年 NOIP2018 中，这个蒟蒻只拿了一百八十几分。现今看来，虽非吴下阿蒙，亦非吕蒙大将也。进步当然是有的，而蒟蒻的本性固然难移。</p>

<p>初三了，再怎么说也是要中考的人了。JS 中考的重要性已是我们老师每天都要激励我们的话语了。每天 40 分钟的训练，在别人眼中，甚至是异常荒唐的浪费时间。JS 考生都注重的东西也许就那么一个：分。而每天的我，不也正是在为各种“分”的诱惑而拼搏吗？我家长总跟我说，就当玩玩，别用心学，别指望这个东西能给你加分，就当个兴趣。他们不愿让我多花时间，总想阉割这一时的短暂的两个月的训练时间为那看似更为重要的 300 多天之后的中考复习。我们在为“分”而努力，却又不被认同……</p>

<p>也许，这也是很多 OIer 的难处。</p>

<p>如今，放下了比赛，我也成为了曾从未想过的“半退役选手”。</p>

<p>J 组生涯的最后一次比赛，虽有遗憾，但又不留遗憾；放下，是不舍，亦是不愿，却又是再相见的期许。</p>

<p>往前看！</p>

<p>\(2020\) 年中考加油！</p>

<p>\(2020\) 年，OI 加油！</p>]]></content><author><name>Jingye Qiu</name><email>anicoder@hnu.edu.cn</email></author><category term="experience" /><summary type="html"><![CDATA[Intro 初三还在打 J 组的蒟蒻来写这种东西简直是在主动丢脸；但想想，这初中两年一个月，我的脸反正是丢的差不多了，在全站写篇丢脸的东西也算是“不足为奇”吧。 我，JS 蒟蒻，生在弱市，就读于弱校（在 OIerDB 上评级 H），但在学校里，我却几乎算得上是最强的。我们这里对这个很不重视，停课练习是 100% 不可能的，更别谈报销车费房费了…… Day -1 7:00 到达学校，学习文化课 20:35 到达酒店，拿出电脑，打开 B 站和洛谷，稍微看了下自己跳过的坑，睡觉。 Day 1 早上又看了看夏令营的东西，吃了顿快餐，然后前往南京航天航空大学。 13:50 机房出锅，陪着成百上千的选手在实验楼下晒了二十分钟太阳。 14:20 进入考场，宣布延长时间。 14:55 下发试卷。 是的，在几经周折后，我们居然还能看到试题。 T1 全体都会的大水题，5 分钟左右写完。 T2 模拟水题，然而第二重循环居然需要优化，其实优化一下循环变量就可以了，但我却摸门不着，想到了栈……后来发现栈不对，立刻改用队列……队列不对，改写优先队列……堆也不对，用模拟链表！！！（然而写着写着发现自己已经不会写模拟链表了）最后，还是用一个不完全优化的循环过了。 #include &lt;cstdio&gt; #include &lt;stack&gt; #include &lt;queue&gt; #include &lt;map&gt; #include &lt;utility&gt; #include &lt;iostream&gt; using namespace std; //看看这几经周折的头文件。。。 for (j = cnt; j &gt;= 1; j--) { if (tickets[j][0] &lt; t) break; } j++; for (; j &lt;= cnt; j++) { if (tickets[j][1] &gt;= price &amp;&amp; tickets[j][2] == 1) { price = 0; tickets[j][2] = 0; break; } } //最后写出来的蛇皮版本 T3 个人感觉难度最大的一题，考前把几乎所有精力都放在 DP 上，还是爆零……想输出 \(m\) 骗分，结果输入语句写错，输出的却又是 \(n\)……最后当然是爆零。（我太菜了嘤嘤嘤） scanf("%d", &amp;t, &amp;n, &amp;m);//我为什么能够把输入写成这样 printf("%d\n", n);//我为什么会想到输出n 说到底还是太菜，主动放弃，程序本地都没编译就直接交了，就是现在我也没看出来这题是完全背包。（我太菜了嘤嘤嘤） T4 考前特地看了弗洛伊德，但没怎么做过图论，更不会想到 pj 考图论，用 dfs 水了一个，预计得分 \(40-50\)。 18:25 考官宣布停止作答，全体起立，收程序。我便和周围的大佬们交流。我旁边的一个比我矮至少两个头的小家伙问我怎么样，我跟他说：“太难了，我这种蒟蒻什么都不会。”他却道：“啊！不是挺简单的吗？”我跟他说：“害，我连第一题都不会，您们都是大佬啊！我估计第一题都没几个人做出来。”想不到，这位大佬居然一本正经地向我讲解第一题有多么多么简单：“只要读入一个字符串输出 1 的个数啊，不是这有什么难的？” 我猜测，这个同学没上过洛谷……？ 亦或是艰苦的训练使他失去了那么一点点的幽默感？还是，仅仅因他如此年轻致使他如此单纯亦自信地当一个大佬？…… Day 2 J 组没有 Day 2…… 在洛谷和 oitiku 上估了下分， Topic Luogu OItiku 1 100 100 2 100 100 3 0 0 4 50 40 Total 250 240 估了分，就是回归文化课了。该上的补习班还得要上，该补的作业还是要补…… Summary 还记得去年 NOIP2018 中，这个蒟蒻只拿了一百八十几分。现今看来，虽非吴下阿蒙，亦非吕蒙大将也。进步当然是有的，而蒟蒻的本性固然难移。 初三了，再怎么说也是要中考的人了。JS 中考的重要性已是我们老师每天都要激励我们的话语了。每天 40 分钟的训练，在别人眼中，甚至是异常荒唐的浪费时间。JS 考生都注重的东西也许就那么一个：分。而每天的我，不也正是在为各种“分”的诱惑而拼搏吗？我家长总跟我说，就当玩玩，别用心学，别指望这个东西能给你加分，就当个兴趣。他们不愿让我多花时间，总想阉割这一时的短暂的两个月的训练时间为那看似更为重要的 300 多天之后的中考复习。我们在为“分”而努力，却又不被认同…… 也许，这也是很多 OIer 的难处。 如今，放下了比赛，我也成为了曾从未想过的“半退役选手”。 J 组生涯的最后一次比赛，虽有遗憾，但又不留遗憾；放下，是不舍，亦是不愿，却又是再相见的期许。 往前看！ \(2020\) 年中考加油！ \(2020\) 年，OI 加油！]]></summary></entry></feed>