<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>如形の博客</title>
  
  
  <link href="https://blog.rusin.lol/atom.xml" rel="self"/>
  
  <link href="https://blog.rusin.lol/"/>
  <updated>2026-06-21T03:31:41.628Z</updated>
  <id>https://blog.rusin.lol/</id>
  
  <author>
    <name>Ruyingsuixing</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>pagefcircle</title>
    <link href="https://blog.rusin.lol/article/2258269158/"/>
    <id>https://blog.rusin.lol/article/2258269158/</id>
    <published>2026-06-21T03:28:22.000Z</published>
    <updated>2026-06-21T03:31:41.628Z</updated>
    
    
    
    
    
  </entry>
  
  <entry>
    <title>在 Hexo 中复现洛谷插件</title>
    <link href="https://blog.rusin.lol/article/3935900/"/>
    <id>https://blog.rusin.lol/article/3935900/</id>
    <published>2026-06-07T10:31:24.000Z</published>
    <updated>2026-06-20T08:27:00.949Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>OIer 都知道，洛谷中有个 <a href="https://www.luogu.com.cn/article/70w8j2pj" title="插件 README">Markdown 插件</a>，非常好用，效果如下：</p><details class="foldable info">  <summary>这是一个提示</summary>  <div><p>我是提示内容。</p>  </div></details><details class="foldable warning">  <summary>我是父容器</summary>  <div><p>我是一些文字。</p><details class="foldable success" open>  <summary>我是子容器 1</summary>  <div><p>我是内容 1。</p>  </div></details><p>我是一些文字。</p><details class="foldable success" open>  <summary>我是子容器 2</summary>  <div><details class="foldable error" open>  <summary>我是子容器 3</summary>  <div><p>我是内容 2。</p>  </div></details>  </div></details><p>我是一些文字。</p>  </div></details><div class="epigraph"><p>大家好啊，我是说的道理。</p><p class="epigraph-author">——otto</p></div><div class="align-left"><p>居左内容。</p></div><div class="align-center"><p>居中内容。</p></div><div class="align-right"><p>居右内容。</p></div><p>源码：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line">:::info[这是一个提示]</span><br><span class="line">我是提示内容。</span><br><span class="line">:::</span><br><span class="line"></span><br><span class="line">:::::warning[我是父容器]</span><br><span class="line"></span><br><span class="line">我是一些文字。</span><br><span class="line"></span><br><span class="line">::::success[我是子容器 1]&#123;open&#125;</span><br><span class="line">我是内容 1。</span><br><span class="line">::::</span><br><span class="line"></span><br><span class="line">我是一些文字。</span><br><span class="line"></span><br><span class="line">::::success[我是子容器 2]&#123;open&#125;</span><br><span class="line">:::error[我是子容器 3]&#123;open&#125;</span><br><span class="line">我是内容 2。</span><br><span class="line">:::</span><br><span class="line">::::</span><br><span class="line"></span><br><span class="line">我是一些文字。</span><br><span class="line"></span><br><span class="line">:::::</span><br><span class="line"></span><br><span class="line">:::epigraph[——otto]</span><br><span class="line">大家好啊，我是说的道理。</span><br><span class="line">:::</span><br><span class="line"></span><br><span class="line">:::align&#123;left&#125;</span><br><span class="line">居左内容。</span><br><span class="line">:::</span><br><span class="line"></span><br><span class="line">:::align&#123;center&#125;</span><br><span class="line">居中内容。</span><br><span class="line">:::</span><br><span class="line"></span><br><span class="line">:::align&#123;right&#125;</span><br><span class="line">居右内容。</span><br><span class="line">:::</span><br></pre></td></tr></table></figure><p>还有更多……</p><p>尽管 <a href="https://docs.anheyu.com/">安知鱼主题</a> 自带很多 <a href="https://hexo.anheyu.com/posts/d50a.html">标签外挂</a>，但仍然无法满足<del>复制洛谷文章到博客</del>编写习惯性的需求，于是，我<strong>全网首发</strong>了在 Hexo 中使用洛谷 Md 插件教程。</p><details class="foldable info">  <summary>闲话</summary>  <div><p>由于<del>不良</del>习惯，我的所有 Markdown 文章编写均遵循洛谷的 <a href="https://help.luogu.com.cn/rules/academic/article-standard">专栏全站推荐规范</a>、<a href="https://help.luogu.com.cn/rules/academic/solution-standard">洛谷主题库题解规范</a>和<a href="https://help.luogu.com.cn/rules/academic/guide/solution">如何用 Markdown 和 LaTeX 写一篇排版整齐的题解？</a></p>  </div></details><h2 id="方法"><a href="#方法" class="headerlink" title="方法"></a>方法</h2><div class="align-center"><p>知其然，知其所以然</p></div><p>用 Javasript 自定义 Hexo 的 markdown 解析，用正则匹配把标识等进行匹配，转换为 Html，最后由 Css 完成样式。</p><h2 id="实现"><a href="#实现" class="headerlink" title="实现"></a>实现</h2><details class="foldable warning" open>  <summary>详情</summary>  <div><p>本教程以 anzhiyu 主题为例，其他主题亦可，视情况更改 Css 文件目录和引用方式，<del>参见你的博客主题的文档</del><em>以后可能会更新</em>下这篇文章，搞个多主题支持。</p>  </div></details><p>首先，在博客中新建 Css （<code>~/themes/···（主题名称）/source/css/custom_marked.css</code>）粘贴以下代码并引入（Anzhiyu 主题可以在 config.yml 中的 Inject.head 配置项中引入）。</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.align-left</span> &#123;</span><br><span class="line">  <span class="attribute">text-align</span>: left <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.align-center</span> &#123;</span><br><span class="line">  <span class="attribute">text-align</span>: center <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.align-right</span> &#123;</span><br><span class="line">  <span class="attribute">text-align</span>: right <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.epigraph</span> &#123;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">40%</span>;</span><br><span class="line">  <span class="attribute">margin-left</span>: <span class="number">60%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.epigraph</span> &gt; <span class="selector-pseudo">:last-child</span> &#123;</span><br><span class="line">  <span class="attribute">margin-top</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">border-top</span>: <span class="number">1px</span> solid <span class="number">#888</span>;</span><br><span class="line">  <span class="attribute">text-align</span>: right;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">summary</span> &#123;</span><br><span class="line">  <span class="attribute">list-style</span>: none;</span><br><span class="line">  -webkit-<span class="attribute">user-select</span>: none;</span><br><span class="line">  <span class="attribute">user-select</span>: none;</span><br><span class="line">  <span class="attribute">outline</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">padding-left</span>: <span class="number">24px</span>;</span><br><span class="line">  <span class="attribute">font-weight</span>: <span class="number">700</span>;</span><br><span class="line">  <span class="attribute">list-style</span>: none;</span><br><span class="line">  <span class="attribute">display</span>: list-item;</span><br><span class="line">  <span class="attribute">min-height</span>: <span class="number">1em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.foldable</span> &#123;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0.5em</span> <span class="number">1em</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">1em</span> <span class="number">0</span> <span class="number">1em</span> <span class="number">0.2em</span>;</span><br><span class="line">  <span class="attribute">border-left-width</span>: <span class="number">5px</span>;</span><br><span class="line">  <span class="attribute">border-left-style</span>: solid;</span><br><span class="line">  <span class="attribute">overflow</span>: hidden;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.foldable</span><span class="selector-class">.info</span> &#123;</span><br><span class="line">  <span class="attribute">border-left-color</span>: <span class="built_in">rgb</span>(<span class="number">52</span>, <span class="number">152</span>, <span class="number">219</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.foldable</span><span class="selector-class">.warning</span> &#123;</span><br><span class="line">  <span class="attribute">border-left-color</span>: <span class="built_in">rgb</span>(<span class="number">255</span>, <span class="number">193</span>, <span class="number">22</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.foldable</span><span class="selector-class">.success</span> &#123;</span><br><span class="line">  <span class="attribute">border-left-color</span>: <span class="built_in">rgb</span>(<span class="number">82</span>, <span class="number">196</span>, <span class="number">26</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.foldable</span><span class="selector-class">.error</span> &#123;</span><br><span class="line">  <span class="attribute">border-left-color</span>: <span class="built_in">rgb</span>(<span class="number">231</span>, <span class="number">76</span>, <span class="number">60</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.foldable</span><span class="selector-class">.bug</span> &#123;</span><br><span class="line">  <span class="attribute">border-left-color</span>: <span class="built_in">rgb</span>(<span class="number">231</span>, <span class="number">76</span>, <span class="number">60</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.foldable</span><span class="selector-class">.flask</span> &#123;</span><br><span class="line">  <span class="attribute">border-left-color</span>: <span class="built_in">rgb</span>(<span class="number">155</span>, <span class="number">89</span>, <span class="number">182</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.info</span> &gt; <span class="selector-tag">summary</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">rgb</span>(<span class="number">52</span>, <span class="number">152</span>, <span class="number">219</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.warning</span> &gt; <span class="selector-tag">summary</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">rgb</span>(<span class="number">255</span>, <span class="number">193</span>, <span class="number">22</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.success</span> &gt; <span class="selector-tag">summary</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">rgb</span>(<span class="number">82</span>, <span class="number">196</span>, <span class="number">26</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.error</span> &gt; <span class="selector-tag">summary</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">rgb</span>(<span class="number">231</span>, <span class="number">76</span>, <span class="number">60</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.bug</span> &gt; <span class="selector-tag">summary</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">rgb</span>(<span class="number">231</span>, <span class="number">76</span>, <span class="number">60</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.flask</span> &gt; <span class="selector-tag">summary</span> &#123;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">rgb</span>(<span class="number">155</span>, <span class="number">89</span>, <span class="number">182</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.info</span> &gt; <span class="selector-tag">summary</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  -webkit-<span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;%20viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">  <span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;%20viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM216 336h24V272H216c-13.3 0-24-10.7-24-24s10.7-24 24-24h48c13.3 0 24 10.7 24 24v88h8c13.3 0 24 10.7 24 24s-10.7 24-24 24H216c-13.3 0-24-10.7-24-24s10.7-24 24-24zm40-208a32 32 0 1 1 0 64 32 32 0 1 1 0-64z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.success</span> &gt; <span class="selector-tag">summary</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  -webkit-<span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;%20viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM369 209L241 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L335 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">  <span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;%20viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM369 209L241 337c-9.4 9.4-24.6 9.4-33.9 0l-64-64c-9.4-9.4-9.4-24.6 0-33.9s24.6-9.4 33.9 0l47 47L335 175c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.warning</span> &gt; <span class="selector-tag">summary</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  -webkit-<span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;%20viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zm0-384c13.3 0 24 10.7 24 24V264c0 13.3-10.7 24-24 24s-24-10.7-24-24V152c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">  <span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;%20viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zm0-384c13.3 0 24 10.7 24 24V264c0 13.3-10.7 24-24 24s-24-10.7-24-24V152c0-13.3 10.7-24 24-24zM224 352a32 32 0 1 1 64 0 32 32 0 1 1 -64 0z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.error</span> &gt; <span class="selector-tag">summary</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  -webkit-<span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;%20viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM175 175c9.4-9.4 24.6-9.4 33.9 0l47 47 47-47c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9l-47 47 47 47c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0l-47-47-47 47c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l47-47-47-47c-9.4-9.4-9.4-24.6 0-33.9z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">  <span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot;%20viewBox=&quot;0 0 512 512&quot;&gt;&lt;path d=&quot;M256 512A256 256 0 1 0 256 0a256 256 0 1 0 0 512zM175 175c9.4-9.4 24.6-9.4 33.9 0l47 47 47-47c9.4-9.4 24.6-9.4 33.9 0s9.4 24.6 0 33.9l-47 47 47 47c9.4 9.4 9.4 24.6 0 33.9s-24.6 9.4-33.9 0l-47-47-47 47c-9.4 9.4-24.6 9.4-33.9 0s-9.4-24.6 0-33.9l47-47-47-47c-9.4-9.4-9.4-24.6 0-33.9z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.bug</span> &gt; <span class="selector-tag">summary</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  -webkit-<span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons:CC BY 4.0,Fonts:SIL OFL 1.1,Code:MIT License) Copyright 2024 Fonticons,Inc. --&gt;&lt;path d=&quot;M256 0c53 0 96 43 96 96l0 3.6c0 15.7-12.7 28.4-28.4 28.4l-135.1 0c-15.7 0-28.4-12.7-28.4-28.4l0-3.6c0-53 43-96 96-96zM41.4 105.4c12.5-12.5 32.8-12.5 45.3 0l64 64c.7 .7 1.3 1.4 1.9 2.1c14.2-7.3 30.4-11.4 47.5-11.4l112 0c17.1 0 33.2 4.1 47.5 11.4c.6-.7 1.2-1.4 1.9-2.1l64-64c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-64 64c-.7 .7-1.4 1.3-2.1 1.9c6.2 12 10.1 25.3 11.1 39.5l64.3 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c0 24.6-5.5 47.8-15.4 68.6c2.2 1.3 4.2 2.9 6 4.8l64 64c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-63.1-63.1c-24.5 21.8-55.8 36.2-90.3 39.6L272 240c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 239.2c-34.5-3.4-65.8-17.8-90.3-39.6L86.6 502.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l64-64c1.9-1.9 3.9-3.4 6-4.8C101.5 367.8 96 344.6 96 320l-64 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l64.3 0c1.1-14.1 5-27.5 11.1-39.5c-.7-.6-1.4-1.2-2.1-1.9l-64-64c-12.5-12.5-12.5-32.8 0-45.3z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">  <span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 512 512&quot;&gt;&lt;!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons:CC BY 4.0,Fonts:SIL OFL 1.1,Code:MIT License) Copyright 2024 Fonticons,Inc. --&gt;&lt;path d=&quot;M256 0c53 0 96 43 96 96l0 3.6c0 15.7-12.7 28.4-28.4 28.4l-135.1 0c-15.7 0-28.4-12.7-28.4-28.4l0-3.6c0-53 43-96 96-96zM41.4 105.4c12.5-12.5 32.8-12.5 45.3 0l64 64c.7 .7 1.3 1.4 1.9 2.1c14.2-7.3 30.4-11.4 47.5-11.4l112 0c17.1 0 33.2 4.1 47.5 11.4c.6-.7 1.2-1.4 1.9-2.1l64-64c12.5-12.5 32.8-12.5 45.3 0s12.5 32.8 0 45.3l-64 64c-.7 .7-1.4 1.3-2.1 1.9c6.2 12 10.1 25.3 11.1 39.5l64.3 0c17.7 0 32 14.3 32 32s-14.3 32-32 32l-64 0c0 24.6-5.5 47.8-15.4 68.6c2.2 1.3 4.2 2.9 6 4.8l64 64c12.5 12.5 12.5 32.8 0 45.3s-32.8 12.5-45.3 0l-63.1-63.1c-24.5 21.8-55.8 36.2-90.3 39.6L272 240c0-8.8-7.2-16-16-16s-16 7.2-16 16l0 239.2c-34.5-3.4-65.8-17.8-90.3-39.6L86.6 502.6c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3l64-64c1.9-1.9 3.9-3.4 6-4.8C101.5 367.8 96 344.6 96 320l-64 0c-17.7 0-32-14.3-32-32s14.3-32 32-32l64.3 0c1.1-14.1 5-27.5 11.1-39.5c-.7-.6-1.4-1.2-2.1-1.9l-64-64c-12.5-12.5-12.5-32.8 0-45.3z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-class">.flask</span> &gt; <span class="selector-tag">summary</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  -webkit-<span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 448 512&quot;&gt;&lt;!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons:CC BY 4.0,Fonts:SIL OFL 1.1,Code:MIT License) Copyright 2024 Fonticons,Inc. --&gt;&lt;path d=&quot;M288 0L160 0 128 0C110.3 0 96 14.3 96 32s14.3 32 32 32l0 132.8c0 11.8-3.3 23.5-9.5 33.5L10.3 406.2C3.6 417.2 0 429.7 0 442.6C0 480.9 31.1 512 69.4 512l309.2 0c38.3 0 69.4-31.1 69.4-69.4c0-12.8-3.6-25.4-10.3-36.4L329.5 230.4c-6.2-10.1-9.5-21.7-9.5-33.5L320 64c17.7 0 32-14.3 32-32s-14.3-32-32-32L288 0zM192 196.8L192 64l64 0 0 132.8c0 23.7 6.6 46.9 19 67.1L309.5 320l-171 0L173 263.9c12.4-20.2 19-43.4 19-67.1z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">  <span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&#x27;data:image/svg+xml;utf8,&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; viewBox=&quot;0 0 448 512&quot;&gt;&lt;!--! Font Awesome Free 6.7.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons:CC BY 4.0,Fonts:SIL OFL 1.1,Code:MIT License) Copyright 2024 Fonticons,Inc. --&gt;&lt;path d=&quot;M288 0L160 0 128 0C110.3 0 96 14.3 96 32s14.3 32 32 32l0 132.8c0 11.8-3.3 23.5-9.5 33.5L10.3 406.2C3.6 417.2 0 429.7 0 442.6C0 480.9 31.1 512 69.4 512l309.2 0c38.3 0 69.4-31.1 69.4-69.4c0-12.8-3.6-25.4-10.3-36.4L329.5 230.4c-6.2-10.1-9.5-21.7-9.5-33.5L320 64c17.7 0 32-14.3 32-32s-14.3-32-32-32L288 0zM192 196.8L192 64l64 0 0 132.8c0 23.7 6.6 46.9 19 67.1L309.5 320l-171 0L173 263.9c12.4-20.2 19-43.4 19-67.1z&quot;/&gt;&lt;/svg&gt;&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">summary</span><span class="selector-pseudo">::before</span> &#123;</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&quot;&quot;</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: currentcolor;</span><br><span class="line">  -webkit-<span class="attribute">mask-size</span>: contain;</span><br><span class="line">  <span class="attribute">mask-size</span>: contain;</span><br><span class="line">  -webkit-<span class="attribute">mask-repeat</span>: no-repeat;</span><br><span class="line">  <span class="attribute">mask-repeat</span>: no-repeat;</span><br><span class="line">  -webkit-<span class="attribute">mask-position</span>: center;</span><br><span class="line">  <span class="attribute">mask-position</span>: center;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">left</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(-<span class="number">50%</span>);</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">16px</span>;</span><br><span class="line">  <span class="attribute">margin-right</span>: <span class="number">8px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">summary</span><span class="selector-pseudo">:after</span> &#123;</span><br><span class="line">  <span class="attribute">content</span>: <span class="string">&quot;&quot;</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: currentcolor;</span><br><span class="line">  -webkit-<span class="attribute">mask-size</span>: contain;</span><br><span class="line">  <span class="attribute">mask-size</span>: contain;</span><br><span class="line">  <span class="attribute">mask-image</span>: <span class="built_in">url</span>(<span class="string">&quot;data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20256%20512%22%3E%3Cpath%20d%3D%22M246.6%20278.6c12.5-12.5%2012.5-32.8%200-45.3l-128-128c-9.2-9.2-22.9-11.9-34.9-6.9s-19.8%2016.6-19.8%2029.6l0%20256c0%2012.9%207.8%2024.6%2019.8%2029.6s25.7%202.2%2034.9-6.9l128-128z%22%2F%3E%3C%2Fsvg%3E&quot;</span>);</span><br><span class="line">  -webkit-<span class="attribute">mask-repeat</span>: no-repeat;</span><br><span class="line">  <span class="attribute">mask-repeat</span>: no-repeat;</span><br><span class="line">  -webkit-<span class="attribute">mask-position</span>: center;</span><br><span class="line">  <span class="attribute">mask-position</span>: center;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">right</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">50%</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(-<span class="number">50%</span>);</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">16px</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">16px</span>;</span><br><span class="line">  <span class="attribute">transition</span>: transform <span class="number">0.2s</span> ease;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">details</span><span class="selector-attr">[open]</span> &gt; <span class="selector-tag">summary</span><span class="selector-pseudo">::after</span> &#123;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(-<span class="number">50%</span>) <span class="built_in">rotate</span>(<span class="number">90deg</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">pre <span class="selector-tag">code</span><span class="selector-class">.hljs</span> &#123;</span><br><span class="line">  <span class="attribute">display</span>: block;</span><br><span class="line">  <span class="attribute">overflow-x</span>: auto;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">1em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">code</span><span class="selector-class">.hljs</span> &#123;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">3px</span> <span class="number">5px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">code</span><span class="selector-attr">[class*=<span class="string">&quot;language-&quot;</span>]</span>,</span><br><span class="line">pre &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="number">#fefefe</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#383a42</span>;</span><br><span class="line">  <span class="attribute">font-family</span>:</span><br><span class="line">    Fira Code,</span><br><span class="line">    Fira Mono,</span><br><span class="line">    Menlo,</span><br><span class="line">    Consolas,</span><br><span class="line">    DejaVu Sans Mono,</span><br><span class="line">    monospace;</span><br><span class="line">  <span class="attribute">direction</span>: ltr;</span><br><span class="line">  <span class="attribute">text-align</span>: left;</span><br><span class="line">  <span class="attribute">white-space</span>: pre;</span><br><span class="line">  <span class="attribute">word-spacing</span>: normal;</span><br><span class="line">  <span class="attribute">word-break</span>: normal;</span><br><span class="line">  <span class="attribute">line-height</span>: <span class="number">1.5</span>;</span><br><span class="line">  -moz-<span class="attribute">tab-size</span>: <span class="number">2</span>;</span><br><span class="line">  -o-<span class="attribute">tab-size</span>: <span class="number">2</span>;</span><br><span class="line">  <span class="attribute">tab-size</span>: <span class="number">2</span>;</span><br><span class="line">  -webkit-<span class="attribute">hyphens</span>: none;</span><br><span class="line">  -moz-<span class="attribute">hyphens</span>: none;</span><br><span class="line">  -ms-<span class="attribute">hyphens</span>: none;</span><br><span class="line">  <span class="attribute">hyphens</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">code</span><span class="selector-attr">[class*=<span class="string">&quot;language-&quot;</span>]</span>::-moz-selection,</span><br><span class="line">code[class*=<span class="string">&quot;language-&quot;</span>] *::-moz-selection,</span><br><span class="line">pre *::-moz-selection &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="number">#e5e5e6</span>;</span><br><span class="line">  <span class="attribute">color</span>: inherit;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">code</span><span class="selector-attr">[class*=<span class="string">&quot;language-&quot;</span>]</span><span class="selector-pseudo">::selection</span>,</span><br><span class="line"><span class="selector-tag">code</span><span class="selector-attr">[class*=<span class="string">&quot;language-&quot;</span>]</span> *<span class="selector-pseudo">::selection</span>,</span><br><span class="line">pre *<span class="selector-pseudo">::selection</span> &#123;</span><br><span class="line">  <span class="attribute">background</span>: <span class="number">#e5e5e6</span>;</span><br><span class="line">  <span class="attribute">color</span>: inherit;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">pre &#123;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">1em</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0.5em</span> <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">overflow</span>: auto;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">0.3em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-pseudo">:not</span>(pre) &gt; <span class="selector-tag">code</span><span class="selector-attr">[class*=<span class="string">&quot;language-&quot;</span>]</span> &#123;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0.2em</span> <span class="number">0.3em</span>;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">0.3em</span>;</span><br><span class="line">  <span class="attribute">white-space</span>: normal;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.copy-button</span><span class="selector-attr">[data-v-a7061ca4]</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">0.5em</span>;</span><br><span class="line">  <span class="attribute">right</span>: <span class="number">0.5em</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0.6em</span>;</span><br><span class="line">  <span class="attribute">display</span>: flex;</span><br><span class="line">  <span class="attribute">align-items</span>: center;</span><br><span class="line">  <span class="attribute">justify-content</span>: center;</span><br><span class="line">  <span class="attribute">transition</span>:</span><br><span class="line">    <span class="number">0.2s</span> ease-in-out opacity,</span><br><span class="line">    <span class="number">0.2s</span> ease-in-out color,</span><br><span class="line">    <span class="number">0.2s</span> ease-in-out background-color;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">background-color</span>: transparent;</span><br><span class="line">  <span class="attribute">border</span>: none;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">4px</span>;</span><br><span class="line">  <span class="attribute">cursor</span>: pointer;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#555</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.code-container</span> &#123;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">1rem</span> <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">border-radius</span>: <span class="number">0.3em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.code-container</span><span class="selector-pseudo">:hover</span> &gt; <span class="selector-class">.copy-button</span> &#123;</span><br><span class="line">  <span class="attribute">opacity</span>: <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-class">.code-container</span><span class="selector-pseudo">:hover</span> &gt; <span class="selector-class">.copy-button</span><span class="selector-pseudo">:hover</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: <span class="number">#ddd</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">h1</span> &#123;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">2em</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0.67em</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">h1</span> &#123;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">1.5rem</span> <span class="number">0</span> <span class="number">1rem</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">2em</span>;</span><br><span class="line">  <span class="attribute">padding-bottom</span>: <span class="number">0.1em</span>;</span><br><span class="line">  <span class="attribute">border-bottom</span>: solid <span class="number">1px</span> <span class="number">#d8d8d8</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">h2</span> &#123;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">1.2rem</span> <span class="number">0</span> <span class="number">1rem</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">1.5em</span>;</span><br><span class="line">  <span class="attribute">padding-bottom</span>: <span class="number">0.1em</span>;</span><br><span class="line">  <span class="attribute">border-bottom</span>: solid <span class="number">1px</span> <span class="number">#d8d8d8</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">h3</span> &#123;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">1.2rem</span> <span class="number">0</span> <span class="number">1rem</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">1.2em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">h4</span> &#123;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">1rem</span> <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">1.1em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">h5</span> &#123;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">1rem</span> <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">1em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">h6</span> &#123;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">1rem</span> <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">font-size</span>: <span class="number">1em</span>;</span><br><span class="line">  <span class="attribute">color</span>: <span class="number">#666</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">img</span> &#123;</span><br><span class="line">  <span class="attribute">max-width</span>: <span class="number">100%</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">ul</span>,</span><br><span class="line"><span class="selector-tag">ol</span> &#123;</span><br><span class="line">  <span class="attribute">padding-left</span>: <span class="number">2em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">li</span> + <span class="selector-tag">li</span> &#123;</span><br><span class="line">  <span class="attribute">margin-top</span>: <span class="number">0.2em</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">li</span><span class="selector-class">.task-list-item</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: relative;</span><br><span class="line">  <span class="attribute">list-style-type</span>: none;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">li</span><span class="selector-class">.task-list-item</span> &gt; <span class="selector-tag">input</span><span class="selector-pseudo">:first-child</span> &#123;</span><br><span class="line">  <span class="attribute">position</span>: absolute;</span><br><span class="line">  <span class="attribute">left</span>: -<span class="number">1.5em</span>;</span><br><span class="line">  <span class="attribute">top</span>: <span class="number">55%</span>;</span><br><span class="line">  <span class="attribute">transform</span>: <span class="built_in">translateY</span>(-<span class="number">50%</span>);</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">hr &#123;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">1em</span> <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">height</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">border</span>: none;</span><br><span class="line">  <span class="attribute">border-bottom</span>: solid <span class="number">1px</span> <span class="number">#eee</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">a</span> &#123;</span><br><span class="line">  <span class="attribute">text-decoration</span>: none;</span><br><span class="line">  <span class="attribute">transition</span>: filter <span class="number">0.1s</span> ease;</span><br><span class="line">  <span class="attribute">color</span>: <span class="built_in">rgb</span>(<span class="built_in">var</span>(--lcolor--link, <span class="number">52</span>, <span class="number">152</span>, <span class="number">219</span>));</span><br><span class="line">  <span class="attribute">cursor</span>: pointer;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">table</span> &#123;</span><br><span class="line">  <span class="attribute">border-collapse</span>: collapse;</span><br><span class="line">  <span class="attribute">border-spacing</span>: <span class="number">0</span>;</span><br><span class="line">  <span class="attribute">display</span>: block;</span><br><span class="line">  <span class="attribute">width</span>: <span class="number">100%</span>;</span><br><span class="line">  <span class="attribute">overflow</span>: auto;</span><br><span class="line">  <span class="attribute">word-break</span>: keep-all;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">10px</span>;</span><br><span class="line">  <span class="attribute">font-variant-numeric</span>: tabular-nums;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">th</span>,</span><br><span class="line"><span class="selector-tag">td</span> &#123;</span><br><span class="line">  <span class="attribute">border</span>: <span class="number">1px</span> solid <span class="number">#ddd</span>;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">6px</span> <span class="number">13px</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">blockquote</span> &#123;</span><br><span class="line">  <span class="attribute">padding</span>: <span class="number">10px</span> <span class="number">20px</span>;</span><br><span class="line">  <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">20px</span>;</span><br><span class="line">  <span class="attribute">border-left</span>: <span class="number">5px</span> solid <span class="number">#eee</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">a</span> &#123;</span><br><span class="line">  <span class="attribute">background-color</span>: transparent;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后直接在 <code>~/themes/···（主题名称）/scripts</code> 中新建 custom_marked.js（也可以是别的名字），粘贴以下代码即可，<strong>不用引入</strong>。</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> allowedFoldableTypes = <span class="keyword">new</span> <span class="title class_">Set</span>([<span class="string">&#x27;info&#x27;</span>, <span class="string">&#x27;warning&#x27;</span>, <span class="string">&#x27;success&#x27;</span>, <span class="string">&#x27;error&#x27;</span>, <span class="string">&#x27;bug&#x27;</span>, <span class="string">&#x27;flask&#x27;</span>]);</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">renderMarkdown</span>(<span class="params">content</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> hexo.<span class="property">render</span>.<span class="title function_">renderSync</span>(&#123; <span class="attr">text</span>: content.<span class="title function_">trim</span>(), <span class="attr">engine</span>: <span class="string">&#x27;markdown&#x27;</span> &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">renderCustomBlock</span>(<span class="params">blockType, title, opt, body</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> type = blockType.<span class="title function_">toLowerCase</span>();</span><br><span class="line">  <span class="keyword">const</span> content = <span class="title function_">renderMarkdown</span>(body.<span class="title function_">trim</span>());</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (type === <span class="string">&#x27;align&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> dir = title ? title.<span class="title function_">trim</span>() : <span class="string">&#x27;left&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`\n&lt;div class=&quot;align-<span class="subst">$&#123;dir&#125;</span>&quot;&gt;\n<span class="subst">$&#123;content&#125;</span>\n&lt;/div&gt;\n`</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (type === <span class="string">&#x27;epigraph&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> author = title ? <span class="string">`&lt;p class=&quot;epigraph-author&quot;&gt;<span class="subst">$&#123;title&#125;</span>&lt;/p&gt;`</span> : <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`\n&lt;div class=&quot;epigraph&quot;&gt;\n<span class="subst">$&#123;content&#125;</span><span class="subst">$&#123;author&#125;</span>\n&lt;/div&gt;\n`</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (allowedFoldableTypes.<span class="title function_">has</span>(type)) &#123;</span><br><span class="line">    <span class="keyword">const</span> openAttr = opt &amp;&amp; opt.<span class="title function_">includes</span>(<span class="string">&#x27;open&#x27;</span>) ? <span class="string">&#x27; open&#x27;</span> : <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">    <span class="keyword">const</span> summary = title ? title.<span class="title function_">trim</span>() : <span class="string">&#x27;详情&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`\n&lt;details class=&quot;foldable <span class="subst">$&#123;type&#125;</span>&quot;<span class="subst">$&#123;openAttr&#125;</span>&gt;\n  &lt;summary&gt;<span class="subst">$&#123;summary&#125;</span>&lt;/summary&gt;\n  &lt;div&gt;\n<span class="subst">$&#123;content&#125;</span>\n  &lt;/div&gt;\n&lt;/details&gt;\n`</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">parseCustomBlocks</span>(<span class="params">content</span>) &#123;</span><br><span class="line">  <span class="keyword">const</span> lines = content.<span class="title function_">split</span>(<span class="regexp">/\r?\n/</span>);</span><br><span class="line">  <span class="keyword">const</span> root = &#123; <span class="attr">type</span>: <span class="string">&#x27;root&#x27;</span>, <span class="attr">children</span>: [] &#125;;</span><br><span class="line">  <span class="keyword">const</span> stack = [root];</span><br><span class="line">  <span class="keyword">let</span> codeFence = <span class="literal">null</span>;</span><br><span class="line">  <span class="keyword">const</span> openRule = <span class="regexp">/^\s*(:&#123;3,&#125;)([a-zA-Z]\w*)(?:\s*\[([^\]]*)\])?(?:\s*\&#123;([^&#125;]*)\&#125;)?\s*$/</span>;</span><br><span class="line">  <span class="keyword">const</span> closeRule = <span class="regexp">/^\s*(:&#123;3,&#125;)\s*$/</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">for</span> (<span class="keyword">const</span> line <span class="keyword">of</span> lines) &#123;</span><br><span class="line">    <span class="keyword">const</span> fenceMatch = line.<span class="title function_">match</span>(<span class="regexp">/^\s*(`&#123;3,&#125;|~&#123;3,&#125;)/</span>);</span><br><span class="line">    <span class="keyword">if</span> (fenceMatch) &#123;</span><br><span class="line">      <span class="keyword">const</span> fence = fenceMatch[<span class="number">1</span>];</span><br><span class="line">      <span class="keyword">if</span> (!codeFence) &#123;</span><br><span class="line">        codeFence = fence;</span><br><span class="line">      &#125; <span class="keyword">else</span> <span class="keyword">if</span> (codeFence === fence) &#123;</span><br><span class="line">        codeFence = <span class="literal">null</span>;</span><br><span class="line">      &#125;</span><br><span class="line">      stack[stack.<span class="property">length</span> - <span class="number">1</span>].<span class="property">children</span>.<span class="title function_">push</span>(&#123; <span class="attr">type</span>: <span class="string">&#x27;text&#x27;</span>, <span class="attr">value</span>: line &#125;);</span><br><span class="line">      <span class="keyword">continue</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (codeFence) &#123;</span><br><span class="line">      stack[stack.<span class="property">length</span> - <span class="number">1</span>].<span class="property">children</span>.<span class="title function_">push</span>(&#123; <span class="attr">type</span>: <span class="string">&#x27;text&#x27;</span>, <span class="attr">value</span>: line &#125;);</span><br><span class="line">      <span class="keyword">continue</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> openMatch = line.<span class="title function_">match</span>(openRule);</span><br><span class="line">    <span class="keyword">if</span> (openMatch) &#123;</span><br><span class="line">      <span class="keyword">const</span> level = openMatch[<span class="number">1</span>].<span class="property">length</span>;</span><br><span class="line">      <span class="keyword">const</span> blockType = openMatch[<span class="number">2</span>].<span class="title function_">toLowerCase</span>();</span><br><span class="line">      <span class="keyword">const</span> title = openMatch[<span class="number">3</span>] || <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">      <span class="keyword">const</span> opt = openMatch[<span class="number">4</span>] || <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">      <span class="keyword">const</span> node = &#123; <span class="attr">type</span>: <span class="string">&#x27;block&#x27;</span>, level, blockType, title, opt, <span class="attr">children</span>: [] &#125;;</span><br><span class="line">      stack[stack.<span class="property">length</span> - <span class="number">1</span>].<span class="property">children</span>.<span class="title function_">push</span>(node);</span><br><span class="line">      stack.<span class="title function_">push</span>(node);</span><br><span class="line">      <span class="keyword">continue</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> closeMatch = line.<span class="title function_">match</span>(closeRule);</span><br><span class="line">    <span class="keyword">if</span> (closeMatch) &#123;</span><br><span class="line">      <span class="keyword">const</span> level = closeMatch[<span class="number">1</span>].<span class="property">length</span>;</span><br><span class="line">      <span class="keyword">if</span> (stack.<span class="property">length</span> &gt; <span class="number">1</span> &amp;&amp; stack[stack.<span class="property">length</span> - <span class="number">1</span>].<span class="property">level</span> === level) &#123;</span><br><span class="line">        stack.<span class="title function_">pop</span>();</span><br><span class="line">        <span class="keyword">continue</span>;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    stack[stack.<span class="property">length</span> - <span class="number">1</span>].<span class="property">children</span>.<span class="title function_">push</span>(&#123; <span class="attr">type</span>: <span class="string">&#x27;text&#x27;</span>, <span class="attr">value</span>: line &#125;);</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="title function_">renderNode</span>(root);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">renderNode</span>(<span class="params">node</span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (node.<span class="property">type</span> === <span class="string">&#x27;root&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> node.<span class="property">children</span>.<span class="title function_">map</span>(renderNode).<span class="title function_">join</span>(<span class="string">&#x27;\n&#x27;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (node.<span class="property">type</span> === <span class="string">&#x27;text&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> node.<span class="property">value</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">if</span> (node.<span class="property">type</span> === <span class="string">&#x27;block&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">const</span> inner = node.<span class="property">children</span>.<span class="title function_">map</span>(renderNode).<span class="title function_">join</span>(<span class="string">&#x27;\n&#x27;</span>);</span><br><span class="line">    <span class="keyword">const</span> customHtml = <span class="title function_">renderCustomBlock</span>(node.<span class="property">blockType</span>, node.<span class="property">title</span>, node.<span class="property">opt</span>, inner);</span><br><span class="line">    <span class="keyword">if</span> (customHtml !== <span class="literal">null</span>) &#123;</span><br><span class="line">      <span class="keyword">return</span> customHtml;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">const</span> start = <span class="string">`<span class="subst">$&#123;<span class="string">&#x27;:&#x27;</span>.repeat(node.level)&#125;</span><span class="subst">$&#123;node.blockType&#125;</span><span class="subst">$&#123;node.title ? <span class="string">`[<span class="subst">$&#123;node.title&#125;</span>]`</span> : <span class="string">&#x27;&#x27;</span>&#125;</span><span class="subst">$&#123;node.opt ? <span class="string">`&#123;<span class="subst">$&#123;node.opt&#125;</span>&#125;`</span> : <span class="string">&#x27;&#x27;</span>&#125;</span>`</span>;</span><br><span class="line">    <span class="keyword">const</span> end = <span class="string">&#x27;:&#x27;</span>.<span class="title function_">repeat</span>(node.<span class="property">level</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="string">`<span class="subst">$&#123;start&#125;</span>\n<span class="subst">$&#123;inner&#125;</span>\n<span class="subst">$&#123;end&#125;</span>`</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="string">&#x27;&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">filter</span>.<span class="title function_">register</span>(<span class="string">&#x27;before_post_render&#x27;</span>, <span class="function"><span class="params">data</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">if</span> (<span class="keyword">typeof</span> data.<span class="property">content</span> !== <span class="string">&#x27;string&#x27;</span>) <span class="keyword">return</span> data;</span><br><span class="line">  hexo.<span class="property">log</span>.<span class="title function_">debug</span>(<span class="string">&#x27;custom_marked before_post_render&#x27;</span>, data.<span class="property">source</span> || data.<span class="property">path</span> || data.<span class="property">title</span> || <span class="string">&#x27;unknown&#x27;</span>);</span><br><span class="line">  data.<span class="property">content</span> = <span class="title function_">parseCustomBlocks</span>(data.<span class="property">content</span>);</span><br><span class="line">  <span class="keyword">return</span> data;</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><details class="foldable info" open>  <summary>为什么不用引入？</summary>  <div><p>与前面引入的 Css 不同的是，任意主题的目录 <code>~/themes/···（主题名称）/scripts</code> 功能都都一样，Hexo 解析时都会运行改此目录下的<strong>所有</strong> Javascript 文件。</p>  </div></details><details class="foldable error">  <summary>可能的错误</summary>  <div><p>一不小心放到了 <code>~/themes/anzhiyu/source/js/custom_marked.js</code> 里。<del>唐</del></p>  </div></details><h2 id="完结"><a href="#完结" class="headerlink" title="完结"></a>完结</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo new <span class="string">&quot;plugin-test&quot;</span></span><br><span class="line">hexo cl&amp;&amp;hexo g&amp;&amp;hexo s</span><br></pre></td></tr></table></figure><p>赶紧在文章里尝试并体验一下吧！是不是很好用？如果有什么建议，可以在<a href="#post-comment">评论区</a>告诉我哦！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;OIer 都知道，洛谷中有个 &lt;a href=&quot;https://www.luogu.com.cn/article/70w8j2pj&quot; tit</summary>
      
    
    
    
    <category term="网站开发" scheme="https://blog.rusin.lol/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Hexo" scheme="https://blog.rusin.lol/tags/Hexo/"/>
    
    <category term="安知鱼美化" scheme="https://blog.rusin.lol/tags/%E5%AE%89%E7%9F%A5%E9%B1%BC%E7%BE%8E%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>笔记——树形动态规划</title>
    <link href="https://blog.rusin.lol/article/1282611895/"/>
    <id>https://blog.rusin.lol/article/1282611895/</id>
    <published>2026-06-07T09:45:33.000Z</published>
    <updated>2026-06-07T11:15:05.998Z</updated>
    
    <content type="html"><![CDATA[<details class="foldable info" open>  <summary>详情</summary>  <div><p><strong>设计状态</strong>：用 $dp_{u,0/1}$ 表示以 $u$ 为根的子树的最大快乐指数。</p><p><strong>答案</strong>：$\max{dp_{root,1},dp_{root,0}}$。</p>  </div></details><h2 id="P1352-没有上司的舞会"><a href="#P1352-没有上司的舞会" class="headerlink" title="P1352 没有上司的舞会"></a><a href="https://www.luogu.com.cn/problem/P1352">P1352 没有上司的舞会</a></h2><p>若如图所示，当前 dfs 至点 $u$，则转移方程如下：<br>$$dp_{u,0}\leftarrow dp_{u,0}+\max(dp_{v,0},dp_{v,1})$$<br>$$dp_{u,1}\leftarrow dp_{u,1}+dp_{v,0}$$</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/dizzn16u.png" alt="1"></p><p>所以可以写出以下代码：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">int</span> n,r[<span class="number">6005</span>],in[<span class="number">6005</span>],rt,dp[<span class="number">6005</span>][<span class="number">2</span>];</span><br><span class="line">vector&lt;<span class="type">int</span>&gt;g[<span class="number">6005</span>];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> u)</span></span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> v:g[u])&#123;</span><br><span class="line">        <span class="built_in">dfs</span>(v);</span><br><span class="line">        dp[u][<span class="number">0</span>]+=<span class="built_in">max</span>(dp[v][<span class="number">0</span>],dp[v][<span class="number">1</span>]);</span><br><span class="line">        dp[u][<span class="number">1</span>]+=dp[v][<span class="number">0</span>];</span><br><span class="line">    &#125;</span><br><span class="line">    dp[u][<span class="number">1</span>]+=r[u];</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    cin&gt;&gt;n;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line">        cin&gt;&gt;r[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;n;++i)&#123;</span><br><span class="line">        <span class="type">int</span> u,v;</span><br><span class="line">        cin&gt;&gt;u&gt;&gt;v;</span><br><span class="line">        g[v].<span class="built_in">push_back</span>(u);</span><br><span class="line">        in[u]=<span class="number">1</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line">        <span class="keyword">if</span>(!in[i])&#123;</span><br><span class="line">            rt=i;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">dfs</span>(rt);</span><br><span class="line">    cout&lt;&lt;<span class="built_in">max</span>(dp[rt][<span class="number">0</span>],dp[rt][<span class="number">1</span>];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="P2016-SEERC-2000-战略游戏"><a href="#P2016-SEERC-2000-战略游戏" class="headerlink" title="P2016 [SEERC 2000] 战略游戏"></a><a href="https://www.luogu.com.cn/problem/P2016">P2016 [SEERC 2000] 战略游戏</a></h2><p>在开始是初始化一下 $dp_{u,0/1}$ 即可。</p><details class="foldable error" open>  <summary>为什么不需要初始化 $dp$ 为无穷大</summary>  <div><p>在 dfs 中会遍历每个子节点，所以初始化子节点即可，<strong>树形 DP 无需 memset</strong> $dp$ 数组。</p>  </div></details><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">int</span> n,in[<span class="number">5005</span>],dp[<span class="number">5005</span>][<span class="number">2</span>],rt;</span><br><span class="line">vector&lt;<span class="type">int</span>&gt;g[<span class="number">5005</span>];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> u)</span></span>&#123;</span><br><span class="line">    dp[u][<span class="number">0</span>]=<span class="number">0</span>;</span><br><span class="line">    dp[u][<span class="number">1</span>]=<span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> v:g[u])&#123;</span><br><span class="line">        <span class="built_in">dfs</span>(v);</span><br><span class="line">        dp[u][<span class="number">0</span>]+=dp[v][<span class="number">1</span>];</span><br><span class="line">        dp[u][<span class="number">1</span>]+=<span class="built_in">min</span>(dp[v][<span class="number">0</span>],dp[v][<span class="number">1</span>]);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    cin&gt;&gt;n;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line">        <span class="type">int</span> u,k,v;</span><br><span class="line">        cin&gt;&gt;u&gt;&gt;k;</span><br><span class="line">        u++;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">1</span>;j&lt;=k;++j)&#123;</span><br><span class="line">            cin&gt;&gt;v;</span><br><span class="line">            v++;</span><br><span class="line">            g[u].<span class="built_in">push_back</span>(v);</span><br><span class="line">            in[v]=<span class="number">1</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line">        <span class="keyword">if</span>(!in[i])&#123;</span><br><span class="line">            rt=i;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">dfs</span>(rt);</span><br><span class="line">    cout&lt;&lt;<span class="built_in">min</span>(dp[rt][<span class="number">0</span>],dp[rt][<span class="number">1</span>]);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="P1122-最大子树和"><a href="#P1122-最大子树和" class="headerlink" title="P1122 最大子树和"></a><a href="https://www.luogu.com.cn/problem/P1122">P1122 最大子树和</a></h2><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/f1kj14gd.png" alt="1"></p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">int</span> n,a[<span class="number">16005</span>],dp[<span class="number">16005</span>],ans=INT_MIN;</span><br><span class="line">vector&lt;<span class="type">int</span>&gt;g[<span class="number">16005</span>];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line">    dp[u]=a[u];</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> v:g[u])&#123;</span><br><span class="line">        <span class="keyword">if</span>(v!=fa)&#123;</span><br><span class="line">            <span class="built_in">dfs</span>(v,u);</span><br><span class="line">            dp[u]+=<span class="built_in">max</span>(<span class="number">0</span>,dp[v]);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    cin&gt;&gt;n;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)cin&gt;&gt;a[i];</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;n;++i)&#123;</span><br><span class="line">        <span class="type">int</span> u,v;</span><br><span class="line">        cin&gt;&gt;u&gt;&gt;v;</span><br><span class="line">        g[u].<span class="built_in">push_back</span>(v);</span><br><span class="line">        g[v].<span class="built_in">push_back</span>(u);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">dfs</span>(<span class="number">1</span>,<span class="number">0</span>);</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line">        ans=<span class="built_in">max</span>(dp[i],ans);</span><br><span class="line">    &#125;</span><br><span class="line">    cout&lt;&lt;ans;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="P2585-ZJOI2006-三色二叉树"><a href="#P2585-ZJOI2006-三色二叉树" class="headerlink" title="P2585 [ZJOI2006] 三色二叉树"></a><a href="https://www.luogu.com.cn/problem/P2585">P2585 [ZJOI2006] 三色二叉树</a></h2>]]></content>
    
    
      
      
    <summary type="html">&lt;details class=&quot;foldable info&quot; open&gt;
  &lt;summary&gt;详情&lt;/summary&gt;
  &lt;div&gt;
&lt;p&gt;&lt;strong&gt;设计状态&lt;/strong&gt;：用 $dp_{u,0/1}$ 表示以 $u$ 为根的子树的最大快乐指数。&lt;/p&gt;
&lt;p&gt;&lt;s</summary>
      
    
    
    
    <category term="信息学奥赛" scheme="https://blog.rusin.lol/categories/%E4%BF%A1%E6%81%AF%E5%AD%A6%E5%A5%A5%E8%B5%9B/"/>
    
    
    <category term="笔记" scheme="https://blog.rusin.lol/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://blog.rusin.lol/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>题解：AT_pakencamp_2020_day1_d 立方体を壊せ！</title>
    <link href="https://blog.rusin.lol/article/425958/"/>
    <id>https://blog.rusin.lol/article/425958/</id>
    <published>2026-06-06T11:35:33.000Z</published>
    <updated>2026-06-06T11:37:21.899Z</updated>
    
    <content type="html"><![CDATA[<h2 id="问题分析"><a href="#问题分析" class="headerlink" title="问题分析"></a>问题分析</h2><p>题目要求计算边长为 $N$ 的立方体被平面 $x+y+z=K$ 切割后，包含原点 $(0,0,0)$ 的部分体积的 <strong>6 倍</strong>是多少。<br>立方体的范围为 $0 \le x,y,z \le N$，平面 $x+y+z=K$ 将空间分为两部分，并且<strong>包含原点的部分</strong>满足 $x+y+z \le K$。</p><h2 id="核心思路"><a href="#核心思路" class="headerlink" title="核心思路"></a>核心思路</h2><p>根据 $K$ 与立方体的位置关系，平面切割立方体的效果不同，需分类讨论：</p><ul><li><strong>平面在立方体外部（$K \le 0$）</strong>：如图 1 ，此时 $x+y+z \le K$ 不包含立方体任何部分，$V_立=0$。<br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/2gwzloc6.png" alt="1">$\tiny\color{000000}图 1$</li><li><strong>平面切割出小四面体（$0&lt;K \le N$）</strong>：如图 2-1 , 平面与立方体相交形成以原点为顶点的四面体，如图 2-2 ，体积可直接用 $V_四$ 公式计算。<br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/2g4gmpiy.png" alt="1"><br>$$\tiny\color{000000}图 2-1$$<br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/w7d0dm2o.png" alt="1"><br>$$\tiny\color{000000}图 2-2$$</li><li><strong>平面切割立方体中部（$N&lt;K \le 2N$）</strong>：如图 3 ，平面与立方体的三个面相交，形成复杂区域，需通过几何分解推导体积公式。<br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/rlr1lmtg.png" alt="1"><br>$$\tiny\color{000000}图 3$$</li><li><strong>平面靠近立方体对角顶点（$2N&lt;K \le 3N$）</strong>：如图 4 ，平面切割后形成以原点为顶点的七面体，$V_七=V_立-V_四$。<br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/f55bsela.png" alt="1"><br>$$\tiny\color{000000}图 4$$</li><li><strong>平面完全在立方体外部（$K &gt; 3N$）</strong>：如图 5 ，整个立方体都满足 $x+y+z \le K$，$V_立=$ 立方体体积公式。<br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/pid9y8n6.png" alt="1"><br>$$\tiny\color{000000}图 5$$</li></ul><h2 id="公式推导"><a href="#公式推导" class="headerlink" title="公式推导"></a>公式推导</h2><ul><li>**当 $K \le 0$**<br>此时 $x+y+z \le K$ 无立方体部分，6 倍体积为：   <blockquote><p>$6 \times 0=0$</p></blockquote></li><li>**当 $0&lt;K \le N$**<br>平面切割出的区域是顶点为 $(0,0,0)、(K,0,0)、(0,K,0)、(0,0,K)$ 的四面体。四面体体积公式为 $V_四=\frac{1}{6}K^3$，因此 6 倍体积为：  <blockquote><p>$K^3$</p></blockquote></li><li>**当 $N &lt; K \leq 2N$**<br>平面与立方体的三个面相交，需通过积分或几何分解计算。推导得 6 倍体积公式：<blockquote><p>$3K^2N - 3KN^2 + N^3 - 2(K - N)^3$</p></blockquote></li><li>当 $2N &lt; K \le 3N$<br>包含原点的部分是整个立方体减去一个小四面体（顶点为 $(N,N,N)$，边长为 $3N - K$）。<br>立方体 6 倍体积为 $6N^3$，小四面体 6 倍体积为 $(3N - K)^3$，因此结果为：  <blockquote><p>$6N^3 - (3N - K)^3$</p></blockquote></li><li>**当 $K &gt; 3N$**<br>整个立方体都满足 $x + y + z \le K$，6 倍体积为立方体体积的 6 倍：  <blockquote><p>$6N^3$</p></blockquote></li></ul><h2 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h2><p>根据上述推导，分情况计算结果：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">long</span> <span class="type">long</span> n,k,res;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    cin&gt;&gt;n&gt;&gt;k;</span><br><span class="line">    <span class="keyword">if</span>(k==<span class="number">0</span>)&#123;</span><br><span class="line">        res=<span class="number">0</span>;</span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span>(k&lt;=n)&#123;</span><br><span class="line">        res=k*k*k;</span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span>(k&lt;=<span class="number">2</span>*n)&#123;</span><br><span class="line">        res=<span class="number">3</span>*k*k*n<span class="number">-3</span>*k*n*n+n*n*n<span class="number">-2</span>*(k-n)*(k-n)*(k-n);</span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span>(k&lt;=<span class="number">3</span>*n)&#123;</span><br><span class="line">        res=<span class="number">6</span>*n*n*n-(<span class="number">3</span>*n-k)*(<span class="number">3</span>*n-k)*(<span class="number">3</span>*n-k);</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">        res=<span class="number">6</span>*n*n*n;</span><br><span class="line">    &#125;</span><br><span class="line">    cout&lt;&lt;res&lt;&lt;endl;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;问题分析&quot;&gt;&lt;a href=&quot;#问题分析&quot; class=&quot;headerlink&quot; title=&quot;问题分析&quot;&gt;&lt;/a&gt;问题分析&lt;/h2&gt;&lt;p&gt;题目要求计算边长为 $N$ 的立方体被平面 $x+y+z=K$ 切割后，包含原点 $(0,0,0)$ 的部分体积的 &lt;str</summary>
      
    
    
    
    <category term="洛谷" scheme="https://blog.rusin.lol/categories/%E6%B4%9B%E8%B0%B7/"/>
    
    
    <category term="C++" scheme="https://blog.rusin.lol/tags/C/"/>
    
    <category term="题解" scheme="https://blog.rusin.lol/tags/%E9%A2%98%E8%A7%A3/"/>
    
  </entry>
  
  <entry>
    <title>题解：P13361 [GCJ 2011 Qualification] Bot Trust</title>
    <link href="https://blog.rusin.lol/article/317409/"/>
    <id>https://blog.rusin.lol/article/317409/</id>
    <published>2026-06-06T11:31:53.000Z</published>
    <updated>2026-06-06T11:41:21.787Z</updated>
    
    <content type="html"><![CDATA[<p>本题解被打回无法重新提交嘤嘤嘤</p><h2 id="题意理解"><a href="#题意理解" class="headerlink" title="题意理解"></a>题意理解</h2><h3 id="形式化翻译"><a href="#形式化翻译" class="headerlink" title="形式化翻译"></a>形式化翻译</h3><p>题目翻译有点难懂（<del>其实是本蒟蒻懒得看</del>），让本蒟蒻来形式化一下：</p><p>对于每组测试用例，有 $n$ 个执行任务的机器人和对应的按钮， $2$ 个机器人需<strong>依次</strong>按下自己对应的按钮，求计算 $2$ 个机器人按完按钮所需的最少时间。  </p><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><ul><li>必须严格按照给定顺序操作，后一个按钮的操作必须在前一个完成后才能开始。</li><li>机器人可同时移动但<strong>不能同时执行</strong>按键操作。</li></ul><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><h3 id="状态跟踪"><a href="#状态跟踪" class="headerlink" title="状态跟踪"></a>状态跟踪</h3><p>需使用记录两个机器人的当前位置 $poso$ 和 $posb$ （ $poso$ 对应<code>Orange</code>， $posb$ 对应<code>Blue</code>）和各自上次操作完成的时间 $timeo$ 和 $timeb$ ，以及整个流程的总时间 $s$ 。<br>对于每组测试用例，<strong>千万不要忘记</strong>对 $poso$ 、 $posb$ 、 $timeo$ 和 $timeb$ 进行<strong>初始化</strong>！</p><h3 id="操作逻辑"><a href="#操作逻辑" class="headerlink" title="操作逻辑"></a>操作逻辑</h3><ul><li>对每个命令，先确定执行的机器人（判断输入为<code>O</code>或<code>B</code>）。</li><li>计算从到达目标位置的时间 $|a_i-poso/posb| \times1$ 。</li><li>确定实际完成时间：取到达时间和当前总时间的最大值（保证顺序性），再加 $1$ 秒按键时间，用公式表达即为：  <blockquote><p>$$ntime \leftarrow \max{timeo+|a_i-poso/posb|,s}$$ </p></blockquote></li><li>更新机器人位置、对应完成时间和总时间。</li></ul><h2 id="代码实现"><a href="#代码实现" class="headerlink" title="代码实现"></a>代码实现</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="comment">// 存储每个命令的结构体：机器人类型和目标位置</span></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Command</span>&#123;</span><br><span class="line">    <span class="type">char</span> robot; </span><br><span class="line">    <span class="type">int</span> pos;</span><br><span class="line">&#125;a[<span class="number">100</span>]; </span><br><span class="line"><span class="type">int</span> t,n,poso,posb,timeo,timeb,s,p,ntime;</span><br><span class="line"><span class="type">char</span> c;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 初始化函数：重置机器人初始状态</span></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">init</span><span class="params">()</span></span>&#123;</span><br><span class="line">    poso=<span class="number">1</span>;  <span class="comment">// 初始位置均为1</span></span><br><span class="line">    posb=<span class="number">1</span>;</span><br><span class="line">    timeo=<span class="number">0</span>;  <span class="comment">// 初始时间为0</span></span><br><span class="line">    timeb=<span class="number">0</span>;</span><br><span class="line">    s=<span class="number">0</span>;  <span class="comment">// 总时间初始为0</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    cin&gt;&gt;t;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> k=<span class="number">1</span>;k&lt;=t;k++) &#123;</span><br><span class="line">        cin&gt;&gt;n;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i= <span class="number">0</span>;i&lt;n;i++) &#123;</span><br><span class="line">            cin&gt;&gt;a[i].robot&gt;&gt;a[i].pos;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">init</span>();  <span class="comment">// 初始化状态</span></span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;n;++i)&#123;</span><br><span class="line">            <span class="comment">//核心：顺序按下每个按钮</span></span><br><span class="line">            c=a[i].robot;  <span class="comment">// 当前命令的机器人</span></span><br><span class="line">            p=a[i].pos;    <span class="comment">// 当前命令的目标位置</span></span><br><span class="line">            <span class="keyword">if</span>(c==<span class="string">&#x27;O&#x27;</span>)&#123;  <span class="comment">// Orange机器人操作</span></span><br><span class="line">                <span class="comment">// 计算完成时间：到达时间与总时间取最大后+1秒按键</span></span><br><span class="line">                ntime=<span class="built_in">max</span>(timeo+<span class="built_in">abs</span>(p-poso),s)<span class="number">+1</span>;</span><br><span class="line">                poso=p;  <span class="comment">// 更新位置</span></span><br><span class="line">                timeo=s=ntime;  <span class="comment">// 更新时间</span></span><br><span class="line">            &#125;<span class="keyword">else</span>&#123;  <span class="comment">// Blue机器人操作</span></span><br><span class="line">                ntime=<span class="built_in">max</span>(timeb+<span class="built_in">abs</span>(p-posb),s)<span class="number">+1</span>;</span><br><span class="line">                posb=p;  <span class="comment">//同上</span></span><br><span class="line">                timeb=s=ntime;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="comment">// 格式化输出结果</span></span><br><span class="line">        cout&lt;&lt;<span class="string">&quot;Case #&quot;</span>&lt;&lt;k&lt;&lt;<span class="string">&quot;: &quot;</span>&lt;&lt;s&lt;&lt;endl;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="复杂度分析"><a href="#复杂度分析" class="headerlink" title="复杂度分析"></a>复杂度分析</h2><p>时间复杂度： $O(n)$ ，其中 $n$ 为命令数量，只需遍历一次所有命令。<br>空间复杂度： $O(n)$ ，用于存储命令数组（可优化为 $O(1)$ ，边读边处理）。  </p><h2 id="闲话"><a href="#闲话" class="headerlink" title="闲话"></a>闲话</h2><p><del>真是一道水题！</del><br>提交后，那<a href="https://www.luogu.com.cn/record/231500600" title="点此查看我的AC记录">只有两个的测试点和 20pts</a> 着实让我大跌眼镜。<br>本蒟蒻的第一篇题解，看了许多大佬的题解学习格式，花了一下午完成，望管理员大大通过。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;本题解被打回无法重新提交嘤嘤嘤&lt;/p&gt;
&lt;h2 id=&quot;题意理解&quot;&gt;&lt;a href=&quot;#题意理解&quot; class=&quot;headerlink&quot; title=&quot;题意理解&quot;&gt;&lt;/a&gt;题意理解&lt;/h2&gt;&lt;h3 id=&quot;形式化翻译&quot;&gt;&lt;a href=&quot;#形式化翻译&quot; class=&quot;hea</summary>
      
    
    
    
    <category term="洛谷" scheme="https://blog.rusin.lol/categories/%E6%B4%9B%E8%B0%B7/"/>
    
    
    <category term="C++" scheme="https://blog.rusin.lol/tags/C/"/>
    
    <category term="题解" scheme="https://blog.rusin.lol/tags/%E9%A2%98%E8%A7%A3/"/>
    
  </entry>
  
  <entry>
    <title>题解：P10409 「QFOI R2」水落溪流浅浅</title>
    <link href="https://blog.rusin.lol/article/139906/"/>
    <id>https://blog.rusin.lol/article/139906/</id>
    <published>2026-06-06T11:29:58.000Z</published>
    <updated>2026-06-06T11:31:21.659Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://www.luogu.com.cn/problem/P10409" title="P10409 「QFOI R2」水落溪流浅浅">题目传送门</a></p><h2 id="题意分析"><a href="#题意分析" class="headerlink" title="题意分析"></a>题意分析</h2><p><strong>核心</strong>：如果在 $24$ 小时制中小时数小于 $6$，则在 $30$ 小时制中小时数要 $+24$，否则不变即可。</p><h2 id="思路引导"><a href="#思路引导" class="headerlink" title="思路引导"></a>思路引导</h2><details class="foldable warning">  <summary>提问</summary>  <div><p>如何对 <code>hh:mm</code> 的格式进行输入？</p>  </div></details><details class="foldable success">  <summary>成功</summary>  <div><p>题目只需修改<strong>小时数</strong>（<code>hh</code>）部分，所以先输入一个数 $hh$ 方便进行修改。而 <code>:mm</code> 无需修改，再输入一个 string 类型后原封不动地输出即可。</p>  </div></details><details class="foldable warning">  <summary>提问</summary>  <div><p>如何对 $24$ 小时制中小时数（$hh$）修改为 $30$ 小时制中小时数？</p>  </div></details><details class="foldable success">  <summary>成功</summary>  <div><p>我们已经分析过题意了，当输入中小时数小于 $6$ 时，小时数要 $+24$，否则原封不动地输出。</p>  </div></details><details class="foldable warning">  <summary>提问</summary>  <div><p>如何将小时数补全至两位输出？</p>  </div></details><details class="foldable success">  <summary>成功</summary>  <div><p>使用 <code>if</code> 语句特判补前导零即可。</p>  </div></details><h2 id="核心代码"><a href="#核心代码" class="headerlink" title="核心代码"></a>核心代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">cin&gt;&gt;hh&gt;&gt;mm;</span><br><span class="line"><span class="keyword">if</span>(hh&lt;<span class="number">6</span>)&#123;</span><br><span class="line">hh+=<span class="number">24</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(hh&lt;<span class="number">10</span>)&#123;</span><br><span class="line">cout&lt;&lt;<span class="number">0</span>;</span><br><span class="line">&#125; </span><br><span class="line">cout&lt;&lt;hh&lt;&lt;mm;</span><br><span class="line"><span class="comment">//code by _ruyingsuixing_(UID:1620655)</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://www.luogu.com.cn/problem/P10409&quot; title=&quot;P10409 「QFOI R2」水落溪流浅浅&quot;&gt;题目传送门&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;题意分析&quot;&gt;&lt;a href=&quot;#题意分析&quot; class=&quot;heade</summary>
      
    
    
    
    <category term="洛谷" scheme="https://blog.rusin.lol/categories/%E6%B4%9B%E8%B0%B7/"/>
    
    
    <category term="C++" scheme="https://blog.rusin.lol/tags/C/"/>
    
    <category term="题解" scheme="https://blog.rusin.lol/tags/%E9%A2%98%E8%A7%A3/"/>
    
  </entry>
  
  <entry>
    <title>题解：P8534 「Wdoi-2」比赤色更红的梦</title>
    <link href="https://blog.rusin.lol/article/325266/"/>
    <id>https://blog.rusin.lol/article/325266/</id>
    <published>2026-06-06T11:26:35.000Z</published>
    <updated>2026-06-06T11:31:00.862Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://www.luogu.com.cn/problem/P8534">题目传送门</a></p><h2 id="题意分析"><a href="#题意分析" class="headerlink" title="题意分析"></a>题意分析</h2><p><strong>核心</strong>：对于每组数据，判断 $x$ 是否 $\ge 3$ 或 $\ge 5$ 并对应地将残机 $+1$，判断 $s$ 是否 $\ge 10000000$、$\ge 20000000$、$\ge 40000000$ 或 $\ge 60000000$ 并对应地将残机 $+1$。</p><h2 id="思路引导"><a href="#思路引导" class="headerlink" title="思路引导"></a>思路引导</h2><details class="foldable warning">  <summary>提问</summary>  <div><p>如何处理多组数据？</p>  </div></details><details class="foldable success">  <summary>成功</summary>  <div><p>使用 <code>while</code> 循环语句，每次将 $t-1$，因为 $t=0$ 时布尔值为 $0$, 即 false，所以将会跳出循环，此时循环语句正好执行 $t$ 次。格式如下：</p><p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span>(t--<span class="comment">/<em>布尔表达式</em>/</span>)&#123;</span><br><span class="line">  <span class="comment">//执行____</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>  </div></details><details class="foldable warning">  <summary>提问</summary>  <div><p>如何对 $x$ 和 $s$ 的值进行判断？</p>  </div></details><details class="foldable success">  <summary>成功</summary>  <div><p>使用 <code>if</code> 分支语句，格式如下：</p><p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//普通版：</span></span><br><span class="line"><span class="keyword">if</span>(<span class="comment">/<em>布尔表达式</em>/</span>)&#123;</span><br><span class="line">    <span class="comment">//执行____</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//压行版：</span></span><br><span class="line"><span class="keyword">if</span>(<span class="comment">/<em>布尔表达式</em>/</span>)<span class="comment">//执行____（限一句）</span></span><br></pre></td></tr></table></figure></p>  </div></details><details class="foldable error" open>  <summary>警示</summary>  <div><ul><li>如果你将 $s$ 开 int ，那么你将喜提 $\color{E74C3C}{\text{WA}}$，$\color{E74C3C}{\text{25pts}}$。请注意观察数据范围！<br><del>别问我是<a href="https://www.luogu.com.cn/record/236917936">怎么知道的</a></del></li><li>别忘了每次将 $ans$ 初始化为 $2$。</li></ul>  </div></details><h2 id="核心代码"><a href="#核心代码" class="headerlink" title="核心代码"></a>核心代码</h2><p>只提供 <code>while</code> 循环语句内的代码。</p><figure class="highlight cpp"><figcaption><span>lines</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">ans=<span class="number">2</span>;</span><br><span class="line">cin&gt;&gt;x&gt;&gt;s;</span><br><span class="line"><span class="keyword">if</span>(x&gt;=<span class="number">3</span>)ans++;</span><br><span class="line"><span class="keyword">if</span>(x&gt;=<span class="number">5</span>)ans++;</span><br><span class="line"><span class="keyword">if</span>(s&gt;=<span class="number">10000000</span>)ans++;</span><br><span class="line"><span class="keyword">if</span>(s&gt;=<span class="number">20000000</span>)ans++;</span><br><span class="line"><span class="keyword">if</span>(s&gt;=<span class="number">40000000</span>)ans++;</span><br><span class="line"><span class="keyword">if</span>(s&gt;=<span class="number">60000000</span>)ans++;</span><br><span class="line">cout&lt;&lt;ans&lt;&lt;endl;</span><br><span class="line"><span class="comment">//code by _ruyingsuixing_(UID:1620655)</span></span><br></pre></td></tr></table></figure><table><thead><tr><th>1</th><th>1</th></tr></thead><tbody><tr><td>1</td><td>&lt;</td></tr><tr><td>1</td><td>1</td></tr></tbody></table>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;a href=&quot;https://www.luogu.com.cn/problem/P8534&quot;&gt;题目传送门&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;题意分析&quot;&gt;&lt;a href=&quot;#题意分析&quot; class=&quot;headerlink&quot; title=&quot;题意分析&quot;&gt;&lt;/a&gt;题意分析&lt;/h2</summary>
      
    
    
    
    <category term="洛谷" scheme="https://blog.rusin.lol/categories/%E6%B4%9B%E8%B0%B7/"/>
    
    
    <category term="C++" scheme="https://blog.rusin.lol/tags/C/"/>
    
    <category term="题解" scheme="https://blog.rusin.lol/tags/%E9%A2%98%E8%A7%A3/"/>
    
  </entry>
  
  <entry>
    <title>AC 自动机笔记</title>
    <link href="https://blog.rusin.lol/article/3182685/"/>
    <id>https://blog.rusin.lol/article/3182685/</id>
    <published>2026-06-06T11:22:35.000Z</published>
    <updated>2026-06-07T10:22:16.598Z</updated>
    
    <content type="html"><![CDATA[<p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/ycm2f9av.png"></p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/akus9280.png"></p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/rktfergq.png"></p><p>模板代码（<a href="https://www.luogu.com.cn/problem/P3808">P3808 AC 自动机（简单版）</a>）</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">int</span> n,tot,cnt[<span class="number">1000005</span>],ch[<span class="number">1000005</span>][<span class="number">30</span>],ne[<span class="number">1000005</span>];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">insert</span><span class="params">(string s)</span></span>&#123;</span><br><span class="line"><span class="type">int</span> u=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">char</span> c:s)&#123;</span><br><span class="line"><span class="type">int</span> v=c-<span class="string">&#x27;a&#x27;</span>;</span><br><span class="line"><span class="keyword">if</span>(!ch[u][v])ch[u][v]=++tot;</span><br><span class="line">u=ch[u][v];</span><br><span class="line">&#125;</span><br><span class="line">cnt[u]++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">build</span><span class="params">()</span></span>&#123;</span><br><span class="line">queue&lt;<span class="type">int</span>&gt;q;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">26</span>;++i)&#123;</span><br><span class="line"><span class="keyword">if</span>(ch[<span class="number">0</span>][i])q.<span class="built_in">push</span>(ch[<span class="number">0</span>][i]);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">while</span>(!q.<span class="built_in">empty</span>())&#123;</span><br><span class="line"><span class="type">int</span> u=q.<span class="built_in">front</span>();</span><br><span class="line">q.<span class="built_in">pop</span>();</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">26</span>;++i)&#123;</span><br><span class="line"><span class="type">int</span> v=ch[u][i];</span><br><span class="line"><span class="keyword">if</span>(v)ne[v]=ch[ne[u]][i],q.<span class="built_in">push</span>(v);</span><br><span class="line"><span class="keyword">else</span> ch[u][i]=ch[ne[u]][i];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">query</span><span class="params">(string s)</span></span>&#123;</span><br><span class="line"><span class="type">int</span> ans=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> k=<span class="number">0</span>,i=<span class="number">0</span>;s[k];k++)&#123;</span><br><span class="line">i=ch[i][s[k]-<span class="string">&#x27;a&#x27;</span>];</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=i;j&amp;&amp;~cnt[j];j=ne[j])&#123;</span><br><span class="line">ans+=cnt[j],cnt[j]=<span class="number">-1</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line">string t;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">cin&gt;&gt;n;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line">string s;</span><br><span class="line">cin&gt;&gt;s;</span><br><span class="line"><span class="built_in">insert</span>(s);</span><br><span class="line">&#125;</span><br><span class="line">cin&gt;&gt;t;</span><br><span class="line"><span class="built_in">build</span>();</span><br><span class="line">cout&lt;&lt;<span class="built_in">query</span>(t);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src= &quot;data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7&quot; onerror=&quot;this.onerror=null,this.src=&amp;quot;/img</summary>
      
    
    
    
    <category term="信息学奥赛" scheme="https://blog.rusin.lol/categories/%E4%BF%A1%E6%81%AF%E5%AD%A6%E5%A5%A5%E8%B5%9B/"/>
    
    
    <category term="笔记" scheme="https://blog.rusin.lol/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://blog.rusin.lol/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>网络流笔记</title>
    <link href="https://blog.rusin.lol/article/27517532/"/>
    <id>https://blog.rusin.lol/article/27517532/</id>
    <published>2026-06-06T10:57:34.000Z</published>
    <updated>2026-06-07T10:22:20.105Z</updated>
    
    <content type="html"><![CDATA[<h2 id="增广路"><a href="#增广路" class="headerlink" title="增广路"></a>增广路</h2><p>ek 模板：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> ll=<span class="type">long</span> <span class="type">long</span>;</span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N=<span class="number">205</span>,M=<span class="number">5005</span>;</span><br><span class="line"><span class="type">int</span> n,m,s,t,cnt=<span class="number">1</span>,head[N],pre[N],mf[N];</span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">mf：当前增广路可通过水流</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">edge</span>&#123;</span><br><span class="line"><span class="type">int</span> nxt,to,w;</span><br><span class="line">&#125;e[<span class="number">2</span>*M];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">add</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> v,<span class="type">int</span> w)</span></span>&#123;</span><br><span class="line">e[++cnt].w=w;</span><br><span class="line">e[cnt].to=v;</span><br><span class="line">e[cnt].nxt=head[u];</span><br><span class="line">head[u]=cnt;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">bfs</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="built_in">memset</span>(mf,<span class="number">0</span>,<span class="keyword">sizeof</span> mf);</span><br><span class="line">queue&lt;<span class="type">int</span>&gt;q;</span><br><span class="line">q.<span class="built_in">push</span>(s);</span><br><span class="line">mf[s]=<span class="number">1e9</span>;</span><br><span class="line"><span class="keyword">while</span>(!q.<span class="built_in">empty</span>())&#123;</span><br><span class="line"><span class="type">int</span> u=q.<span class="built_in">front</span>();</span><br><span class="line">q.<span class="built_in">pop</span>();</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=head[u];i;i=e[i].nxt)&#123;</span><br><span class="line"><span class="type">int</span> v=e[i].to;</span><br><span class="line"><span class="keyword">if</span>(mf[v]==<span class="number">0</span>&amp;&amp;e[i].w)&#123;</span><br><span class="line">mf[v]=<span class="built_in">min</span>(mf[u],e[i].w);</span><br><span class="line">pre[v]=i;</span><br><span class="line">q.<span class="built_in">push</span>(v);</span><br><span class="line"><span class="keyword">if</span>(v==t)<span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">ll <span class="title">ek</span><span class="params">()</span></span>&#123;</span><br><span class="line">ll fl=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(<span class="built_in">bfs</span>())&#123;</span><br><span class="line"><span class="type">int</span> v=t;</span><br><span class="line"><span class="keyword">while</span>(v!=s)&#123;</span><br><span class="line"><span class="type">int</span> i=pre[v];</span><br><span class="line">e[i].w-=mf[t];</span><br><span class="line">e[i^<span class="number">1</span>].w+=mf[t];</span><br><span class="line">v=e[i^<span class="number">1</span>].to;</span><br><span class="line">&#125;</span><br><span class="line">fl+=mf[t];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> fl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">cin&gt;&gt;n&gt;&gt;m&gt;&gt;s&gt;&gt;t;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=m;++i)&#123;</span><br><span class="line"><span class="type">int</span> u,v,w;</span><br><span class="line">cin&gt;&gt;u&gt;&gt;v&gt;&gt;w;</span><br><span class="line"><span class="built_in">add</span>(u,v,w);</span><br><span class="line"><span class="built_in">add</span>(v,u,<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;<span class="built_in">ek</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>Dinic 模板：</p><figure class="highlight cpp"><figcaption><span>line-umbers</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> ll long long</span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> M=<span class="number">5005</span>;</span><br><span class="line"><span class="type">int</span> n,m,s,t,head[M],tot=<span class="number">1</span>,d[M],cur[M];</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">edge</span>&#123;</span><br><span class="line"><span class="type">int</span> v,nxt;</span><br><span class="line">ll flow;</span><br><span class="line">&#125;e[<span class="number">2</span>*M];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">add</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> v,<span class="type">int</span> w)</span></span>&#123;</span><br><span class="line">e[++tot]=&#123;v,head[u],w&#125;,head[u]=tot;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">bfs</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="built_in">memset</span>(d,<span class="number">0</span>,<span class="keyword">sizeof</span> d);</span><br><span class="line"><span class="built_in">memcpy</span>(cur,head,<span class="keyword">sizeof</span> head);</span><br><span class="line">queue&lt;<span class="type">int</span>&gt;q;</span><br><span class="line">q.<span class="built_in">push</span>(s);</span><br><span class="line">d[s]=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span>(!q.<span class="built_in">empty</span>())&#123;</span><br><span class="line"><span class="type">int</span> u=q.<span class="built_in">front</span>();</span><br><span class="line">q.<span class="built_in">pop</span>();</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=head[u];~i;i=e[i].nxt)&#123;</span><br><span class="line"><span class="type">int</span> v=e[i].v;</span><br><span class="line"><span class="keyword">if</span>(!d[v]&amp;&amp;e[i].flow)&#123;</span><br><span class="line">d[v]=d[u]<span class="number">+1</span>;</span><br><span class="line"><span class="keyword">if</span>(v==t)<span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">q.<span class="built_in">push</span>(v);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">ll <span class="title">dfs</span><span class="params">(<span class="type">int</span> u,ll flow)</span></span>&#123;</span><br><span class="line"><span class="keyword">if</span>(u==t||!flow)<span class="keyword">return</span> flow;</span><br><span class="line">ll rest=flow;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> &amp;i=cur[u];~i;i=e[i].nxt)&#123;</span><br><span class="line"><span class="type">int</span> v=e[i].v;</span><br><span class="line"><span class="keyword">if</span>(d[v]==d[u]<span class="number">+1</span>&amp;&amp;e[i].flow)&#123;</span><br><span class="line">ll k=<span class="built_in">dfs</span>(v,<span class="built_in">min</span>(rest,e[i].flow));</span><br><span class="line"><span class="keyword">if</span>(!k)d[v]=<span class="number">0</span>;</span><br><span class="line">e[i].flow-=k,e[i^<span class="number">1</span>].flow+=k;</span><br><span class="line"><span class="keyword">if</span>(!(rest-=k))<span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> flow-rest;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function">ll <span class="title">dinic</span><span class="params">()</span></span>&#123;</span><br><span class="line">ll maxflow=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(<span class="built_in">bfs</span>())maxflow+=<span class="built_in">dfs</span>(s,INT_MAX);</span><br><span class="line"><span class="keyword">return</span> maxflow;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="built_in">memset</span>(head, <span class="number">-1</span>, <span class="built_in">sizeof</span>(head));</span><br><span class="line">cin&gt;&gt;n&gt;&gt;m&gt;&gt;s&gt;&gt;t;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=m;++i)&#123;</span><br><span class="line"><span class="type">int</span> u,v,w;</span><br><span class="line">cin&gt;&gt;u&gt;&gt;v&gt;&gt;w;</span><br><span class="line"><span class="built_in">add</span>(u,v,w),<span class="built_in">add</span>(v,u,<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;<span class="built_in">dinic</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ul><li><a href="https://oi-wiki.org/graph/flow/">OI wiki</a></li><li><a href="https://www.luogu.com.cn/problem/list?tag=79">problems 1</a> &amp; <a href="https://www.luogu.com.cn/problem/list?tag=332">problems 2</a></li></ul><details class="foldable warning" open>  <summary>请注意</summary>  <div><p>本文章使用了 AI 辅助编写，请谨慎鉴别。</p>  </div></details><h2 id="Part-1-网络流的定义"><a href="#Part-1-网络流的定义" class="headerlink" title="Part. 1 网络流的定义"></a>Part. 1 网络流的定义</h2><h3 id="1-1-流网络"><a href="#1-1-流网络" class="headerlink" title="1.1 流网络"></a>1.1 流网络</h3><p>一个流网络是一个四元组 $N=(G,c,s,t)$，其中：</p><ul><li>$G=(V,E)$ 是一个无自环有向图。</li><li>$c:E\mapsto[0,+\infty)$ 是容量函数，$c(u,v)\geqslant0$。</li><li>$s\in V$ 是源点，$t\in V$ 是汇点，$s\ne t$。</li></ul><h3 id="1-2-流"><a href="#1-2-流" class="headerlink" title="1.2 流"></a>1.2 流</h3><p>一个流是函数 $f:E\to\mathbb{R}_{\geqslant0}$，满足：</p><p>(1) 容量约束：对每条边 $(u,v)\in E$，<br>$$0\leqslant f(u,v)\leqslant c(u,v)$$</p><p>(2) 流量守恒：对每个节点 $u\in V\setminus{s,t}$，<br>$$\sum_{v:(v,u)\in E} f(v,u) = \sum_{v:(u,v)\in E} f(u,v)$$<br>即，流入量等于流出量。</p><h3 id="1-4-净流量函数与流的值"><a href="#1-4-净流量函数与流的值" class="headerlink" title="1.4 净流量函数与流的值"></a>1.4 净流量函数与流的值</h3><p>对任意节点 $u\in V$，定义净流量：<br>$$\text{net}<em>f(u) = \sum</em>{v:(u,v)\in E} f(u,v) - \sum_{v:(v,u)\in E} f(v,u)$$</p><p>于是：</p><ul><li>对 $u\in V\setminus{s,t}$：$\text{net}_f(u)=0$（流量守恒）。</li><li>对源点：$\text{net}_f(s)=\left\lvert f\right\rvert$。</li><li>对汇点：$\text{net}_f(t)=-\left\lvert f\right\rvert$。</li></ul><p>注：在标准建模中，通常没有边指向源点，此时第二项为 $0$。</p><h2 id="Part-2-割的定义"><a href="#Part-2-割的定义" class="headerlink" title="Part. 2 割的定义"></a>Part. 2 割的定义</h2><p>设 $S\sub V$ 满足 $s\in S$ 且 $t\notin S$。令 $T=V\setminus S$。</p><p>割是指集合对 $(S,T)$。</p><p>割的容量定义为：<br>$$c(S,T) = \sum_{\substack{(u,v)\in E \ u\in S,,v\in T}} c(u,v)$$</p><p>即从 $S$ 指向 $T$ 的边的容量之和。</p><p>最小割是指容量最小的割。</p><h2 id="Part-3-最大流最小割定理"><a href="#Part-3-最大流最小割定理" class="headerlink" title="Part.3 最大流最小割定理"></a>Part.3 最大流最小割定理</h2><p>定理：对任意流网络，最大流的值等于最小割的容量：<br>$$\max\left\lvert f\right\rvert = \min_{S: s\in S,,t\notin S} c(S,T)$$</p><details class="foldable info">  <summary>证明</summary>  <div><h4 id="1-degree-弱对偶性（流-leqslant-割）"><a href="#1-degree-弱对偶性（流-leqslant-割）" class="headerlink" title="$1\degree$ 弱对偶性（流 $\leqslant$ 割）"></a>$1\degree$ 弱对偶性（流 $\leqslant$ 割）</h4><p>引理 1：对任意可行流 $f$ 和任意 $s{-}t$ 割 $(S,T)$，有 $\left\lvert f\right\rvert \leqslant c(S,T)$。</p><details class="foldable info">  <summary>证明</summary>  <div><p>首先，可将 $\left\lvert f\right\rvert$ 写成 $S$ 中所有节点的净流量之和：<br>$$\left\lvert f\right\rvert = \sum_{u\in S} \text{net}_f(u)$$</p><p>将净流量展开：<br>$$\begin{aligned}<br>\left\lvert f\right\rvert &amp;= \sum_{u\in S} \left( \sum_{v:(u,v)\in E} f(u,v) - \sum_{v:(v,u)\in E} f(v,u) \right) \<br>&amp;= \sum_{u\in S}\sum_{v:(u,v)\in E} f(u,v) - \sum_{u\in S}\sum_{v:(v,u)\in E} f(v,u)<br>\end{aligned}$$</p><p>交换求和顺序。第一项中，$(u,v)$ 的起点 $u$ 在 $S$ 中；第二项中，$(v,u)$ 的终点 $u$ 在 $S$ 中，等价于起点 $v$ 可以属于 $S$ 或 $T$。将第二项按起点分类：</p><p>$$<br>\left\lvert f\right\rvert = \sum_{u\in S,,v\in V} f(u,v) - \sum_{v\in V,,u\in S} f(v,u)<br>$$</p><p>将 $V$ 拆成 $S$ 和 $T$：</p><p>$$\left\lvert f\right\rvert = \cancel{\sum_{u\in S,,v\in S} f(u,v)} + \sum_{u\in S,,v\in T} f(u,v) - \cancel{\sum_{v\in S,,u\in S} f(v,u)} - \sum_{v\in T,,u\in S} f(v,u) = \sum_{u\in S,,v\in T} f(u,v) - \sum_{v\in T,,u\in S} f(v,u)$$</p><p>第一项是从 $S$ 到 $T$ 的边的流量之和，第二项是从 $T$ 到 $S$ 的边的流量之和。由于流量非负，第二项 $\geqslant 0$，因此：</p><p>$$\left\lvert f\right\rvert \leqslant \sum_{u\in S,,v\in T} f(u,v)$$</p><p>再由容量约束 $f(u,v) \leqslant c(u,v)$，得：</p><p>$$\left\lvert f\right\rvert \leqslant \sum_{u\in S,,v\in T} c(u,v) = c(S,T)$$</p><p>证毕！</p>  </div></details><p>故，推论：最大流 $\leqslant$ 最小割。</p><h4 id="2-degree-强对偶性（-exist-流-某个割）"><a href="#2-degree-强对偶性（-exist-流-某个割）" class="headerlink" title="$2\degree$ 强对偶性（$\exist$ 流 $=$ 某个割）"></a>$2\degree$ 强对偶性（$\exist$ 流 $=$ 某个割）</h4><p>引理2：设 $f$ 是最大流，定义 $S$ 为残量网络中从 $s$ 出发可达的节点集合。则 $(S,T)$ 是一个割，且 $\left\lvert f\right\rvert = c(S,T)$。</p><details class="foldable info" open>  <summary>残量网络定义</summary>  <div><p>对原图每条边 $(u,v)$，在残量网络中保留两条有向边：</p><ul><li>正向残量边：容量为 $c(u,v)-f(u,v)$（还可增加流量）</li><li>反向残量边：容量为 $f(u,v)$（还可减少流量）</li></ul>  </div></details><details class="foldable info">  <summary>证明</summary>  <div><p><strong>先证明</strong> $t\notin S$。</p><p>反证法。假设 $t\in S$，则 $\exist$ 一条从 $s$ 到 $t$ 的残量路径。沿着这条路径，我们可以增加一个正数 $\delta$ 的流量（取路径上 $\min$ 残量），从而得到更大的流，与 $f$ 是最大流矛盾。因此 $t\notin S$，故 $(S,T)$ 是 $s{-}t$ 割。</p><p><strong>再证明</strong> $\forall,u\in S,\ v\in T$，原边 $(u,v)$ 必然饱和。</p><p>依旧反证法。若 $\exist,u\in S$，$v\in T$ 使得 $f(u,v) &lt; c(u,v)$，则正向残量 $c(u,v)-f(u,v) &gt; 0$，意味着残量网络中有一条从 $u$ 到 $v$ 的边。由于 $u\in S$（从 $s$ 可达），那么 $v$ 也可达，从而 $v\in S$，与 $v\in T$ 矛盾。因此 $f(u,v)=c(u,v)$。</p><p><strong>接着证明</strong> $\forall,u\in T$，$v\in S$，原边 $(u,v)$ 必然无流量。</p><p>还是反证法。若存在 $u\in T$，$v\in S$ 使得 $f(u,v) &gt; 0$，则反向残量 $f(u,v) &gt; 0$，意味着残量网络中有一条从 $v$ 到 $u$ 的边。由于 $v\in S$（从 $s$ 可达），那么 $u$ 也可达，从而 $u\in S$，与 $u\in T$ 矛盾。因此 $f(u,v)=0$。</p><p><strong>最后计算</strong> $\left\lvert f\right\rvert$。</p><p>由弱对偶性证明中的等式：<br>$$\left\lvert f\right\rvert = \sum_{u\in S,,v\in T} f(u,v) - \sum_{v\in T,,u\in S} f(v,u)$$</p><p>由“再证明”的结论，第一项中 $f(u,v)=c(u,v)$；由“接着证明”的结论，第二项中 $f(v,u)=0$。因此：<br>$$\left\lvert f\right\rvert = \sum_{u\in S,,v\in T} c(u,v) = c(S,T)$$</p><p>这就找到了一个割，其容量等于 $\left\lvert f\right\rvert$。证毕！</p>  </div></details><p>综上，证毕！</p>  </div></details><h2 id="Part-4-增广路定理"><a href="#Part-4-增广路定理" class="headerlink" title="Part. 4 增广路定理"></a>Part. 4 增广路定理</h2><p>定理：一个可行流 $f$ 是最大流当且仅当残量网络 $G_f$ 中不存在 $s$ 到 $t$ 的路径（称为增广路）。</p><details class="foldable info">  <summary>证明</summary>  <div><p>（$\Rightarrow$）若存在增广路 $P$，设 $\delta = \min{r(u,v): (u,v)\in P} &gt; 0$。沿 $P$ 增加 $\delta$ 流量：</p><ul><li>对正向残量边：$f(u,v) \leftarrow f(u,v) + \delta$</li><li>对反向残量边：$f(v,u) \leftarrow f(v,u) - \delta$</li></ul><p>得到的新流仍满足容量约束，且 $|f’| = \left\lvert f\right\rvert + \delta &gt; \left\lvert f\right\rvert$，故 $f$ 不是最大流。逆否命题成立。</p><p>（$\Leftarrow$）若无增广路，定义 $S$ 为 $s$ 在 $G_f$ 中可达的节点集，则 $t\notin S$。由 Part.3 “再证明”的证明过程，$\left\lvert f\right\rvert = c(S,T)$，再由弱对偶性知 $f$ 是最大流。证毕！</p>  </div></details><h2 id="Part-5-Dinic-算法的分层图引理"><a href="#Part-5-Dinic-算法的分层图引理" class="headerlink" title="Part.5 Dinic 算法的分层图引理"></a>Part.5 Dinic 算法的分层图引理</h2><p>定义：在残量网络中，定义 $d(u)$ 为从 $s$ 到 $u$ 的最短边数（BFS 距离）。边 $(u,v)$ 称为允许边若 $d(v) = d(u) + 1$ 且残量 $&gt;0$。所有允许边构成分层图 $L_f$。阻塞流是指在 $L_f$ 中无法再找到增广路的流。</p><p>引理：记 $d_k(t)$ 为第 $k$ 次阻塞流增广后 $t$ 的距离。则 $d_{k+1}(t) &gt; d_k(t)$。</p><details class="foldable info">  <summary>证明</summary>  <div><p>设 $f$ 是当前流，$f’$ 是增广一次阻塞流后得到的新流。考虑 $G_{f’}$ 中 $s$ 到 $t$ 的最短路径 $P$。若 $P$ 中存在一条边 $(u,v)$ 在 $G_f$ 中不存在（即由增广操作新产生的反向边），则 $f(v,u) &gt; 0$，这意味着在 $G_f$ 中 $u$ 到 $v$ 有容量 $&gt;0$ 的边。由 $P$ 的最短性可推出矛盾。因此 $P$ 中的所有边都在 $G_f$ 中存在，但阻塞流增广后，至少有一条 $G_f$ 中的最短路径上的边被饱和，故 $P$ 的长度必然大于 $d_k(t)$。证毕！</p>  </div></details><p>推论：Dinic 算法中 BFS 的次数不超过 $\lvert V\rvert$，故总复杂度 $O(\lvert V\rvert^2\lvert E\rvert)$。</p><h2 id="Part-6-Dinic-算法实践"><a href="#Part-6-Dinic-算法实践" class="headerlink" title="Part.6 Dinic 算法实践"></a>Part.6 Dinic 算法实践</h2><h3 id="当前弧优化"><a href="#当前弧优化" class="headerlink" title="当前弧优化"></a>当前弧优化</h3><p>代码中的 <code>cur[]</code> 实现了当前弧优化。其原理是：在 DFS 过程中，若某条边已被尝试且无法推送更多流量，则同一轮 BFS 分层中无需再次尝试，直接从下一条边开始。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">struct</span> <span class="title class_">Edge</span> &#123; <span class="type">int</span> to, weight, nxt; &#125; edges[MAXM &lt;&lt; <span class="number">1</span>];</span><br><span class="line"><span class="type">int</span> head[MAXN], ecnt = <span class="number">2</span>, n, m;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">addedge</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v, <span class="type">int</span> weight)</span> </span>&#123;</span><br><span class="line">    edges[ecnt] = Edge&#123;v, weight, head[u]&#125;;</span><br><span class="line">    head[u] = ecnt++;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> dep[MAXN], cur[MAXN], s, t;</span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">bfs</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="built_in">clean</span>(dep);</span><br><span class="line">    queue &lt; <span class="type">int</span> &gt; q;</span><br><span class="line">    dep[s] = <span class="number">1</span>;</span><br><span class="line">    q.<span class="built_in">psh</span>(s);</span><br><span class="line">    <span class="keyword">while</span> (q.<span class="built_in">size</span>()) &#123;</span><br><span class="line">        <span class="type">int</span> u = q.<span class="built_in">front</span>(); q.<span class="built_in">pop</span>();</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = head[u]; i; i = edges[i].nxt) &#123;</span><br><span class="line">            <span class="type">int</span> v = edges[i].to;</span><br><span class="line">            <span class="keyword">if</span> (!dep[v] &amp;&amp; edges[i].weight) &#123;</span><br><span class="line">                dep[v] = dep[u] + <span class="number">1</span>; q.<span class="built_in">psh</span>(v);</span><br><span class="line">                <span class="keyword">if</span> (v == t) <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> flow)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (u == t) <span class="keyword">return</span> flow;</span><br><span class="line">    <span class="type">int</span> used = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> &amp;i = cur[u]; i; i = edges[i].nxt) &#123;</span><br><span class="line">        <span class="type">int</span> v = edges[i].to;</span><br><span class="line">        <span class="keyword">if</span> (dep[v] == dep[u] + <span class="number">1</span> &amp;&amp; edges[i].weight) &#123;</span><br><span class="line">            <span class="type">int</span> res = <span class="built_in">dfs</span>(v, <span class="built_in">min</span>(flow - used, edges[i].weight));</span><br><span class="line">            <span class="keyword">if</span> (res) &#123;</span><br><span class="line">                edges[i].weight -= res;</span><br><span class="line">                edges[i ^ <span class="number">1</span>].weight += res;</span><br><span class="line">                used += res;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">if</span> (used == flow) <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> used;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">dinic</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> mf = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (<span class="built_in">bfs</span>()) &#123;</span><br><span class="line">        <span class="built_in">memcpy</span>(cur, head, <span class="keyword">sizeof</span> cur);</span><br><span class="line">        <span class="keyword">while</span> (<span class="type">int</span> res = <span class="built_in">dfs</span>(s, inf)) mf += res;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> mf;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Part-7-HLPP（最高标号预流推进）算法"><a href="#Part-7-HLPP（最高标号预流推进）算法" class="headerlink" title="Part.7 HLPP（最高标号预流推进）算法"></a>Part.7 HLPP（最高标号预流推进）算法</h2><h3 id="7-1-算法思想和基本概念"><a href="#7-1-算法思想和基本概念" class="headerlink" title="7.1 算法思想和基本概念"></a>7.1 算法思想和基本概念</h3><p>HLPP（Highest-Label Preflow Push）与 Dinic 等增广路算法不同，采用预流推进的思路：</p><ol><li>不保持流量守恒：允许节点暂时存储超额流。</li><li>高度函数：给每个节点一个高度，流只能从高处向低处推送。</li><li>最高标号优先：每次选择高度最高的活跃节点处理。</li></ol><p>定义超额流 $e(u)$：<br>$$e(u) = \sum_{v} f(v,u) - \sum_{v} f(u,v)$$</p><ul><li>当 $e(u) &gt; 0$ 时，$u$ 称为<strong>活跃节点</strong></li><li>源点 $s$ 和汇点 $t$ 除外</li></ul><p>定义高度函数 $h(u)$：</p><ul><li>流只能从高向低推：$h(u) = h(v) + 1$</li><li>初始高度：从 $t$ 反向 BFS 得到，$h(t)=0$，$h(s)=n$</li></ul><h3 id="7-2-核心操作"><a href="#7-2-核心操作" class="headerlink" title="7.2 核心操作"></a>7.2 核心操作</h3><p>推流：当 $e(u) &gt; 0$ 且存在边 $(u,v)$ 满足 $r(u,v) &gt; 0$ 且 $h(u) = h(v) + 1$ 时，推送流量：<br>$$\delta = \min(e(u), r(u,v))$$</p><p>重贴标签：当 $e(u) &gt; 0$ 但无可推流的邻居时，更新高度：<br>$$h(u) = \min{h(v) + 1 \mid r(u,v) &gt; 0}$$</p><h3 id="7-4-核心优化"><a href="#7-4-核心优化" class="headerlink" title="7.4 核心优化"></a>7.4 核心优化</h3><ul><li><p>最高标号优先：使用优先队列或桶维护活跃节点，每次取高度最大的处理。</p></li><li><p>GAP 优化：若某个高度 $k$ 的节点数为 0，则所有高度 $&gt;k$ 的节点无法到达 $t$，直接将其高度设为 $n+1$。</p></li><li><p>当前弧优化：与 Dinic 相同，避免重复遍历已饱和的边。</p></li></ul><h3 id="7-5-算法流程"><a href="#7-5-算法流程" class="headerlink" title="7.5 算法流程"></a>7.5 算法流程</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">HLPP</span>(s, t):</span><br><span class="line">    <span class="number">1.</span> 反向 BFS 初始化高度 h，h[s] = n</span><br><span class="line">    <span class="number">2.</span> 从 s 饱和推流，将活跃节点入桶</span><br><span class="line">    <span class="number">3.</span> <span class="keyword">while</span> mxh &gt;= <span class="number">0</span>:</span><br><span class="line">         u = 桶中最高高度的节点</span><br><span class="line">         <span class="keyword">for</span> 当前弧遍历出边:</span><br><span class="line">             <span class="keyword">if</span> 边有残量 <span class="keyword">and</span> h[u] == h[v] + <span class="number">1</span>:</span><br><span class="line">                 <span class="built_in">push</span>(u, v)</span><br><span class="line">                 <span class="keyword">if</span> e[u] == <span class="number">0</span>: <span class="keyword">break</span></span><br><span class="line">         <span class="keyword">if</span> e[u] &gt; <span class="number">0</span>:</span><br><span class="line">             <span class="built_in">relabel</span>(u)</span><br><span class="line">    <span class="number">4.</span> <span class="keyword">return</span> e[t]</span><br></pre></td></tr></table></figure><h3 id="7-6-代码实现"><a href="#7-6-代码实现" class="headerlink" title="7.6 代码实现"></a>7.6 代码实现</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">struct</span> <span class="title class_">Edge</span> &#123; <span class="type">int</span> to, nxt, cap; &#125; edges[MAXM];</span><br><span class="line"><span class="type">int</span> head[MAXN], ecnt = <span class="number">2</span>, n, m;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">addedge</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v, <span class="type">int</span> cap)</span> </span>&#123;</span><br><span class="line">    edges[ecnt] = &#123;v, head[u], cap&#125;, head[u] = ecnt++;</span><br><span class="line">    edges[ecnt] = &#123;u, head[v], <span class="number">0</span>&#125;, head[v] = ecnt++;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> h[MAXN], eflow[MAXN], cur[MAXN], gap[MAXN &lt;&lt; <span class="number">1</span>], mxh, s, t;</span><br><span class="line">vi bucket[MAXN &lt;&lt; <span class="number">1</span>];</span><br><span class="line"><span class="type">bool</span> inq[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">bfs</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="built_in">memset</span>(h, <span class="number">0x3f</span>, <span class="keyword">sizeof</span> h);</span><br><span class="line">    <span class="type">static</span> <span class="type">int</span> q[MAXN], qh, qt;</span><br><span class="line">    h[t] = <span class="number">0</span>, q[qt = <span class="number">0</span>] = t, qh = <span class="number">0</span>, ++qt;</span><br><span class="line">    <span class="keyword">while</span> (qh &lt; qt) &#123;</span><br><span class="line">        <span class="type">int</span> u = q[qh++];</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = head[u]; i; i = edges[i].nxt) &#123;</span><br><span class="line">            <span class="type">int</span> v = edges[i].to;</span><br><span class="line">            <span class="keyword">if</span> (edges[i ^ <span class="number">1</span>].cap &amp;&amp; h[v] &gt; h[u] + <span class="number">1</span>)</span><br><span class="line">                h[v] = h[u] + <span class="number">1</span>,</span><br><span class="line">                q[qt++] = v;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    h[s] = n;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">push</span><span class="params">(<span class="type">int</span> u)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> &amp;i = cur[u]; i; i = edges[i].nxt) &#123;</span><br><span class="line">        <span class="type">int</span> v = edges[i].to;</span><br><span class="line">        <span class="keyword">if</span> (edges[i].cap &amp;&amp; h[u] == h[v] + <span class="number">1</span>) &#123;</span><br><span class="line">            <span class="type">int</span> delta = <span class="built_in">min</span>(eflow[u], edges[i].cap);</span><br><span class="line">            <span class="keyword">if</span> (!delta) <span class="keyword">continue</span>;</span><br><span class="line">            edges[i].cap -= delta, edges[i ^ <span class="number">1</span>].cap += delta;</span><br><span class="line">            eflow[u] -= delta, eflow[v] += delta;</span><br><span class="line">            <span class="keyword">if</span> (v != s &amp;&amp; v != t &amp;&amp; !inq[v] &amp;&amp; eflow[v])</span><br><span class="line">                inq[v] = <span class="literal">true</span>,</span><br><span class="line">                bucket[h[v]].<span class="built_in">pb</span>(v),</span><br><span class="line">                mxh = <span class="built_in">max</span>(mxh, h[v]);</span><br><span class="line">            <span class="keyword">if</span> (!eflow[u]) <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">relabel</span><span class="params">(<span class="type">int</span> u)</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> mnh = inf;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = head[u]; i; i = edges[i].nxt)</span><br><span class="line">        <span class="keyword">if</span> (edges[i].cap) mnh = <span class="built_in">min</span>(mnh, h[edges[i].to]);</span><br><span class="line">    <span class="type">int</span> nwh = mnh + <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">if</span> (!(--gap[h[u]]) &amp;&amp; h[u] &lt; n) &#123;</span><br><span class="line">        <span class="built_in">up</span>(i, <span class="number">1</span>, n) <span class="keyword">if</span> (i != s &amp;&amp; i != t &amp;&amp; h[i] &gt; h[u] &amp;&amp; h[i] &lt;= n) h[i] = n + <span class="number">1</span>;</span><br><span class="line">        <span class="built_in">up</span>(i, h[u] + <span class="number">1</span>, n) &#123;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> v : bucket[i]) inq[v] = <span class="literal">false</span>;</span><br><span class="line">            bucket[i].<span class="built_in">clear</span>();</span><br><span class="line">            gap[n] += gap[i], gap[i] = <span class="number">0</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    h[u] = nwh;</span><br><span class="line">    <span class="keyword">if</span> (nwh &lt;= n)</span><br><span class="line">        ++gap[nwh],</span><br><span class="line">        bucket[nwh].<span class="built_in">pb</span>(u),</span><br><span class="line">        inq[u] = <span class="literal">true</span>,</span><br><span class="line">        mxh = <span class="built_in">max</span>(mxh, nwh);</span><br><span class="line">    cur[u] = head[u];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">hlpp</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (s == t) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    <span class="built_in">bfs</span>(); <span class="built_in">clean</span>(gap), <span class="built_in">clean</span>(eflow), <span class="built_in">clean</span>(inq);</span><br><span class="line">    <span class="built_in">up</span>(i, <span class="number">1</span>, n) &#123;</span><br><span class="line">        <span class="keyword">if</span> (h[i] &lt; n) ++gap[h[i]];</span><br><span class="line">        <span class="keyword">else</span> ++gap[n];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = head[s]; i; i = edges[i].nxt) &#123;</span><br><span class="line">        <span class="type">int</span> v = edges[i].to, cap = edges[i].cap;</span><br><span class="line">        <span class="keyword">if</span> (cap) &#123;</span><br><span class="line">            edges[i].cap -= cap, edges[i ^ <span class="number">1</span>].cap += cap;</span><br><span class="line">            eflow[s] -= cap, eflow[v] += cap;</span><br><span class="line">            <span class="keyword">if</span> (v != t &amp;&amp; eflow[v] &amp;&amp; !inq[v] &amp;&amp; h[v] &lt; n)</span><br><span class="line">                inq[v] = <span class="literal">true</span>,</span><br><span class="line">                bucket[h[v]].<span class="built_in">pb</span>(v),</span><br><span class="line">                mxh = <span class="built_in">max</span>(mxh, h[v]);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> (mxh &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">        <span class="keyword">while</span> (mxh &gt;= <span class="number">0</span> &amp;&amp; bucket[mxh].<span class="built_in">empty</span>()) --mxh;</span><br><span class="line">        <span class="keyword">if</span> (mxh &lt; <span class="number">0</span>) <span class="keyword">break</span>;</span><br><span class="line">        <span class="type">int</span> u = bucket[mxh].<span class="built_in">back</span>(); bucket[mxh].<span class="built_in">ppb</span>(); inq[u] = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">if</span> (!eflow[u]) <span class="keyword">continue</span>;</span><br><span class="line">        <span class="keyword">if</span> (!cur[u]) cur[u] = head[u];</span><br><span class="line">        <span class="built_in">push</span>(u);</span><br><span class="line">        <span class="keyword">if</span> (eflow[u]) <span class="built_in">relabel</span>(u);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> eflow[t];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Part-8-题目选讲-A"><a href="#Part-8-题目选讲-A" class="headerlink" title="Part.8 题目选讲 A"></a>Part.8 题目选讲 A</h2><h3 id="P3376-【模板】网络最大流-amp-P4722-【模板】最大流-加强版-预流推进"><a href="#P3376-【模板】网络最大流-amp-P4722-【模板】最大流-加强版-预流推进" class="headerlink" title="P3376 【模板】网络最大流 &amp; P4722 【模板】最大流 加强版 / 预流推进"></a><a href="https://www.luogu.com.cn/problem/P3376">P3376 【模板】网络最大流</a> &amp; <a href="https://www.luogu.com.cn/problem/P4722">P4722 【模板】最大流 加强版 / 预流推进</a></h3><p>模板题，代码见上。 </p><h3 id="P2740-USACO4-2-草地排水-Drainage-Ditches"><a href="#P2740-USACO4-2-草地排水-Drainage-Ditches" class="headerlink" title="P2740 [USACO4.2] 草地排水 Drainage Ditches"></a><a href="https://www.luogu.com.cn/problem/P2740">P2740 [USACO4.2] 草地排水 Drainage Ditches</a></h3><p>$$s=1,\ t=n$$</p><h3 id="P2936-USACO09JAN-Total-Flow-S"><a href="#P2936-USACO09JAN-Total-Flow-S" class="headerlink" title="P2936 [USACO09JAN] Total Flow S"></a><a href="https://www.luogu.com.cn/problem/P2936">P2936 [USACO09JAN] Total Flow S</a></h3><p>换成字符。</p><h3 id="P1343-地震逃生"><a href="#P1343-地震逃生" class="headerlink" title="P1343 地震逃生"></a><a href="https://www.luogu.com.cn/problem/P1343">P1343 地震逃生</a></h3><p>$ans=0$ 特判。</p><h3 id="P3386-【模板】二分图最大匹配"><a href="#P3386-【模板】二分图最大匹配" class="headerlink" title="P3386 【模板】二分图最大匹配"></a><a href="https://www.luogu.com.cn/problem/P3386">P3386 【模板】二分图最大匹配</a></h3><p>构造：</p><ul><li>虚拟一个 $s$，与左部所有点建边。</li><li>左右部建边。</li><li>虚拟一个 $t$，与右部所有点建边。</li></ul><p>如图：</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/u9ov9vcs.png" alt="1"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;增广路&quot;&gt;&lt;a href=&quot;#增广路&quot; class=&quot;headerlink&quot; title=&quot;增广路&quot;&gt;&lt;/a&gt;增广路&lt;/h2&gt;&lt;p&gt;ek 模板：&lt;/p&gt;
&lt;figure class=&quot;highlight cpp&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gut</summary>
      
    
    
    
    <category term="信息学奥赛" scheme="https://blog.rusin.lol/categories/%E4%BF%A1%E6%81%AF%E5%AD%A6%E5%A5%A5%E8%B5%9B/"/>
    
    
    <category term="笔记" scheme="https://blog.rusin.lol/tags/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="C++" scheme="https://blog.rusin.lol/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>JC 提高班期末测试题解</title>
    <link href="https://blog.rusin.lol/article/626053948/"/>
    <id>https://blog.rusin.lol/article/626053948/</id>
    <published>2026-06-06T10:52:35.000Z</published>
    <updated>2026-06-06T10:56:21.292Z</updated>
    
    <content type="html"><![CDATA[<h1 id="T1-雪花图"><a href="#T1-雪花图" class="headerlink" title="T1 雪花图"></a><a href="https://www.luogu.com.cn/problem/CF1829F">T1 雪花图</a></h1><h2 id="题目描述"><a href="#题目描述" class="headerlink" title="题目描述"></a>题目描述</h2><p>雪花图是由两个整数 $x$ 和 $y$（均大于 $1$）生成的，生成方式如下：</p><ul><li>以一个中心顶点开始。</li><li>将 $x$ 个新顶点与该中心顶点相连。</li><li>对每一个这 $x$ 个顶点，各自连接 $y$ 个新顶点。</li></ul><p>例如，下图是 $x=5$，$y=3$ 的雪花图。<br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/vjudge_pic/CF1829F/8093abf53ab9afd4293f2937f4849e3ca604a47a.png" alt="1"><br>上图中的雪花图有一个中心顶点 $15$，然后有 $x=5$ 个顶点与其相连（$3$、$6$、$7$、$8$ 和 $20$），每个顶点又分别连接 $y=3$ 个顶点。</p><p>给定一个雪花图，请你求出 $x$ 和 $y$ 的值。</p><h2 id="输入格式"><a href="#输入格式" class="headerlink" title="输入格式"></a>输入格式</h2><p>第一行包含一个整数 $t$（$1 \leq t \leq 1000$），表示测试用例的数量。</p><p>每个测试用例的第一行包含两个整数 $n$ 和 $m$（$2 \leq n \leq 200$；$1 \leq m \leq \min\left(1000, \frac{n(n-1)}{2}\right)$），分别表示图中的顶点数和边数。</p><p>接下来的 $m$ 行，每行包含两个整数 $u$ 和 $v$（$1 \leq u, v \leq n$，$u \neq v$），表示一条连接顶点 $u$ 和 $v$ 的边。图中没有重边和自环。</p><p>保证给定的图一定是某组大于 $1$ 的整数 $x$ 和 $y$ 所对应的雪花图。</p><h2 id="输出格式"><a href="#输出格式" class="headerlink" title="输出格式"></a>输出格式</h2><p>对于每个测试用例，输出一行，包含两个整数 $x$ 和 $y$，用空格分隔，顺序不能颠倒。</p><h2 id="输入输出样例-1"><a href="#输入输出样例-1" class="headerlink" title="输入输出样例 #1"></a>输入输出样例 #1</h2><h3 id="输入-1"><a href="#输入-1" class="headerlink" title="输入 #1"></a>输入 #1</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">3</span><br><span class="line">21 20</span><br><span class="line">21 20</span><br><span class="line">5 20</span><br><span class="line">13 20</span><br><span class="line">1 3</span><br><span class="line">11 3</span><br><span class="line">10 3</span><br><span class="line">4 8</span><br><span class="line">19 8</span><br><span class="line">14 8</span><br><span class="line">9 7</span><br><span class="line">12 7</span><br><span class="line">17 7</span><br><span class="line">18 6</span><br><span class="line">16 6</span><br><span class="line">2 6</span><br><span class="line">6 15</span><br><span class="line">7 15</span><br><span class="line">8 15</span><br><span class="line">20 15</span><br><span class="line">3 15</span><br><span class="line">7 6</span><br><span class="line">1 2</span><br><span class="line">1 3</span><br><span class="line">2 4</span><br><span class="line">2 5</span><br><span class="line">3 6</span><br><span class="line">3 7</span><br><span class="line">9 8</span><br><span class="line">9 3</span><br><span class="line">3 6</span><br><span class="line">6 2</span><br><span class="line">2 1</span><br><span class="line">5 2</span><br><span class="line">2 7</span><br><span class="line">4 3</span><br><span class="line">3 8</span><br></pre></td></tr></table></figure><h3 id="输出-1"><a href="#输出-1" class="headerlink" title="输出 #1"></a>输出 #1</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">5 3</span><br><span class="line">2 2</span><br><span class="line">2 3</span><br></pre></td></tr></table></figure><h2 id="说明-提示"><a href="#说明-提示" class="headerlink" title="说明/提示"></a>说明/提示</h2><p>第一个测试用例如题面所示。注意输出 $3\ 5$ 是错误的，因为 $x$ 应该在 $y$ 之前输出。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">int</span> t,n,m,cnt[<span class="number">205</span>],mx,ends1[<span class="number">205</span>],u[<span class="number">1005</span>],v[<span class="number">1005</span>];</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">check</span><span class="params">(<span class="type">int</span> x)</span></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=m;++i)&#123;</span><br><span class="line"><span class="keyword">if</span>((u[i]==x&amp;&amp;ends1[v[i]]==<span class="number">1</span>)||(v[i]==x&amp;&amp;ends1[u[i]]==<span class="number">1</span>))&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">cin&gt;&gt;t;</span><br><span class="line"><span class="keyword">while</span>(t--)&#123;</span><br><span class="line"><span class="type">int</span> x=<span class="number">0</span>,y=<span class="number">0</span>;</span><br><span class="line">cin&gt;&gt;n&gt;&gt;m;</span><br><span class="line"><span class="built_in">memset</span>(ends1,<span class="number">0</span>,<span class="keyword">sizeof</span> ends1),<span class="built_in">memset</span>(cnt,<span class="number">0</span>,<span class="keyword">sizeof</span> cnt),mx=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=m;++i)&#123;</span><br><span class="line">cin&gt;&gt;u[i]&gt;&gt;v[i];</span><br><span class="line">cnt[u[i]]++,cnt[v[i]]++;</span><br><span class="line">mx=<span class="built_in">max</span>(&#123;u[i],v[i],mx&#125;);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=mx;++i)&#123;</span><br><span class="line"><span class="keyword">if</span>(cnt[i]==<span class="number">1</span>)&#123;</span><br><span class="line">ends1[i]=<span class="number">1</span>;</span><br><span class="line">y++;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">1</span>;j&lt;=n;++j)&#123;</span><br><span class="line"><span class="keyword">if</span>(ends1[j]!=<span class="number">1</span>&amp;&amp;<span class="built_in">check</span>(j))&#123;</span><br><span class="line">x=cnt[j];</span><br><span class="line">&#125;<span class="keyword">else</span> <span class="keyword">if</span>(ends1[j]!=<span class="number">1</span>&amp;&amp;<span class="built_in">check</span>(j))&#123;</span><br><span class="line">x=cnt[j];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;x&lt;&lt;<span class="string">&quot; &quot;</span>&lt;&lt;y/x&lt;&lt;endl;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="T2-字母对拼接谜题"><a href="#T2-字母对拼接谜题" class="headerlink" title="T2 字母对拼接谜题"></a><a href="https://www.luogu.com.cn/problem/P1341">T2 字母对拼接谜题</a></h1><h2 id="故事背景"><a href="#故事背景" class="headerlink" title="故事背景"></a>故事背景</h2><p>字母王国里流传着一个古老的拼接谜题：传说有一组散落的字母伙伴，每一对伙伴都有着密不可分的羁绊，它们必须紧紧相邻才能发挥魔力。现在，你作为字母王国的解谜者，需要将这些字母伙伴重新组合成一条完整的字母链，让每一对羁绊深厚的字母都能在链中相邻出现。这条字母链的长度恰好比字母对的数量多1，并且如果存在多种组合方式，请给出字典序最小的那一条——这是字母王国传承已久的规则，字典序越小，魔力越纯净。若是无法完成拼接，就只能遗憾地告知王国：无解。</p><h2 id="题目描述-1"><a href="#题目描述-1" class="headerlink" title="题目描述"></a>题目描述</h2><p>给定 n 个各不相同的无序字母对（区分大小写，无序意味着字母对中的两个字母可以交换位置相邻，例如“aZ”与“Za”视为满足相邻要求）。请你构造一个包含 (n+1) 个字母的字符串，使得每个给定的字母对都能在这个字符串中相邻出现。</p><h2 id="输入格式-1"><a href="#输入格式-1" class="headerlink" title="输入格式"></a>输入格式</h2><p>第一行输入一个正整数 n，代表无序字母对的数量。</p><p>第二行到第 (n+1) 行，每行输入两个字母，代表一对需要相邻的字母。</p><h2 id="输出格式-1"><a href="#输出格式-1" class="headerlink" title="输出格式"></a>输出格式</h2><p>输出满足要求的字符串。</p><p>如果不存在满足要求的字符串，请输出 <code>No Solution</code>。</p><p>如果存在多种满足要求的方案，请输出字典序最小的方案（即字符串中前面的字母，其 ASCII 编码尽可能小）。</p><h2 id="输入输出样例-1-1"><a href="#输入输出样例-1-1" class="headerlink" title="输入输出样例 #1"></a>输入输出样例 #1</h2><h3 id="输入-1-1"><a href="#输入-1-1" class="headerlink" title="输入 #1"></a>输入 #1</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">4</span><br><span class="line">aZ</span><br><span class="line">tZ</span><br><span class="line">Xt</span><br><span class="line">aX</span><br></pre></td></tr></table></figure><h3 id="输出-1-1"><a href="#输出-1-1" class="headerlink" title="输出 #1"></a>输出 #1</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">XaZtX</span><br></pre></td></tr></table></figure><h2 id="说明-提示-1"><a href="#说明-提示-1" class="headerlink" title="说明/提示"></a>说明/提示</h2><p>n 的规模限制如下：</p><ul><li>$25%$ 的测试数据中，$n = 2$；</li><li>$50%$ 的测试数据中，$n ≤ 10$；</li><li>$75%$ 的测试数据中，$n ≤ 100$；</li><li>$100%$ 的测试数据中，$n ≤ 600$。</li></ul><h1 id="T3-广义斐波那契图"><a href="#T3-广义斐波那契图" class="headerlink" title="T3 广义斐波那契图"></a><a href="https://www.luogu.com.cn/problem/CF2176D">T3 广义斐波那契图</a></h1><h2 id="题目描述-2"><a href="#题目描述-2" class="headerlink" title="题目描述"></a>题目描述</h2><p>给定一个包含 $n$ 个顶点和 $m$ 条边的有向图。每个顶点 $v$ 上对应一个正整数 $a_v$。请你统计所有由至少两个顶点组成的不同简单路径，使得沿路径经过顶点的数字序列构成一个广义斐波那契数列。</p><p>在本题中，若数列 $x_0, x_1, \ldots, x_k$ 满足以下条件，则称其为广义斐波那契数列：</p><ul><li>$x_0, x_1$ 为任意自然数。</li><li>对所有 $2 \le i \le k$，都有 $x_i = x_{i-2} + x_{i-1}$。</li></ul><p>注意，广义斐波那契数列至少包含两个数字。</p><p>由于答案可能很大，输出其对 $998,244,353$ 取模的结果。</p><p>一个简单路径指在有向图中按顺序经过顶点 $v_1, v_2, \ldots, v_k$，且所有顶点至多出现一次，并且对于所有 $i &lt; k$，存在从 $v_i$ 到 $v_{i+1}$ 的有向边。</p><h2 id="输入格式-2"><a href="#输入格式-2" class="headerlink" title="输入格式"></a>输入格式</h2><p>每个测试点包含若干组测试数据。第一行为测试数据组数 $t$（$1 \le t \le 10^4$）。每组测试数据包括：</p><p>第一行，两个整数 $n$ 和 $m$（$2 \le n \le 2 \cdot 10^5$，$1 \le m \le 2 \cdot 10^5$）——图中顶点数和边数。</p><p>第二行为 $n$ 个正整数 $a_1, a_2, \ldots, a_n$（$1 \le a_i \le 10^{18}$）——每个顶点上的数字。</p><p>接下来 $m$ 行，每行两个正整数 $v, u$（$1 \le v, u \le n$，$u \ne v$），表示一条从 $v$ 到 $u$ 的有向边。保证不存在重边。</p><p>保证所有测试数据中 $n$ 的总和与 $m$ 的总和不超过 $2 \times 10^5$。</p><h2 id="输出格式-2"><a href="#输出格式-2" class="headerlink" title="输出格式"></a>输出格式</h2><p>对于每组测试数据，输出广义斐波那契路径的数量，对 $998,244,353$ 取模。</p><h2 id="输入输出样例-1-2"><a href="#输入输出样例-1-2" class="headerlink" title="输入输出样例 #1"></a>输入输出样例 #1</h2><h3 id="输入-1-2"><a href="#输入-1-2" class="headerlink" title="输入 #1"></a>输入 #1</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">4</span><br><span class="line">4 4</span><br><span class="line">3 4 3 6</span><br><span class="line">1 2</span><br><span class="line">1 3</span><br><span class="line">2 4</span><br><span class="line">3 4</span><br><span class="line">4 6</span><br><span class="line">1 1 1 2</span><br><span class="line">1 2</span><br><span class="line">2 3</span><br><span class="line">3 1</span><br><span class="line">1 4</span><br><span class="line">2 4</span><br><span class="line">3 4</span><br><span class="line">8 11</span><br><span class="line">2 4 2 6 8 10 18 26</span><br><span class="line">1 2</span><br><span class="line">2 3</span><br><span class="line">3 1</span><br><span class="line">4 3</span><br><span class="line">2 4</span><br><span class="line">3 5</span><br><span class="line">5 6</span><br><span class="line">4 6</span><br><span class="line">6 7</span><br><span class="line">7 5</span><br><span class="line">5 8</span><br><span class="line">2 2</span><br><span class="line">10 10</span><br><span class="line">1 2</span><br><span class="line">2 1</span><br></pre></td></tr></table></figure><h3 id="输出-1-2"><a href="#输出-1-2" class="headerlink" title="输出 #1"></a>输出 #1</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">5</span><br><span class="line">9</span><br><span class="line">24</span><br><span class="line">2</span><br></pre></td></tr></table></figure><h2 id="说明-提示-2"><a href="#说明-提示-2" class="headerlink" title="说明/提示"></a>说明/提示</h2><p>第一个样例的解释（顶点编号在括号外，顶点上的数字在括号内）：</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/vjudge_pic/CF2176D/08a36bd25194bfe2a6b3cff05123bcbef288fa7e15461f59eaa9b70bf8283240.png" alt="1"></p><p>本例中共有 5 条广义斐波那契路径：(1, 2), (1, 3), (2, 4), (3, 4), (1, 3, 4)。例如，路径 (1, 3, 4) 沿途顶点上的数字序列为：[3, 3, 6]，可以看到第三个数字等于前两个数字之和。</p><p>第二个样例的解释：</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/vjudge_pic/CF2176D/3d6ae42c81941d0c88d6fab78b53e70455364bccfff538a925d5ee91dc0f8e9a.png" alt="1"></p><p>本例中共有 9 条广义斐波那契路径：(1, 2), (1, 4), (2, 3), (2, 4), (3, 1), (3, 4), (1, 2, 4), (2, 3, 4), (3, 1, 4)。注意，路径 (1, 2, 3) 上的数字序列为：[1, 1, 1]，这不是广义斐波那契数列。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;T1-雪花图&quot;&gt;&lt;a href=&quot;#T1-雪花图&quot; class=&quot;headerlink&quot; title=&quot;T1 雪花图&quot;&gt;&lt;/a&gt;&lt;a href=&quot;https://www.luogu.com.cn/problem/CF1829F&quot;&gt;T1 雪花图&lt;/a&gt;&lt;/h1&gt;&lt;h</summary>
      
    
    
    
    <category term="信息学奥赛" scheme="https://blog.rusin.lol/categories/%E4%BF%A1%E6%81%AF%E5%AD%A6%E5%A5%A5%E8%B5%9B/"/>
    
    
    <category term="题解" scheme="https://blog.rusin.lol/tags/%E9%A2%98%E8%A7%A3/"/>
    
    <category term="比赛" scheme="https://blog.rusin.lol/tags/%E6%AF%94%E8%B5%9B/"/>
    
  </entry>
  
  <entry>
    <title>题解：P8506 标题计数</title>
    <link href="https://blog.rusin.lol/article/423345/"/>
    <id>https://blog.rusin.lol/article/423345/</id>
    <published>2026-06-06T08:08:22.000Z</published>
    <updated>2026-06-06T11:24:35.176Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>本篇题解适合<strong>刚学<a href="https://www.luogu.com.cn/problem/list?type=luogu&page=1&tag=357">字符串</a>和<a href="https://www.luogu.com.cn/problem/list?type=luogu&difficulty=1&page=1&tag=1">模拟</a>的同学</strong>阅读，语言浅显易懂。<del>谁让作者是个蒟蒻呢。</del></p><h2 id="题目分析"><a href="#题目分析" class="headerlink" title="题目分析"></a>题目分析</h2><p><strong>核心条件</strong>：</p><ul><li>第一个非空格字符<strong>必须</strong>是井号 <code>#</code>。</li><li>井号后面<strong>必须</strong>紧跟着<strong>至少一个</strong>空格且<strong>不能</strong>有多个井号相连（如 <code>##</code>）。</li><li>在井号后面的空格后<strong>必须</strong>有长度不为 $0$ 的句子。</li></ul><h2 id="思路引导"><a href="#思路引导" class="headerlink" title="思路引导"></a>思路引导</h2><details class="foldable warning">  <summary>提问</summary>  <div><p>如何输入一行<strong>含空格</strong>的字符串？</p>  </div></details><details class="foldable success">  <summary>成功</summary>  <div><p>使用 string 类型自带的 <code>getline()</code> 。</p>  </div></details><details class="warning foldable">  <summary>提问</summary>  <div>    如何判断字符串是否为一级标题？  </div></details><details class="foldable success">  <summary>成功</summary>  <div><p>联系我们刚分析完的核心条件，可以进行<strong>模拟</strong>。具体如下：</p><ul><li><p>首先，假设读入的字符串 $s$ 不是一级标题，$flag$ 为 false 。再将 $s$ 从头到尾扫一遍。</p><ul><li>如果 $s_i$ 是空格，直接跳过。</li><li>否则如果 $flag$ 为 true ，说明已经满足核心条件中的 1、2 点，且现在 $s_i$ 不为空格，也满足第 3 点，计数器 $+1$。</li><li>否则如果 $s_i$ 是非 <code>#</code> 字符，$s$ 必定不是一级标题，跳出循环。</li><li>否则如果 $s_i$ 是 <code>#</code> 字符且满足核心条件中的 1、2 点，$flag$ 为 true 。</li><li>否则 $s$ 必定不是一级标题，跳出循环。</li></ul></li></ul>  </div></details><h2 id="完整代码"><a href="#完整代码" class="headerlink" title="完整代码"></a>完整代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">int</span> n,pos,cnt;  <span class="comment">// cnt用于计数符合条件的标题</span></span><br><span class="line"><span class="type">bool</span> flag;      <span class="comment">// 标记是否满足标题的前置条件</span></span><br><span class="line">string s;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">cin&gt;&gt;n;</span><br><span class="line">cin.<span class="built_in">ignore</span>();  <span class="comment">// 忽略n后面的换行符</span></span><br><span class="line"><span class="keyword">while</span>(n--) &#123;</span><br><span class="line"><span class="built_in">getline</span>(cin,s);  <span class="comment">// 读取一整行文本</span></span><br><span class="line">flag=<span class="literal">false</span>;      <span class="comment">// 初始化标记</span></span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>; i&lt;s.<span class="built_in">size</span>(); ++i) &#123;</span><br><span class="line"><span class="keyword">if</span>(s[i]!=<span class="string">&#x27; &#x27;</span>) &#123;  <span class="comment">// 遇到非空格字符</span></span><br><span class="line"><span class="keyword">if</span>(flag)&#123;  <span class="comment">// 如果已标记为满足前置条件</span></span><br><span class="line">cnt++;  <span class="comment">// 计数加1</span></span><br><span class="line"><span class="keyword">break</span>;  <span class="comment">// 跳出循环，无需继续检查</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(s[i]!=<span class="string">&#x27;#&#x27;</span>) &#123;  <span class="comment">// 非#字符，不是标题</span></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 检查是否为单个#且后面跟着空格</span></span><br><span class="line"><span class="keyword">if</span>(s[i]==<span class="string">&#x27;#&#x27;</span>&amp;&amp;(i==<span class="number">0</span>||s[i<span class="number">-1</span>]!=<span class="string">&#x27;#&#x27;</span>)&amp;&amp;s[i<span class="number">+1</span>]==<span class="string">&#x27; &#x27;</span>&amp;&amp;i<span class="number">+1</span>&lt;s.<span class="built_in">size</span>()) &#123;</span><br><span class="line">pos=i<span class="number">+1</span>;</span><br><span class="line">flag=<span class="literal">true</span>;  <span class="comment">// 标记为满足前置条件</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!flag)&#123;  <span class="comment">// 如果不满足前置条件</span></span><br><span class="line"><span class="keyword">break</span>;    <span class="comment">// 跳出循环</span></span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;cnt;  <span class="comment">// 输出结果</span></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;本篇题解适合&lt;strong&gt;刚学&lt;a href=&quot;https://www.luogu.com.cn/problem/list?type=lu</summary>
      
    
    
    
    <category term="洛谷" scheme="https://blog.rusin.lol/categories/%E6%B4%9B%E8%B0%B7/"/>
    
    
    <category term="C++" scheme="https://blog.rusin.lol/tags/C/"/>
    
    <category term="题解" scheme="https://blog.rusin.lol/tags/%E9%A2%98%E8%A7%A3/"/>
    
  </entry>
  
  <entry>
    <title>拯救谷歌和 Github！你的新“自行车”</title>
    <link href="https://blog.rusin.lol/article/291152786/"/>
    <id>https://blog.rusin.lol/article/291152786/</id>
    <published>2026-05-14T11:02:20.000Z</published>
    <updated>2026-05-18T12:59:33.993Z</updated>
    
    <content type="html"><![CDATA[<p>还在为谷歌无法访问而发愁吗？<a href="https://github.com/docmirror/dev-sidecar">这个宝藏项目</a>一定要收藏好😍！顺便还能秒开 Github！</p><h2 id="快速安装"><a href="#快速安装" class="headerlink" title="快速安装"></a>快速安装</h2><p><a href="https://github.com/docmirror/dev-sidecar/releases">打开 Release</a>，找到最新版本，安装包选择方式：</p><ul><li><strong>Windows</strong>：DevSidecar-x.x.x-windows-universal.exe</li><li><strong>Mac</strong>: DevSidecar-x.x.x-macos-universal.dmg</li><li><strong>Linux</strong>: <ul><li>Debian 系等支持 Deb 的：DevSidecar-x.x.x-linux-&lt;架构&gt;.deb</li><li>其他：DevSidecar-x.x.x-linux-&lt;架构&gt;.AppImage</li></ul></li></ul><p>安装可能有点慢，建议以下 4 选 1 加速安装（我的是 2.0.2 Windows 版本，具体链接为 <a href="https://gh-proxy.org/+Github">https://gh-proxy.org/+Github</a> 原始链接）：</p><ul><li><p><a href="https://gh-proxy.org/https://github.com/docmirror/dev-sidecar/releases/download/v2.0.2/DevSidecar-2.0.2-windows-universal.exe">主站，全球加速！</a></p></li><li><p><a href="https://hk.gh-proxy.org/https://github.com/docmirror/dev-sidecar/releases/download/v2.0.2/DevSidecar-2.0.2-windows-universal.exe">香港国内线路优化</a></p></li><li><p><a href="https://cdn.gh-proxy.org/https://github.com/docmirror/dev-sidecar/releases/download/v2.0.2/DevSidecar-2.0.2-windows-universal.exe">Fastly CDN</a></p></li><li><p><a href="https://edgeone.gh-proxy.org/https://github.com/docmirror/dev-sidecar/releases/download/v2.0.2/DevSidecar-2.0.2-windows-universal.exe">Edgeone 全球加速</a></p></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;还在为谷歌无法访问而发愁吗？&lt;a href=&quot;https://github.com/docmirror/dev-sidecar&quot;&gt;这个宝藏项目&lt;/a&gt;一定要收藏好😍！顺便还能秒开 Github！&lt;/p&gt;
&lt;h2 id=&quot;快速安装&quot;&gt;&lt;a href=&quot;#快速安装&quot; clas</summary>
      
    
    
    
    <category term="网站开发" scheme="https://blog.rusin.lol/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Git" scheme="https://blog.rusin.lol/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>Vercel 仅部署指定分支的方法</title>
    <link href="https://blog.rusin.lol/article/2431487467/"/>
    <id>https://blog.rusin.lol/article/2431487467/</id>
    <published>2026-05-12T12:55:55.000Z</published>
    <updated>2026-06-07T10:22:03.450Z</updated>
    
    <content type="html"><![CDATA[<h2 id="如何指定特殊分支"><a href="#如何指定特殊分支" class="headerlink" title="如何指定特殊分支"></a>如何指定特殊分支</h2><ol><li>从<a href="https://vercel.com/dashboard">仪表板</a>中选择的项目</li><li>在侧边栏中打开 Settings。</li><li>点击 Environments。</li><li>点击 Production 环境（/settings/environments/production）。</li></ol><div class="tip cogs"><p>这样配置之后，Vercel 仍然会在任一分支更改时自动构建，结果当然是 <mark class="hl-label red">Error</mark>  了！怎么办呢？</p></div><h2 id="使用分支跟踪（推荐）"><a href="#使用分支跟踪（推荐）" class="headerlink" title="使用分支跟踪（推荐）"></a>使用分支跟踪（推荐）</h2><p>最直接的方法是在项目设置中配置分支跟踪。默认情况下，Vercel 会在所有分支上触发部署，但可以指定 <mark class="hl-label red">main</mark>  red %} 分支作为生产环境分支，这样只有 <mark class="hl-label red">main</mark>  分支的变更才会触发生产部署。</p><p>开启分支跟踪非常简单，按照以下步骤操作：</p><ol><li><p>从<a href="https://vercel.com/dashboard">仪表板</a>中选择的项目</p></li><li><p>在侧边栏中打开 Settings。</p></li><li><p>点击 Environments。</p></li><li><p>点击 Production 环境（/settings/environments/production）。</p></li><li><p>在 Branch Tracking 中，输入想要追踪的分支名称，例如 <mark class="hl-label red">main</mark> 。</p></li><li><p>点击 <code>Save</code>。</p><!-- ![alt text](/img/2026/Vercel-仅部署指定分支的方法/image.png) --></li></ol><p>还可以在 Preview 环境（/settings/environments/preview）中关闭 Branch Tracking。这样就可以确保只有 <mark class="hl-label red">main</mark>  分支的变更才会触发任何构建。</p><h2 id="使用-git-配置"><a href="#使用-git-配置" class="headerlink" title="使用 git 配置"></a>使用 git 配置</h2><p>在项目根目录的 <code>vercel.json</code> 文件中添加 <code>git.deploymentEnabled</code> 配置，精确控制哪些分支可以触发部署：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;git&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;deploymentEnabled&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">      <span class="attr">&quot;main&quot;</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line">    <span class="punctuation">&#125;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><h2 id="使用忽略构建步骤"><a href="#使用忽略构建步骤" class="headerlink" title="使用忽略构建步骤"></a>使用忽略构建步骤</h2><p>如果需要更灵活的控制，可以在项目设置的“忽略构建步骤”部分使用自定义 Bash 脚本：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="keyword">if</span> [[ <span class="string">&quot;<span class="variable">$VERCEL_GIT_COMMIT_REF</span>&quot;</span> == <span class="string">&quot;main&quot;</span> ]]; <span class="keyword">then</span></span><br><span class="line">  <span class="built_in">exit</span> 1  <span class="comment"># 继续构建</span></span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">  <span class="built_in">exit</span> 0  <span class="comment"># 跳过构建</span></span><br><span class="line"><span class="keyword">fi</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;如何指定特殊分支&quot;&gt;&lt;a href=&quot;#如何指定特殊分支&quot; class=&quot;headerlink&quot; title=&quot;如何指定特殊分支&quot;&gt;&lt;/a&gt;如何指定特殊分支&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;从&lt;a href=&quot;https://vercel.com/dashboard&quot;&gt;</summary>
      
    
    
    
    <category term="网站开发" scheme="https://blog.rusin.lol/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Git" scheme="https://blog.rusin.lol/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>对单一仓库配置小号以远程管理小号仓库</title>
    <link href="https://blog.rusin.lol/article/372975/"/>
    <id>https://blog.rusin.lol/article/372975/</id>
    <published>2026-04-20T13:16:59.000Z</published>
    <updated>2026-04-20T13:38:16.423Z</updated>
    
    <content type="html"><![CDATA[<h2 id="命令行操作"><a href="#命令行操作" class="headerlink" title="命令行操作"></a>命令行操作</h2><ul><li><p>给这个仓库单独设置小号（仅本地生效）</p>  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config --<span class="built_in">local</span> user.name <span class="string">&quot;ru-sin&quot;</span></span><br><span class="line">git config --<span class="built_in">local</span> user.email <span class="string">&quot;i@rusin.cnt&quot;</span></span><br></pre></td></tr></table></figure></li><li><p>把远程地址绑定到小号仓库</p>  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote set-url origin https://ru-sin@github.com/ru-sin/gugo.git</span><br></pre></td></tr></table></figure></li><li><p>推送（第一次会让你登录小号）</p>  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push -f origin main</span><br></pre></td></tr></table></figure></li></ul><h2 id="登录时怎么填？"><a href="#登录时怎么填？" class="headerlink" title="登录时怎么填？"></a>登录时怎么填？</h2><p>弹出窗口时：<br><strong>使用 SSH 登录</strong></p><p>在输入框中填入在 <a href="https://github.com/settings/tokens/new">这里</a> 创建的 SSH 密钥（权限建议仅 Repo）。</p><hr><blockquote><h2 id="最终效果（最舒服的状态）"><a href="#最终效果（最舒服的状态）" class="headerlink" title="最终效果（最舒服的状态）"></a>最终效果（最舒服的状态）</h2><ul><li>全局 Git = 大号</li><li>其他所有仓库 = 大号</li><li>只有特定文件夹 = 小号</li></ul></blockquote><div class="note blue anzhiyufont anzhiyu-icon-bullhorn modern"><p>永远不用再切换账号</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;命令行操作&quot;&gt;&lt;a href=&quot;#命令行操作&quot; class=&quot;headerlink&quot; title=&quot;命令行操作&quot;&gt;&lt;/a&gt;命令行操作&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;给这个仓库单独设置小号（仅本地生效）&lt;/p&gt;
  &lt;figure class=&quot;highlight</summary>
      
    
    
    
    <category term="网站开发" scheme="https://blog.rusin.lol/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Git" scheme="https://blog.rusin.lol/tags/Git/"/>
    
    <category term="VS code" scheme="https://blog.rusin.lol/tags/VS-code/"/>
    
  </entry>
  
  <entry>
    <title>实获论坛招人了！</title>
    <link href="https://blog.rusin.lol/article/465873/"/>
    <id>https://blog.rusin.lol/article/465873/</id>
    <published>2026-04-20T09:05:40.000Z</published>
    <updated>2026-04-20T10:20:34.522Z</updated>
    
    <content type="html"><![CDATA[<p>实获学员请继续阅读，非实获学员可忽略本条消息。</p><h2 id="实获论坛招募成员"><a href="#实获论坛招募成员" class="headerlink" title="实获论坛招募成员"></a>实获论坛招募成员</h2><p><strong>最新文章链接</strong>（若 404 请访问 <a href="https://www.luogu.me/article/sjn3u3py">https://www.luogu.me/article/sjn3u3py</a>）：<a href="https://blog.rusin.qzz.io/article/465873">https://blog.rusin.qzz.io/article/465873</a></p><p><strong>实获论坛链接</strong>：<a href="https://zjsh.freeflarum.com/">https://zjsh.freeflarum.com</a></p><p>由于实获暂无官方论坛，我搭建了专属论坛，<strong>仅对实获用户开放使用</strong>。</p><hr><h2 id="预览"><a href="#预览" class="headerlink" title="预览"></a>预览</h2><p>首页：<br><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/bz6rwv2n.png" alt="截图"><br>博客编写：</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/murl4cz9.png" alt="截图"></p><p>发表帖子：</p><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="https://cdn.luogu.com.cn/upload/image_hosting/3hwjk5ri.png" alt="截图"></p><p>想要加入论坛，请按照以下步骤操作：</p><h2 id="私信"><a href="#私信" class="headerlink" title="私信"></a>私信</h2><p><a href="https://www.luogu.com.cn/chat?uid=1620655">点此</a> 并向我发送以下信息：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">我是实获的&lt;替换为你的实获大号用户名&gt;用户，我申请加入实获论坛，我保证不会发表色情、敏感、涉政、暴力内容，我已严肃阅读相关文档。</span><br></pre></td></tr></table></figure><p>例如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">我是实获的wyqjy用户，我申请加入实获论坛，我保证不会发表色情、敏感、涉政、暴力内容，我已严肃阅读相关文档。</span><br></pre></td></tr></table></figure><h2 id="验证"><a href="#验证" class="headerlink" title="验证"></a>验证</h2><p>使用实获大号（即刚刚私信内容中的账号）在 <a href="http://zjshoj.com/problem.php?id=3020">SH 3020</a> 提交以下代码（<strong>语言保持默认，即 C 语言</strong>）：</p><details class="folding-tag" cyan open><summary> C 语言代码 </summary>              <div class='content'>              <figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>              </div>            </details><h2 id="审核"><a href="#审核" class="headerlink" title="审核"></a>审核</h2><p>我将在 $3$ 天内完成审核，审核通过会<strong>私信</strong>你，请确保<a href="https://www.luogu.com.cn/user/setting/preference">私信接收设置</a>为所有人（拉黑的用户除外）并<em>及时接收</em>。</p><p>若<strong>超过</strong> $3$ 天未收到回复，可以在<strong>本帖子</strong>下 @ 我。</p><h2 id="注册"><a href="#注册" class="headerlink" title="注册"></a>注册</h2><p>前往<a href="https://forum.rusin.cn.mt/">论坛</a>，点击<em>注册</em>。</p><ul><li>用户名：填写你<strong>实获大号用户名</strong>。</li><li>邮箱：<ul><li>有个人邮箱（QQ、Outlook 等）请填写本人邮箱，可获得更多权限。</li><li>无个人邮箱可填写：<code>&lt;替换为你的实获大号用户名&gt;@zjshoj.com</code>，例如 <code>wyqjy@zhshoj.com</code>，会限制部分权限，但仍可正常发帖。</li></ul></li><li>密码：建议使用实获大号密码，可获得更多权限。</li><li>确认密码：重复输入相同密码。</li></ul><h2 id="成功"><a href="#成功" class="headerlink" title="成功"></a>成功</h2><p>恭喜你！现在可以自由发布帖子了。快去点击首页右上角<em>发布主题</em>，发布你的第一条帖子吧！</p><details class="folding-tag" yellow><summary> 联系我 </summary>              <div class='content'>              <p>最终解释权归<a href="https://rusin.cn.mt/">如影随形</a>所有。如有疑问，可通过以下任一方式联系我：：</p><ul><li><a href="mailto:i@m.rusin.cn.mt">点此发送到我的邮箱 i@m.rusin.cn.mt（推荐）</a></li><li><a href="#">在本文章下评论并 @ 我</a></li><li><a href="https://www.luogu.com.cn/chat?uid=1620655">点此私信（不推荐）</a></li></ul>              </div>            </details>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;实获学员请继续阅读，非实获学员可忽略本条消息。&lt;/p&gt;
&lt;h2 id=&quot;实获论坛招募成员&quot;&gt;&lt;a href=&quot;#实获论坛招募成员&quot; class=&quot;headerlink&quot; title=&quot;实获论坛招募成员&quot;&gt;&lt;/a&gt;实获论坛招募成员&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;最新文章链接&lt;</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>在 VS code 上远程管理 Github 仓库并自动化部署项目</title>
    <link href="https://blog.rusin.lol/article/3290689536/"/>
    <id>https://blog.rusin.lol/article/3290689536/</id>
    <published>2026-04-19T11:47:17.000Z</published>
    <updated>2026-05-14T11:06:45.544Z</updated>
    
    <content type="html"><![CDATA[<p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="../themes/hexo-theme-anzhiyu-1.7.1/source/img/2026/%E5%9C%A8-VS-code-%E4%B8%8A%E8%BF%9C%E7%A8%8B%E7%AE%A1%E7%90%86-Github-%E4%BB%93%E5%BA%93%E9%A1%B9%E7%9B%AE/image-1.png" alt="alt text"></p><h2 id="如果-GitHub-远程是没有提交的空仓库"><a href="#如果-GitHub-远程是没有提交的空仓库" class="headerlink" title="如果 GitHub 远程是没有提交的空仓库"></a>如果 GitHub 远程是没有提交的空仓库</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git init</span><br><span class="line">git add -A</span><br><span class="line">git commit -m <span class="string">&quot;🔄️ init:初始化 main 源码分支&quot;</span></span><br><span class="line">git checkout -b main</span><br></pre></td></tr></table></figure><p>然后再绑定哦。</p><h2 id="绑定本地仓库到你已有的-GitHub-远程仓库"><a href="#绑定本地仓库到你已有的-GitHub-远程仓库" class="headerlink" title="绑定本地仓库到你已有的 GitHub 远程仓库"></a>绑定本地仓库到你已有的 GitHub 远程仓库</h2><p>先把本地和远程仓库建立连接，<kbd>Ctrl+Shift+`</kbd>调出 VS code 终端直接执行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote add origin git@github.com:你的用户名/仓库名.git</span><br></pre></td></tr></table></figure><p><strong>验证绑定成功</strong>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote -v</span><br></pre></td></tr></table></figure><p>终端输出下面这样，就代表绑定成功：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">origin  git@github.com:xxx/xxx.git (fetch)</span><br><span class="line">origin  git@github.com:xxx/xxx.git (push)</span><br></pre></td></tr></table></figure><div class="note info flat"><p>报错 <code>fatal: remote origin already exists</code>：说明之前绑过别的，先执行 <code>git remote remove origin</code> 解除绑定，再重新执行上面绑定命令即可。</p></div><h2 id="拉取远程旧-main-分支内容，做安全备份（如果你的仓库原来有-main-分支，可选）"><a href="#拉取远程旧-main-分支内容，做安全备份（如果你的仓库原来有-main-分支，可选）" class="headerlink" title="拉取远程旧 main 分支内容，做安全备份（如果你的仓库原来有 main 分支，可选）"></a>拉取远程旧 main 分支内容，做安全备份（如果你的仓库原来有 main 分支，可选）</h2><p>远程 <mark class="hl-label red">main</mark>  全是旧的 <mark class="hl-label red">dist</mark>  文件，我们先把它拉到本地，备份成一个旧分支，绝对不覆盖本地源码，全程安全兜底。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git fetch origin</span><br><span class="line">git branch old-main origin/main</span><br></pre></td></tr></table></figure><p>执行完，你本地就多了一个 <emp>old-main</emp> 备份分支，以前手动上传的所有文件全部永久保留，后续操作完全不会动它。</p><h2 id="重置本地-main-分支为纯净源码分支"><a href="#重置本地-main-分支为纯净源码分支" class="headerlink" title="重置本地 main 分支为纯净源码分支"></a>重置本地 main 分支为纯净源码分支</h2><p>你的 <code>.gitignore</code> 已经写好了 <code>dist</code>，会自动忽略打包文件夹，不会把 <code>dist</code> 提交到 <mark class="hl-label red">main</mark>  分支。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git checkout main</span><br><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;🔄️ init:初始化 main 源码分支&quot;</span> </span><br></pre></td></tr></table></figure><h2 id="推送全新源码-main-分支"><a href="#推送全新源码-main-分支" class="headerlink" title="推送全新源码 main 分支"></a>推送全新源码 main 分支</h2><p>如果 <mark class="hl-label red">main</mark>  分支已经有冲突文件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push -f origin main</span><br></pre></td></tr></table></figure><p>否则：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin main</span><br></pre></td></tr></table></figure><div class="tip success"><p>GitHub 远程 <mark class="hl-label red">main</mark>  分支：已经全部是你的项目源码，<code>dist</code> 文件夹被 .gitignore 自动忽略，完全不会上传到 <mark class="hl-label red">main</mark> ！</p></div><hr><h2 id="新建-gh-pages-分支，只存放静态文件"><a href="#新建-gh-pages-分支，只存放静态文件" class="headerlink" title="新建 gh-pages 分支，只存放静态文件"></a>新建 gh-pages 分支，只存放静态文件</h2><p>这一步专门创建部署分支，全程独立，和 <mark class="hl-label red">main</mark>  分支完全隔离，只存放打包后的 <code>dist</code> 静态文件。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">pnpm build</span><br><span class="line"><span class="built_in">cd</span> dist &amp;&amp; git init &amp;&amp; git add . &amp;&amp; git commit -m <span class="string">&quot;init gh-pages&quot;</span> &amp;&amp; git push -f git@github.com:你的用户名/仓库名.git HEAD:gh-pages &amp;&amp; <span class="built_in">cd</span> ..</span><br></pre></td></tr></table></figure><div class="tip success"><p>GitHub 远程 <mark class="hl-label red">gh-pages</mark>  分支：里面只有 <code>dist</code> 静态网页文件，无任何源码，专门用于 GitHub Pages 网站部署。</p></div><hr><h2 id="日常开发"><a href="#日常开发" class="headerlink" title="日常开发"></a>日常开发</h2><p>你以后每次修改完代码，更新网页，只需要严格按这个顺序走，再也不用手动上传文件：</p><h3 id="Vite-项目"><a href="#Vite-项目" class="headerlink" title="Vite 项目"></a>Vite 项目</h3><h4 id="1-开发修改源码（全程在-main-分支）"><a href="#1-开发修改源码（全程在-main-分支）" class="headerlink" title="1. 开发修改源码（全程在 main 分支）"></a>1. 开发修改源码（全程在 main 分支）</h4><p>你改完源码后，更新到 GitHub 源码仓库：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;✨ Update: 更新源码&quot;</span></span><br><span class="line">git push origin main</span><br></pre></td></tr></table></figure><h4 id="2-打包生成最新的-dist-文件"><a href="#2-打包生成最新的-dist-文件" class="headerlink" title="2. 打包生成最新的 dist 文件"></a>2. 打包生成最新的 dist 文件</h4><p>在 main 分支终端执行打包命令（根据你的项目，你的是 vite 项目）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm run build</span><br><span class="line"><span class="comment"># 或 pnpm build</span></span><br></pre></td></tr></table></figure><p>执行完，本地 <code>dist</code> 文件夹就会更新为最新打包文件。</p><div class="note primary flat"><p>回到主项目根目录，执行这 2 条全局 git 配置，永久关闭这个烦人的换行符警告：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git config core.autocrlf <span class="literal">true</span></span><br><span class="line">git config core.safecrlf <span class="literal">false</span></span><br></pre></td></tr></table></figure></div><h4 id="3-一键更新-gh-pages-部署网页"><a href="#3-一键更新-gh-pages-部署网页" class="headerlink" title="3. 一键更新 gh-pages 部署网页"></a>3. 一键更新 gh-pages 部署网页</h4><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">npm run build</span><br><span class="line"><span class="comment"># 或 pnpm build</span></span><br><span class="line"><span class="built_in">cd</span> dist &amp;&amp; git init &amp;&amp; git add . &amp;&amp; git commit -m <span class="string">&quot;update site&quot;</span> &amp;&amp; git push -f git@github.com:你的用户名/你的仓库名.git HEAD:gh-pages &amp;&amp; <span class="built_in">cd</span> ..</span><br></pre></td></tr></table></figure><ul><li>打包最新静态文件</li><li>一键纯净推送 gh-pages，无任何多余文件</li></ul><h3 id="NextJs-项目"><a href="#NextJs-项目" class="headerlink" title="NextJs 项目"></a>NextJs 项目</h3><h4 id="每次写完代码-to-推源码（main）"><a href="#每次写完代码-to-推源码（main）" class="headerlink" title="每次写完代码 $\to$ 推源码（main）"></a>每次写完代码 $\to$ 推源码（main）</h4><p><kbd>Ctrl+Shift+`</kbd> 打开终端，直接运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git add .</span><br><span class="line">git commit -m <span class="string">&quot;更新项目源码&quot;</span></span><br><span class="line">git push origin main</span><br></pre></td></tr></table></figure><details class="folding-tag" green><summary> ✅ 作用 </summary>              <div class='content'>              <p>把你的代码推送到小号 <span class="hide-inline"><button type="button" class="hide-button" style="background-color: #FF7242;color: #fff">查******<br>  </button><span class="hide-content">看什么看</span></span> 的 <mark class="hl-label red">main</mark>  分支（你已经配置好锁死小号，直接推就行）</p>              </div>            </details><h3 id="要发布网页-to-推静态文件（gh-pages）"><a href="#要发布网页-to-推静态文件（gh-pages）" class="headerlink" title="要发布网页 $\to$ 推静态文件（gh-pages）"></a>要发布网页 $\to$ 推静态文件（gh-pages）</h3><p>还是在根目录，直接复制这一条完整命令运行：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm run build &amp;&amp; <span class="built_in">cd</span> out &amp;&amp; git add . &amp;&amp; git commit -m <span class="string">&quot;更新网页&quot;</span> &amp;&amp; git push -f https://ru-sin@github.com/ru-sin/用户名.git HEAD:gh-pages &amp;&amp; <span class="built_in">cd</span> ..</span><br></pre></td></tr></table></figure><div class="note success flat"><p>这条命令会自动</p><ul><li>打包生成最新 <code>out</code></li><li>提交网页文件</li><li>强制推送到小号 <mark class="hl-label red">gh-pages</mark>  分支</li><li>退回根目录</li></ul></div><hr><h2 id="高级做法（2-选-1）"><a href="#高级做法（2-选-1）" class="headerlink" title="高级做法（2 选 1）"></a>高级做法（2 选 1）</h2><h3 id="推送-main-源码后自动推送-gh-pages-分支"><a href="#推送-main-源码后自动推送-gh-pages-分支" class="headerlink" title="推送 main 源码后自动推送 gh-pages 分支"></a>推送 main 源码后自动推送 gh-pages 分支</h3><p>访问 /settings/actions，下滑找到 <code>Workflow permissions</code>，勾选 Read and write permissions，点击 <code>Save</code> 就好了。</p><mark class="hl-label red">main</mark>  分支新建 `.github/workflows/deploy.yml`，直接复制代码如下：<figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">自动部署到</span> <span class="string">gh-pages</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">    <span class="attr">branches:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="string">main</span>  <span class="comment"># 推送到 main 分支就自动触发</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">deploy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">拉取代码</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">persist-credentials:</span> <span class="literal">false</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">安装依赖</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">install</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">编译生成</span> <span class="string">out</span> <span class="string">文件夹</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">npm</span> <span class="string">run</span> <span class="string">build</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">部署到</span> <span class="string">gh-pages</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">peaceiris/actions-gh-pages@v4</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">github_token:</span> <span class="string">$&#123;&#123;</span> <span class="string">secrets.GITHUB_TOKEN</span> <span class="string">&#125;&#125;</span></span><br><span class="line">          <span class="attr">publish_dir:</span> <span class="string">./out</span></span><br></pre></td></tr></table></figure><p>这样就不需要推静态文件（<mark class="hl-label red">gh-pages</mark> ）分支了，直接推 <mark class="hl-label red">main</mark>  即可。</p><h3 id="build-后一行命令部署-dist"><a href="#build-后一行命令部署-dist" class="headerlink" title="build 后一行命令部署 dist"></a>build 后一行命令部署 dist</h3><p>安装工具。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install gh-pages --save-dev</span><br></pre></td></tr></table></figure><p>在 <code>package.json</code> 里添加部署脚本。</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;scripts&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span></span><br><span class="line">    <span class="attr">&quot;deploy&quot;</span><span class="punctuation">:</span> <span class="string">&quot;gh-pages -d dist&quot;</span></span><br><span class="line">  <span class="punctuation">&#125;</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p>部署命令，可以自动部署到 gh-pages 分支。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm run build</span><br><span class="line">npm run deploy</span><br></pre></td></tr></table></figure><div class="tip success"><p>成功！</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src= &quot;data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7&quot; onerror=&quot;this.onerror=null,this.src=&amp;quot;/img</summary>
      
    
    
    
    <category term="网站开发" scheme="https://blog.rusin.lol/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Git" scheme="https://blog.rusin.lol/tags/Git/"/>
    
    <category term="VS code" scheme="https://blog.rusin.lol/tags/VS-code/"/>
    
    <category term="NodeJS" scheme="https://blog.rusin.lol/tags/NodeJS/"/>
    
  </entry>
  
  <entry>
    <title>侧边栏添加个性定位欢迎信息</title>
    <link href="https://blog.rusin.lol/article/27803091/"/>
    <id>https://blog.rusin.lol/article/27803091/</id>
    <published>2026-04-06T12:58:53.000Z</published>
    <updated>2026-06-03T09:27:37.361Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前景介绍"><a href="#前景介绍" class="headerlink" title="前景介绍"></a>前景介绍</h2><details class="foldable info" open>  <summary>背景</summary>  <div><p>基于<a class="btn-anzhiyu " href="/%E2%80%98%3Ca%20href=https:/blog.bsgun.cn/posts/ef58a648/&#39;"   title="%E6%A2%A6%E7%88%B1%E5%90%83%E9%B1%BC%E7%9A%84%E6%95%99%E7%A8%8B>https://blog.bsgun.cn/posts/ef58a648/&#39;"><i class="梦爱吃鱼的教程</a>"></i><span>%E6%A2%A6%E7%88%B1%E5%90%83%E9%B1%BC%E7%9A%84%E6%95%99%E7%A8%8B>https://blog.bsgun.cn/posts/ef58a648/&#39;</span></a>进行修改，主要改进是<strong>更换 API 地址</strong>，因为<a href="https://api.nsmao.net/">原 API</a> 已经失效。</p>  </div></details><h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><h3 id="创建-JS-文件"><a href="#创建-JS-文件" class="headerlink" title="创建 JS 文件"></a>创建 JS 文件</h3><p>在博客主题目录的 js 文件夹（~\themes\anzhiyu\source\js）下创建 welcome.js 文件(也可以在source文件夹下另外新建文件夹)。</p><h3 id="配置经纬度"><a href="#配置经纬度" class="headerlink" title="配置经纬度"></a>配置经纬度</h3><a class="btn-anzhiyu " href="https://uapis.cn/api/v1/network/myip?source=commercial"   title="点击这里"><span>点击这里</span></a>，找到<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&quot;latitude&quot;: xxx,&quot;longitude&quot;: xxx,</span><br></pre></td></tr></table></figure><p>复制对应的经度(lng)和纬度(lat)值。</p><hr><p>将以下内容复制到 <code>welcome.js</code> 中,并修改文件顶部配置信息</p><details class="foldable success">  <summary>代码</summary>  <div><p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="property">IP_CONFIG</span> = &#123;</span><br><span class="line">    <span class="attr">BLOG_LOCATION</span>: &#123;</span><br><span class="line">        <span class="attr">lng</span>: <span class="number">121.4</span>, <span class="comment">// 博主经度</span></span><br><span class="line">        <span class="attr">lat</span>: <span class="number">29.9</span>,  <span class="comment">// 博主纬度</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">CACHE_DURATION</span>: <span class="number">1000</span> * <span class="number">60</span> * <span class="number">60</span>, <span class="comment">// 缓存1小时</span></span><br><span class="line">    <span class="attr">HOME_PAGE_ONLY</span>: <span class="literal">true</span>, <span class="comment">// 是否只在首页显示</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 添加样式</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">addStyles</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> style = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;style&#x27;</span>);</span><br><span class="line">    style.<span class="property">textContent</span> = <span class="string"><code>&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        #welcome-info &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            user-select: none;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            display: flex;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            justify-content: center;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            align-items: center;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            height: 212px;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            padding: 10px;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            margin-top: 5px;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            border-radius: 12px;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            background-color: var(--anzhiyu-background);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            outline: 1px solid var(--anzhiyu-card-border);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        .loading-spinner &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            width: 50px;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            height: 50px;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            border: 3px solid rgba(0, 0, 0, 0.1);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            border-radius: 50%;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            border-top: 3px solid var(--anzhiyu-main);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            animation: spin 1s linear infinite;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        @keyframes spin &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            0% &amp;#123; transform: rotate(0deg); &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            100% &amp;#123; transform: rotate(360deg); &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        .ip-address &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            filter: blur(5px);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            transition: filter 0.3s ease;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        .ip-address:hover &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            filter: blur(0);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        .error-message &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            color: #ff6565;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            display: flex;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            flex-direction: column;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            justify-content: center;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            align-items: center;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        .error-message p,&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        .permission-dialog p &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            margin: 0;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        .error-icon &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            font-size: 3rem;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        #retry-button &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            margin: 0 5px;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            color: var(--anzhiyu-main);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            transition: transform 0.3s ease;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            cursor: pointer;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        #retry-button:hover &amp;#123;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            transform: rotate(180deg);&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;    </code></span>;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">head</span>.<span class="title function_">appendChild</span>(style);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取欢迎信息元素</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getWelcomeInfoElement</span> = (<span class="params"></span>) =&gt; <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#welcome-info&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 显示加载动画</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">showLoadingSpinner</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> welcomeInfoElement = <span class="title function_">getWelcomeInfoElement</span>();</span><br><span class="line">    <span class="keyword">if</span> (!welcomeInfoElement) <span class="keyword">return</span>;</span><br><span class="line">    welcomeInfoElement.<span class="property">innerHTML</span> = <span class="string">&#x27;&lt;div class=&quot;loading-spinner&quot;&gt;&lt;/div&gt;&#x27;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 显示错误信息</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">showErrorMessage</span> = (<span class="params">message = <span class="string">&#x27;抱歉，无法获取信息&#x27;</span></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> welcomeInfoElement = <span class="title function_">getWelcomeInfoElement</span>();</span><br><span class="line">    <span class="keyword">if</span> (!welcomeInfoElement) <span class="keyword">return</span>;</span><br><span class="line">  </span><br><span class="line">    welcomeInfoElement.<span class="property">innerHTML</span> = <span class="string"><code>&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;lt;div class=&amp;quot;error-message&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            &amp;lt;div class=&amp;quot;error-icon&amp;quot;&amp;gt;😕&amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            &amp;lt;p&amp;gt;&lt;span class=&quot;subst&quot;&gt;$&amp;#123;message&amp;#125;&lt;/span&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;            &amp;lt;p&amp;gt;请&amp;lt;i id=&amp;quot;retry-button&amp;quot; class=&amp;quot;fa-solid fa-arrows-rotate&amp;quot;&amp;gt;&amp;lt;/i&amp;gt;重试或检查网络连接&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &amp;lt;/div&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;    </code></span>;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;retry-button&#x27;</span>).<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, fetchIpInfo);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 缓存相关</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">IP_CACHE_KEY</span> = <span class="string">&#x27;ip_info_cache&#x27;</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getIpInfoFromCache</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> cached = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="variable constant_">IP_CACHE_KEY</span>);</span><br><span class="line">    <span class="keyword">if</span> (!cached) <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">const</span> &#123; data, timestamp &#125; = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(cached);</span><br><span class="line">    <span class="keyword">if</span> (<span class="title class_">Date</span>.<span class="title function_">now</span>() - timestamp &gt; <span class="variable constant_">IP_CONFIG</span>.<span class="property">CACHE_DURATION</span>) &#123;</span><br><span class="line">        <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="variable constant_">IP_CACHE_KEY</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> data;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">setIpInfoCache</span> = (<span class="params">data</span>) =&gt; &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="variable constant_">IP_CACHE_KEY</span>, <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(&#123;</span><br><span class="line">        data,</span><br><span class="line">        <span class="attr">timestamp</span>: <span class="title class_">Date</span>.<span class="title function_">now</span>()</span><br><span class="line">    &#125;));</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 计算距离</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">calculateDistance</span> = (<span class="params">lng, lat</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> R = <span class="number">6371</span>; <span class="comment">// 地球半径(km)</span></span><br><span class="line">    <span class="keyword">const</span> rad = <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">180</span>;</span><br><span class="line">    <span class="keyword">const</span> dLat = (lat - <span class="variable constant_">IP_CONFIG</span>.<span class="property">BLOG_LOCATION</span>.<span class="property">lat</span>) * rad;</span><br><span class="line">    <span class="keyword">const</span> dLon = (lng - <span class="variable constant_">IP_CONFIG</span>.<span class="property">BLOG_LOCATION</span>.<span class="property">lng</span>) * rad;</span><br><span class="line">    <span class="keyword">const</span> a = <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLat / <span class="number">2</span>) * <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLat / <span class="number">2</span>) +</span><br><span class="line">        <span class="title class_">Math</span>.<span class="title function_">cos</span>(<span class="variable constant_">IP_CONFIG</span>.<span class="property">BLOG_LOCATION</span>.<span class="property">lat</span> * rad) * <span class="title class_">Math</span>.<span class="title function_">cos</span>(lat * rad) *</span><br><span class="line">        <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLon / <span class="number">2</span>) * <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLon / <span class="number">2</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="title class_">Math</span>.<span class="title function_">round</span>(R * <span class="number">2</span> * <span class="title class_">Math</span>.<span class="title function_">atan2</span>(<span class="title class_">Math</span>.<span class="title function_">sqrt</span>(a), <span class="title class_">Math</span>.<span class="title function_">sqrt</span>(<span class="number">1</span> - a)));</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 格式化IP显示</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">formatIpDisplay</span> = (<span class="params">ip</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (!ip) <span class="keyword">return</span> <span class="string">&quot;未知IP&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span> ip.<span class="title function_">includes</span>(<span class="string">&quot;:&quot;</span>) ? <span class="string">&quot;IPv6地址&quot;</span> : ip;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 格式化位置</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">formatLocation</span> = (<span class="params">region</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (!region) <span class="keyword">return</span> <span class="string">&#x27;神秘地区&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span> region.<span class="title function_">replace</span>(<span class="regexp">/\s+/g</span>, <span class="string">&quot; &quot;</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 时段问候</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getTimeGreeting</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> hour = <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">getHours</span>();</span><br><span class="line">    <span class="keyword">if</span> (hour &lt; <span class="number">11</span>) <span class="keyword">return</span> <span class="string">&quot;早上好🌤️，一日之计在于晨&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (hour &lt; <span class="number">13</span>) <span class="keyword">return</span> <span class="string">&quot;中午好☀️，记得午休喔<del>&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (hour &lt; <span class="number">17</span>) <span class="keyword">return</span> <span class="string">&quot;下午好🕞，饮茶先啦！&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (hour &lt; <span class="number">19</span>) <span class="keyword">return</span> <span class="string">&quot;即将下班🚶‍♂️，记得按时吃饭</del>&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;晚上好🌙，夜生活嗨起来！&quot;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// ====================== 终极修复：适配 浙江、江苏 这种简写 ======================</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getGreeting</span> = (<span class="params">region</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (!region) <span class="keyword">return</span> <span class="string">&quot;带我去你的城市逛逛吧！&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> parts = region.<span class="title function_">trim</span>().<span class="title function_">split</span>(<span class="regexp">/\s+/</span>).<span class="title function_">filter</span>(<span class="title class_">Boolean</span>);</span><br><span class="line">    <span class="keyword">const</span> province = parts[<span class="number">1</span>] || <span class="string">&quot;&quot;</span>;</span><br><span class="line">    <span class="keyword">const</span> city = parts[<span class="number">2</span>] || <span class="string">&quot;&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;南京&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;六朝古都，风华依旧&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;苏州&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;上有天堂，下有苏杭&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;杭州&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;东风渐绿西湖柳，雁已还人未南归&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;郑州&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;豫州之域，天地之中&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;洛阳&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;洛阳城里见秋风，欲作家书意万重&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;开封&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;包公那叫一个铁面无私，严惩贪官污吏&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;宁波&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;海上丝路的起点，和我一个城市。&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;西安&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;十三朝古都，长治久安！&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 省份匹配（简写版）</span></span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;北京&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;北京欢迎你~~~&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;天津&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;讲段相声吧&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;河北&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;山势巍巍成壁垒，天下雄关&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;山西&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;展开坐具长三尺，已占山河五百余&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;内蒙古&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;天苍苍，野茫茫，风吹草低见牛羊&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;辽宁&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;我想吃烤鸡架！&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;吉林&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;状元阁就是东北烧烤之王&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;黑龙江&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;很喜欢哈尔滨大剧院&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;上海&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;众所周知，中国只有两个城市&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;江苏&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;散装是必须要散装的&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;浙江&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;望海楼明照曙霞，闲塘十里尽梅花&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;河南&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;可否带我品尝河南烩面啦？&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;欢迎来到我的博客！&quot;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="comment">// ==============================================================================</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 生成欢迎信息</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">generateWelcomeMessage</span> = (<span class="params">region, dist, ipDisplay</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> location = <span class="title function_">formatLocation</span>(region);</span><br><span class="line">    <span class="keyword">const</span> timeGreet = <span class="title function_">getTimeGreeting</span>();</span><br><span class="line">    <span class="keyword">const</span> cityGreet = <span class="title function_">getGreeting</span>(region);</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">return</span> <span class="string"><code>&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        欢迎来自 &amp;lt;b&amp;gt;&lt;span class=&quot;subst&quot;&gt;$&amp;#123;location&amp;#125;&lt;/span&gt;&amp;lt;/b&amp;gt; 的小友💖&amp;lt;br&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        你当前距博主约 &amp;lt;b&amp;gt;&lt;span class=&quot;subst&quot;&gt;$&amp;#123;dist&amp;#125;&lt;/span&gt;&amp;lt;/b&amp;gt; 公里！&amp;lt;br&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        你的IP地址：&amp;lt;b class=&amp;quot;ip-address&amp;quot;&amp;gt;&lt;span class=&quot;subst&quot;&gt;$&amp;#123;ipDisplay&amp;#125;&lt;/span&gt;&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        &lt;span class=&quot;subst&quot;&gt;$&amp;#123;timeGreet&amp;#125;&lt;/span&gt;&amp;lt;br&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;        Tip：&amp;lt;b&amp;gt;&lt;span class=&quot;subst&quot;&gt;$&amp;#123;cityGreet&amp;#125;&lt;/span&gt;🍂&amp;lt;/b&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;string&quot;&gt;    </code></span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">showWelcome</span> = (<span class="params">data</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (!data || !data.<span class="property">ip</span>) <span class="keyword">return</span> <span class="title function_">showErrorMessage</span>();</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">const</span> welcomeInfo = <span class="title function_">getWelcomeInfoElement</span>();</span><br><span class="line">    <span class="keyword">if</span> (!welcomeInfo) <span class="keyword">return</span>;</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">const</span> dist = <span class="title function_">calculateDistance</span>(data.<span class="property">longitude</span>, data.<span class="property">latitude</span>);</span><br><span class="line">    <span class="keyword">const</span> ipDisplay = <span class="title function_">formatIpDisplay</span>(data.<span class="property">ip</span>);</span><br><span class="line">  </span><br><span class="line">    welcomeInfo.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;block&#x27;</span>;</span><br><span class="line">    welcomeInfo.<span class="property">style</span>.<span class="property">height</span> = <span class="string">&#x27;auto&#x27;</span>;</span><br><span class="line">    welcomeInfo.<span class="property">innerHTML</span> = <span class="title function_">generateWelcomeMessage</span>(data.<span class="property">region</span>, dist, ipDisplay);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 从uapis.cn获取IP信息</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">fetchIpData</span> = <span class="keyword">async</span> (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">&#x27;<a href="https://uapis.cn/api/v1/network/myip?source=commercial&amp;#x27">https://uapis.cn/api/v1/network/myip?source=commercial&amp;#x27</a>;</span>);</span><br><span class="line">    <span class="keyword">if</span> (!response.<span class="property">ok</span>) <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">&#x27;API请求失败&#x27;</span>);</span><br><span class="line">    <span class="keyword">const</span> result = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span><br><span class="line">    <span class="keyword">return</span> result;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取IP信息主函数</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">fetchIpInfo</span> = <span class="keyword">async</span> (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="title function_">showLoadingSpinner</span>();</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">const</span> cachedData = <span class="title function_">getIpInfoFromCache</span>();</span><br><span class="line">    <span class="keyword">if</span> (cachedData) &#123;</span><br><span class="line">        <span class="title function_">showWelcome</span>(cachedData);</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">const</span> data = <span class="keyword">await</span> <span class="title function_">fetchIpData</span>();</span><br><span class="line">        <span class="title function_">setIpInfoCache</span>(data);</span><br><span class="line">        <span class="title function_">showWelcome</span>(data);</span><br><span class="line">    &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;获取IP信息失败:&#x27;</span>, error);</span><br><span class="line">        <span class="title function_">showErrorMessage</span>(<span class="string">&#x27;获取IP信息失败，请重试&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">isHomePage</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable language_">window</span>.<span class="property">location</span>.<span class="property">pathname</span> === <span class="string">&#x27;/&#x27;</span> || <span class="variable language_">window</span>.<span class="property">location</span>.<span class="property">pathname</span> === <span class="string">&#x27;/index.html&#x27;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 插入组件</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">insertAnnouncementComponent</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> announcementCards = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;.card-widget.card-announcement&#x27;</span>);</span><br><span class="line">    <span class="keyword">if</span> (!announcementCards.<span class="property">length</span>) <span class="keyword">return</span>;</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">if</span> (<span class="variable constant_">IP_CONFIG</span>.<span class="property">HOME_PAGE_ONLY</span> &amp;&amp; !<span class="title function_">isHomePage</span>()) &#123;</span><br><span class="line">        announcementCards.<span class="title function_">forEach</span>(<span class="function"><span class="params">card</span> =&gt;</span> card.<span class="title function_">remove</span>());</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  </span><br><span class="line">    <span class="keyword">if</span> (!<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#welcome-info&#x27;</span>)) <span class="keyword">return</span>;</span><br><span class="line">    <span class="title function_">fetchIpInfo</span>();</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;DOMContentLoaded&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="title function_">addStyles</span>();</span><br><span class="line">    <span class="title function_">insertAnnouncementComponent</span>();</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;pjax:complete&#x27;</span>, insertAnnouncementComponent);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></p>  </div></details><h2 id="插入-JS-文件"><a href="#插入-JS-文件" class="headerlink" title="插入 JS 文件"></a>插入 JS 文件</h2><p>在 <code>_config.anzhiyu.yml</code> （或其他主题）主题配置文件下 <code>inject</code> 配置项中的 <code>bottom</code> 引入 <code>welcome.js</code>。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;/js/welcome.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><div class="tip info"><p>图片内容仅供参考，具体根据实际情况修改。</p></div><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="/img/2026/2780309151/1.png" alt="截屏"></p><h2 id="配置内容"><a href="#配置内容" class="headerlink" title="配置内容"></a>配置内容</h2><p>确认 <code>_config.anzhiyu.yml</code> （或其他主题）主题配置文件下 <code>aside</code> 配置项中的 <code>card_announcement</code> 是否开启，配置参考：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">card_announcement:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment"># 必须开启</span></span><br><span class="line">  <span class="attr">content:</span> <span class="string">···（省略）</span></span><br><span class="line">           <span class="string">&lt;div</span> <span class="string">id=&quot;welcome-info&quot;&gt;&lt;/div&gt;</span> <span class="comment"># 必须项</span></span><br></pre></td></tr></table></figure><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="/img/2026/2780309151/2.png" alt="截屏"></p><hr><details class="folding-tag" yellow><summary> 注意事项 </summary>              <div class='content'>              <ul><li>确保API密钥正确填写,正确设置白名单</li><li>经纬度没必要填写详细,为了自身隐私安全</li><li>选择器可以根据你的主题实际情况修改</li></ul>              </div>            </details><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><p><strong>Q</strong>: 为什么显示”无法获取信息”?<br><strong>A</strong>: 可能是 API 炸了，检查配置并重试。实在不行联系我更新文章。</p><p><strong>Q</strong>: 距离显示不准确?<br><strong>A</strong>: 正常现象，计算有无法避免的误差，大概就行了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前景介绍&quot;&gt;&lt;a href=&quot;#前景介绍&quot; class=&quot;headerlink&quot; title=&quot;前景介绍&quot;&gt;&lt;/a&gt;前景介绍&lt;/h2&gt;&lt;details class=&quot;foldable info&quot; open&gt;
  &lt;summary&gt;背景&lt;/summary&gt;
  &lt;d</summary>
      
    
    
    
    <category term="网站开发" scheme="https://blog.rusin.lol/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Hexo" scheme="https://blog.rusin.lol/tags/Hexo/"/>
    
    <category term="安知鱼美化" scheme="https://blog.rusin.lol/tags/%E5%AE%89%E7%9F%A5%E9%B1%BC%E7%BE%8E%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>侧边栏添加个性定位欢迎信息</title>
    <link href="https://blog.rusin.lol/article/2780309151/"/>
    <id>https://blog.rusin.lol/article/2780309151/</id>
    <published>2026-04-06T12:58:53.000Z</published>
    <updated>2026-05-12T12:57:18.287Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前景介绍"><a href="#前景介绍" class="headerlink" title="前景介绍"></a>前景介绍</h2><details class="folding-tag" green open><summary> 查看代码测试 </summary>              <div class='content'>              <p>基于<a class="btn-anzhiyu " href="https://blog.bsgun.cn/posts/ef58a648/"   title="梦爱吃鱼的教程"><span>梦爱吃鱼的教程</span></a>进行修改，主要改进是<strong>更换 API 地址</strong>，因为<a href="https://api.nsmao.net/">原 API</a> 已经失效。</p>              </div>            </details><h2 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h2><h3 id="创建-JS-文件"><a href="#创建-JS-文件" class="headerlink" title="创建 JS 文件"></a>创建 JS 文件</h3><p>在博客主题目录的 js 文件夹（~\themes\anzhiyu\source\js）下创建 welcome.js 文件(也可以在source文件夹下另外新建文件夹)。</p><h3 id="配置经纬度"><a href="#配置经纬度" class="headerlink" title="配置经纬度"></a>配置经纬度</h3><a class="btn-anzhiyu " href="https://uapis.cn/api/v1/network/myip?source=commercial"   title="点击这里"><span>点击这里</span></a>，找到<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&quot;latitude&quot;: xxx,&quot;longitude&quot;: xxx,</span><br></pre></td></tr></table></figure><p>复制对应的经度(lng)和纬度(lat)值。</p><hr><p>将以下内容复制到 <code>welcome.js</code> 中,并修改文件顶部配置信息</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 适配uapis.cn API的来访者欢迎卡片JS（完美适配简写省份：浙江 / 江苏 / 河南）</span></span><br><span class="line"><span class="variable language_">window</span>.<span class="property">IP_CONFIG</span> = &#123;</span><br><span class="line">    <span class="attr">BLOG_LOCATION</span>: &#123;</span><br><span class="line">        <span class="attr">lng</span>: <span class="number">121.4</span>, <span class="comment">// 博主经度</span></span><br><span class="line">        <span class="attr">lat</span>: <span class="number">29.9</span>,  <span class="comment">// 博主纬度</span></span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">CACHE_DURATION</span>: <span class="number">1000</span> * <span class="number">60</span> * <span class="number">60</span>, <span class="comment">// 缓存1小时</span></span><br><span class="line">    <span class="attr">HOME_PAGE_ONLY</span>: <span class="literal">true</span>, <span class="comment">// 是否只在首页显示</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 添加样式</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">addStyles</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> style = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;style&#x27;</span>);</span><br><span class="line">    style.<span class="property">textContent</span> = <span class="string">`</span></span><br><span class="line"><span class="string">        #welcome-info &#123;</span></span><br><span class="line"><span class="string">            user-select: none;</span></span><br><span class="line"><span class="string">            display: flex;</span></span><br><span class="line"><span class="string">            justify-content: center;</span></span><br><span class="line"><span class="string">            align-items: center;</span></span><br><span class="line"><span class="string">            height: 212px;</span></span><br><span class="line"><span class="string">            padding: 10px;</span></span><br><span class="line"><span class="string">            margin-top: 5px;</span></span><br><span class="line"><span class="string">            border-radius: 12px;</span></span><br><span class="line"><span class="string">            background-color: var(--anzhiyu-background);</span></span><br><span class="line"><span class="string">            outline: 1px solid var(--anzhiyu-card-border);</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        .loading-spinner &#123;</span></span><br><span class="line"><span class="string">            width: 50px;</span></span><br><span class="line"><span class="string">            height: 50px;</span></span><br><span class="line"><span class="string">            border: 3px solid rgba(0, 0, 0, 0.1);</span></span><br><span class="line"><span class="string">            border-radius: 50%;</span></span><br><span class="line"><span class="string">            border-top: 3px solid var(--anzhiyu-main);</span></span><br><span class="line"><span class="string">            animation: spin 1s linear infinite;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        @keyframes spin &#123;</span></span><br><span class="line"><span class="string">            0% &#123; transform: rotate(0deg); &#125;</span></span><br><span class="line"><span class="string">            100% &#123; transform: rotate(360deg); &#125;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        .ip-address &#123;</span></span><br><span class="line"><span class="string">            filter: blur(5px);</span></span><br><span class="line"><span class="string">            transition: filter 0.3s ease;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        .ip-address:hover &#123;</span></span><br><span class="line"><span class="string">            filter: blur(0);</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        .error-message &#123;</span></span><br><span class="line"><span class="string">            color: #ff6565;</span></span><br><span class="line"><span class="string">            display: flex;</span></span><br><span class="line"><span class="string">            flex-direction: column;</span></span><br><span class="line"><span class="string">            justify-content: center;</span></span><br><span class="line"><span class="string">            align-items: center;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        .error-message p,</span></span><br><span class="line"><span class="string">        .permission-dialog p &#123;</span></span><br><span class="line"><span class="string">            margin: 0;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        .error-icon &#123;</span></span><br><span class="line"><span class="string">            font-size: 3rem;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        #retry-button &#123;</span></span><br><span class="line"><span class="string">            margin: 0 5px;</span></span><br><span class="line"><span class="string">            color: var(--anzhiyu-main);</span></span><br><span class="line"><span class="string">            transition: transform 0.3s ease;</span></span><br><span class="line"><span class="string">            cursor: pointer;</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">        #retry-button:hover &#123;</span></span><br><span class="line"><span class="string">            transform: rotate(180deg);</span></span><br><span class="line"><span class="string">        &#125;</span></span><br><span class="line"><span class="string">    `</span>;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">head</span>.<span class="title function_">appendChild</span>(style);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取欢迎信息元素</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getWelcomeInfoElement</span> = (<span class="params"></span>) =&gt; <span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#welcome-info&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 显示加载动画</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">showLoadingSpinner</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> welcomeInfoElement = <span class="title function_">getWelcomeInfoElement</span>();</span><br><span class="line">    <span class="keyword">if</span> (!welcomeInfoElement) <span class="keyword">return</span>;</span><br><span class="line">    welcomeInfoElement.<span class="property">innerHTML</span> = <span class="string">&#x27;&lt;div class=&quot;loading-spinner&quot;&gt;&lt;/div&gt;&#x27;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 显示错误信息</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">showErrorMessage</span> = (<span class="params">message = <span class="string">&#x27;抱歉，无法获取信息&#x27;</span></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> welcomeInfoElement = <span class="title function_">getWelcomeInfoElement</span>();</span><br><span class="line">    <span class="keyword">if</span> (!welcomeInfoElement) <span class="keyword">return</span>;</span><br><span class="line">    </span><br><span class="line">    welcomeInfoElement.<span class="property">innerHTML</span> = <span class="string">`</span></span><br><span class="line"><span class="string">        &lt;div class=&quot;error-message&quot;&gt;</span></span><br><span class="line"><span class="string">            &lt;div class=&quot;error-icon&quot;&gt;😕&lt;/div&gt;</span></span><br><span class="line"><span class="string">            &lt;p&gt;<span class="subst">$&#123;message&#125;</span>&lt;/p&gt;</span></span><br><span class="line"><span class="string">            &lt;p&gt;请&lt;i id=&quot;retry-button&quot; class=&quot;fa-solid fa-arrows-rotate&quot;&gt;&lt;/i&gt;重试或检查网络连接&lt;/p&gt;</span></span><br><span class="line"><span class="string">        &lt;/div&gt;</span></span><br><span class="line"><span class="string">    `</span>;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;retry-button&#x27;</span>).<span class="title function_">addEventListener</span>(<span class="string">&#x27;click&#x27;</span>, fetchIpInfo);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 缓存相关</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">IP_CACHE_KEY</span> = <span class="string">&#x27;ip_info_cache&#x27;</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getIpInfoFromCache</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> cached = <span class="variable language_">localStorage</span>.<span class="title function_">getItem</span>(<span class="variable constant_">IP_CACHE_KEY</span>);</span><br><span class="line">    <span class="keyword">if</span> (!cached) <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> &#123; data, timestamp &#125; = <span class="title class_">JSON</span>.<span class="title function_">parse</span>(cached);</span><br><span class="line">    <span class="keyword">if</span> (<span class="title class_">Date</span>.<span class="title function_">now</span>() - timestamp &gt; <span class="variable constant_">IP_CONFIG</span>.<span class="property">CACHE_DURATION</span>) &#123;</span><br><span class="line">        <span class="variable language_">localStorage</span>.<span class="title function_">removeItem</span>(<span class="variable constant_">IP_CACHE_KEY</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> data;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">setIpInfoCache</span> = (<span class="params">data</span>) =&gt; &#123;</span><br><span class="line">    <span class="variable language_">localStorage</span>.<span class="title function_">setItem</span>(<span class="variable constant_">IP_CACHE_KEY</span>, <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(&#123;</span><br><span class="line">        data,</span><br><span class="line">        <span class="attr">timestamp</span>: <span class="title class_">Date</span>.<span class="title function_">now</span>()</span><br><span class="line">    &#125;));</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 计算距离</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">calculateDistance</span> = (<span class="params">lng, lat</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> R = <span class="number">6371</span>; <span class="comment">// 地球半径(km)</span></span><br><span class="line">    <span class="keyword">const</span> rad = <span class="title class_">Math</span>.<span class="property">PI</span> / <span class="number">180</span>;</span><br><span class="line">    <span class="keyword">const</span> dLat = (lat - <span class="variable constant_">IP_CONFIG</span>.<span class="property">BLOG_LOCATION</span>.<span class="property">lat</span>) * rad;</span><br><span class="line">    <span class="keyword">const</span> dLon = (lng - <span class="variable constant_">IP_CONFIG</span>.<span class="property">BLOG_LOCATION</span>.<span class="property">lng</span>) * rad;</span><br><span class="line">    <span class="keyword">const</span> a = <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLat / <span class="number">2</span>) * <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLat / <span class="number">2</span>) +</span><br><span class="line">        <span class="title class_">Math</span>.<span class="title function_">cos</span>(<span class="variable constant_">IP_CONFIG</span>.<span class="property">BLOG_LOCATION</span>.<span class="property">lat</span> * rad) * <span class="title class_">Math</span>.<span class="title function_">cos</span>(lat * rad) *</span><br><span class="line">        <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLon / <span class="number">2</span>) * <span class="title class_">Math</span>.<span class="title function_">sin</span>(dLon / <span class="number">2</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="title class_">Math</span>.<span class="title function_">round</span>(R * <span class="number">2</span> * <span class="title class_">Math</span>.<span class="title function_">atan2</span>(<span class="title class_">Math</span>.<span class="title function_">sqrt</span>(a), <span class="title class_">Math</span>.<span class="title function_">sqrt</span>(<span class="number">1</span> - a)));</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 格式化IP显示</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">formatIpDisplay</span> = (<span class="params">ip</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (!ip) <span class="keyword">return</span> <span class="string">&quot;未知IP&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span> ip.<span class="title function_">includes</span>(<span class="string">&quot;:&quot;</span>) ? <span class="string">&quot;IPv6地址&quot;</span> : ip;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 格式化位置</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">formatLocation</span> = (<span class="params">region</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (!region) <span class="keyword">return</span> <span class="string">&#x27;神秘地区&#x27;</span>;</span><br><span class="line">    <span class="keyword">return</span> region.<span class="title function_">replace</span>(<span class="regexp">/\s+/g</span>, <span class="string">&quot; &quot;</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 时段问候</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getTimeGreeting</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> hour = <span class="keyword">new</span> <span class="title class_">Date</span>().<span class="title function_">getHours</span>();</span><br><span class="line">    <span class="keyword">if</span> (hour &lt; <span class="number">11</span>) <span class="keyword">return</span> <span class="string">&quot;早上好🌤️，一日之计在于晨&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (hour &lt; <span class="number">13</span>) <span class="keyword">return</span> <span class="string">&quot;中午好☀️，记得午休喔~&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (hour &lt; <span class="number">17</span>) <span class="keyword">return</span> <span class="string">&quot;下午好🕞，饮茶先啦！&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (hour &lt; <span class="number">19</span>) <span class="keyword">return</span> <span class="string">&quot;即将下班🚶‍♂️，记得按时吃饭~&quot;</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;晚上好🌙，夜生活嗨起来！&quot;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// ====================== 终极修复：适配 浙江、江苏 这种简写 ======================</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">getGreeting</span> = (<span class="params">region</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (!region) <span class="keyword">return</span> <span class="string">&quot;带我去你的城市逛逛吧！&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">const</span> parts = region.<span class="title function_">trim</span>().<span class="title function_">split</span>(<span class="regexp">/\s+/</span>).<span class="title function_">filter</span>(<span class="title class_">Boolean</span>);</span><br><span class="line">    <span class="keyword">const</span> province = parts[<span class="number">1</span>] || <span class="string">&quot;&quot;</span>; <span class="comment">// 浙江</span></span><br><span class="line">    <span class="keyword">const</span> city = parts[<span class="number">2</span>] || <span class="string">&quot;&quot;</span>;     <span class="comment">// 宁波</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 城市匹配</span></span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;南京&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;六朝古都，风华依旧&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;苏州&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;上有天堂，下有苏杭&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;杭州&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;东风渐绿西湖柳，雁已还人未南归&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;郑州&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;豫州之域，天地之中&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;洛阳&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;洛阳城里见秋风，欲作家书意万重&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;开封&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;包公那叫一个铁面无私，严惩贪官污吏&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (city === <span class="string">&quot;宁波&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;海上丝路的起点，和我一个城市。&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 省份匹配（简写版）</span></span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;北京&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;北京欢迎你~~~&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;天津&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;讲段相声吧&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;河北&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;山势巍巍成壁垒，天下雄关&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;山西&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;展开坐具长三尺，已占山河五百余&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;内蒙古&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;天苍苍，野茫茫，风吹草低见牛羊&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;辽宁&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;我想吃烤鸡架！&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;吉林&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;状元阁就是东北烧烤之王&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;黑龙江&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;很喜欢哈尔滨大剧院&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;上海&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;众所周知，中国只有两个城市&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;江苏&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;散装是必须要散装的&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;浙江&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;望海楼明照曙霞，闲塘十里尽梅花&quot;</span>;</span><br><span class="line">    <span class="keyword">if</span> (province === <span class="string">&quot;河南&quot;</span>) <span class="keyword">return</span> <span class="string">&quot;可否带我品尝河南烩面啦？&quot;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;欢迎来到我的博客！&quot;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="comment">// ==============================================================================</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 生成欢迎信息</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">generateWelcomeMessage</span> = (<span class="params">region, dist, ipDisplay</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> location = <span class="title function_">formatLocation</span>(region);</span><br><span class="line">    <span class="keyword">const</span> timeGreet = <span class="title function_">getTimeGreeting</span>();</span><br><span class="line">    <span class="keyword">const</span> cityGreet = <span class="title function_">getGreeting</span>(region);</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">return</span> <span class="string">`</span></span><br><span class="line"><span class="string">        欢迎来自 &lt;b&gt;<span class="subst">$&#123;location&#125;</span>&lt;/b&gt; 的小友💖&lt;br&gt;</span></span><br><span class="line"><span class="string">        你当前距博主约 &lt;b&gt;<span class="subst">$&#123;dist&#125;</span>&lt;/b&gt; 公里！&lt;br&gt;</span></span><br><span class="line"><span class="string">        你的IP地址：&lt;b class=&quot;ip-address&quot;&gt;<span class="subst">$&#123;ipDisplay&#125;</span>&lt;/b&gt;&lt;br&gt;</span></span><br><span class="line"><span class="string">        <span class="subst">$&#123;timeGreet&#125;</span>&lt;br&gt;</span></span><br><span class="line"><span class="string">        Tip：&lt;b&gt;<span class="subst">$&#123;cityGreet&#125;</span>🍂&lt;/b&gt;</span></span><br><span class="line"><span class="string">    `</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 显示欢迎信息</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">showWelcome</span> = (<span class="params">data</span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">if</span> (!data || !data.<span class="property">ip</span>) <span class="keyword">return</span> <span class="title function_">showErrorMessage</span>();</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> welcomeInfo = <span class="title function_">getWelcomeInfoElement</span>();</span><br><span class="line">    <span class="keyword">if</span> (!welcomeInfo) <span class="keyword">return</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> dist = <span class="title function_">calculateDistance</span>(data.<span class="property">longitude</span>, data.<span class="property">latitude</span>);</span><br><span class="line">    <span class="keyword">const</span> ipDisplay = <span class="title function_">formatIpDisplay</span>(data.<span class="property">ip</span>);</span><br><span class="line">    </span><br><span class="line">    welcomeInfo.<span class="property">style</span>.<span class="property">display</span> = <span class="string">&#x27;block&#x27;</span>;</span><br><span class="line">    welcomeInfo.<span class="property">style</span>.<span class="property">height</span> = <span class="string">&#x27;auto&#x27;</span>;</span><br><span class="line">    welcomeInfo.<span class="property">innerHTML</span> = <span class="title function_">generateWelcomeMessage</span>(data.<span class="property">region</span>, dist, ipDisplay);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 从uapis.cn获取IP信息</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">fetchIpData</span> = <span class="keyword">async</span> (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> response = <span class="keyword">await</span> <span class="title function_">fetch</span>(<span class="string">&#x27;https://uapis.cn/api/v1/network/myip?source=commercial&#x27;</span>);</span><br><span class="line">    <span class="keyword">if</span> (!response.<span class="property">ok</span>) <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">Error</span>(<span class="string">&#x27;API请求失败&#x27;</span>);</span><br><span class="line">    <span class="keyword">const</span> result = <span class="keyword">await</span> response.<span class="title function_">json</span>();</span><br><span class="line">    <span class="keyword">return</span> result;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取IP信息主函数</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">fetchIpInfo</span> = <span class="keyword">async</span> (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="title function_">showLoadingSpinner</span>();</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">const</span> cachedData = <span class="title function_">getIpInfoFromCache</span>();</span><br><span class="line">    <span class="keyword">if</span> (cachedData) &#123;</span><br><span class="line">        <span class="title function_">showWelcome</span>(cachedData);</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">try</span> &#123;</span><br><span class="line">        <span class="keyword">const</span> data = <span class="keyword">await</span> <span class="title function_">fetchIpData</span>();</span><br><span class="line">        <span class="title function_">setIpInfoCache</span>(data);</span><br><span class="line">        <span class="title function_">showWelcome</span>(data);</span><br><span class="line">    &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;获取IP信息失败:&#x27;</span>, error);</span><br><span class="line">        <span class="title function_">showErrorMessage</span>(<span class="string">&#x27;获取IP信息失败，请重试&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 判断是否首页</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">isHomePage</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable language_">window</span>.<span class="property">location</span>.<span class="property">pathname</span> === <span class="string">&#x27;/&#x27;</span> || <span class="variable language_">window</span>.<span class="property">location</span>.<span class="property">pathname</span> === <span class="string">&#x27;/index.html&#x27;</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 插入组件</span></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">insertAnnouncementComponent</span> = (<span class="params"></span>) =&gt; &#123;</span><br><span class="line">    <span class="keyword">const</span> announcementCards = <span class="variable language_">document</span>.<span class="title function_">querySelectorAll</span>(<span class="string">&#x27;.card-widget.card-announcement&#x27;</span>);</span><br><span class="line">    <span class="keyword">if</span> (!announcementCards.<span class="property">length</span>) <span class="keyword">return</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (<span class="variable constant_">IP_CONFIG</span>.<span class="property">HOME_PAGE_ONLY</span> &amp;&amp; !<span class="title function_">isHomePage</span>()) &#123;</span><br><span class="line">        announcementCards.<span class="title function_">forEach</span>(<span class="function"><span class="params">card</span> =&gt;</span> card.<span class="title function_">remove</span>());</span><br><span class="line">        <span class="keyword">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">if</span> (!<span class="variable language_">document</span>.<span class="title function_">querySelector</span>(<span class="string">&#x27;#welcome-info&#x27;</span>)) <span class="keyword">return</span>;</span><br><span class="line">    <span class="title function_">fetchIpInfo</span>();</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 初始化</span></span><br><span class="line"><span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;DOMContentLoaded&#x27;</span>, <span class="function">() =&gt;</span> &#123;</span><br><span class="line">    <span class="title function_">addStyles</span>();</span><br><span class="line">    <span class="title function_">insertAnnouncementComponent</span>();</span><br><span class="line">    <span class="variable language_">document</span>.<span class="title function_">addEventListener</span>(<span class="string">&#x27;pjax:complete&#x27;</span>, insertAnnouncementComponent);</span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure><h2 id="插入-JS-文件"><a href="#插入-JS-文件" class="headerlink" title="插入 JS 文件"></a>插入 JS 文件</h2><p>在 <code>_config.anzhiyu.yml</code> 主题配置文件下 <code>inject</code>配置项中的 <code>bottom</code> 引入 <code>welcome.js</code>。</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="string">&lt;script</span> <span class="string">src=&quot;/js/welcome.js&quot;&gt;&lt;/script&gt;</span></span><br></pre></td></tr></table></figure><div class="tip info"><p>图片内容仅供参考，具体根据实际情况修改。</p></div><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="/img/2026/2780309151/1.png" alt="截屏"></p><h2 id="配置内容"><a href="#配置内容" class="headerlink" title="配置内容"></a>配置内容</h2><p>确认 <code>_config.anzhiyu.yml</code> 主题配置文件下 <code>aside</code> 配置项中的 <code>card_announcement</code> 是否开启，配置参考：</p><figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">card_announcement:</span></span><br><span class="line">  <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment"># 必须开启</span></span><br><span class="line">  <span class="attr">content:</span> <span class="string">···（省略）</span></span><br><span class="line">           <span class="string">&lt;div</span> <span class="string">id=&quot;welcome-info&quot;&gt;&lt;/div&gt;</span> <span class="comment"># 必须项</span></span><br></pre></td></tr></table></figure><p><img src= "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" onerror="this.onerror=null,this.src=&quot;/img/404.jpg&quot;" data-lazy-src="/img/2026/2780309151/2.png" alt="截屏"></p><hr><details class="folding-tag" yellow><summary> 注意事项 </summary>              <div class='content'>              <ul><li>确保API密钥正确填写,正确设置白名单</li><li>经纬度没必要填写详细,为了自身隐私安全</li><li>选择器可以根据你的主题实际情况修改</li></ul>              </div>            </details><h2 id="常见问题"><a href="#常见问题" class="headerlink" title="常见问题"></a>常见问题</h2><p>Q: 为什么显示”无法获取信息”?<br>A: 可能是 API 炸了，检查配置并重试。实在不行联系我更新文章。</p><p>Q: 距离显示不准确?<br>A: 正常现象，计算有无法避免的误差，在 10 公里以内就行了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前景介绍&quot;&gt;&lt;a href=&quot;#前景介绍&quot; class=&quot;headerlink&quot; title=&quot;前景介绍&quot;&gt;&lt;/a&gt;前景介绍&lt;/h2&gt;&lt;details class=&quot;folding-tag&quot; green open&gt;&lt;summary&gt; 查看代码测试 &lt;/summar</summary>
      
    
    
    
    <category term="网站开发" scheme="https://blog.rusin.lol/categories/%E7%BD%91%E7%AB%99%E5%BC%80%E5%8F%91/"/>
    
    
    <category term="Hexo" scheme="https://blog.rusin.lol/tags/Hexo/"/>
    
    <category term="安知鱼美化" scheme="https://blog.rusin.lol/tags/%E5%AE%89%E7%9F%A5%E9%B1%BC%E7%BE%8E%E5%8C%96/"/>
    
  </entry>
  
  <entry>
    <title>图论之欧拉回路、差分约束——算法笔记</title>
    <link href="https://blog.rusin.lol/article/2472048401/"/>
    <id>https://blog.rusin.lol/article/2472048401/</id>
    <published>2026-04-03T13:17:47.000Z</published>
    <updated>2026-04-03T13:28:38.048Z</updated>
    
    <content type="html"><![CDATA[<h1 id="图论之欧拉回路、差分约束——算法笔记"><a href="#图论之欧拉回路、差分约束——算法笔记" class="headerlink" title="图论之欧拉回路、差分约束——算法笔记"></a>图论之欧拉回路、差分约束——算法笔记</h1><p><a href="https://vjudge.net/contest/767358">比赛</a></p><h2 id="欧拉回路"><a href="#欧拉回路" class="headerlink" title="欧拉回路"></a>欧拉回路</h2><p>无向代码1：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> x)</span></span>&#123;</span><br><span class="line"><span class="keyword">while</span>(f[x]&lt;to[x].<span class="built_in">size</span>())&#123;</span><br><span class="line"><span class="type">int</span> y=to[x][f[x]].first,idx=to[x][f[x]].second;</span><br><span class="line">f[x]++;</span><br><span class="line"><span class="keyword">if</span>(!vis[idx])&#123;</span><br><span class="line">vis[idx]=vis[idx^<span class="number">1</span>]=<span class="number">1</span>;</span><br><span class="line"><span class="built_in">dfs</span>(y);</span><br><span class="line">c[++l]=y;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>无向代码2：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> x=<span class="number">0</span>,y=<span class="number">0</span>,z=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line"><span class="keyword">if</span>(d[i]&amp;<span class="number">1</span>)x=i,++y;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(y&amp;&amp;y!=<span class="number">2</span>)&#123;</span><br><span class="line">cout&lt;&lt;<span class="string">&quot;Impossible&quot;</span>&lt;&lt;endl;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>有向<a href="https://www.luogu.com.cn/problem/P7771">题目</a>：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">int</span> n,m,d[<span class="number">100005</span>],c[<span class="number">100005</span>],f[<span class="number">100005</span>]<span class="comment">/*表示遍历到第几个点*/</span>;</span><br><span class="line">vector&lt;<span class="type">int</span>&gt;a[<span class="number">100005</span>];</span><br><span class="line">stack&lt;<span class="type">int</span>&gt;st;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> x)</span></span>&#123;</span><br><span class="line"><span class="type">int</span> l=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(f[x]&lt;a[x].<span class="built_in">size</span>())&#123;</span><br><span class="line"><span class="type">int</span> y=a[x][f[x]];</span><br><span class="line">f[x]++;</span><br><span class="line"><span class="built_in">dfs</span>(y);</span><br><span class="line">c[++l]=y;</span><br><span class="line">&#125;</span><br><span class="line">st.<span class="built_in">push</span>(x);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">cin&gt;&gt;n&gt;&gt;m;</span><br><span class="line"><span class="type">int</span> ind[<span class="number">100005</span>],outd[<span class="number">100005</span>],u,v;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=m;++i)&#123;</span><br><span class="line">cin&gt;&gt;u&gt;&gt;v;</span><br><span class="line">a[u].<span class="built_in">push_back</span>(v);</span><br><span class="line">ind[v]++,outd[u]++;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)<span class="built_in">sort</span>(a[i].<span class="built_in">begin</span>(),a[i].<span class="built_in">end</span>());</span><br><span class="line"><span class="type">int</span> x=<span class="number">1</span>,y=<span class="number">0</span>,z=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line"><span class="keyword">if</span>(ind[i]<span class="number">+1</span>==outd[i])x=i,++y;</span><br><span class="line"><span class="keyword">if</span>(ind[i]!=outd[i])++z;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!((y==<span class="number">1</span>&amp;&amp;z==<span class="number">2</span>)||!z))&#123;</span><br><span class="line">cout&lt;&lt;<span class="string">&quot;No&quot;</span>&lt;&lt;endl;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">dfs</span>(x);</span><br><span class="line"><span class="keyword">while</span>(!st.<span class="built_in">empty</span>())&#123;</span><br><span class="line">cout&lt;&lt;st.<span class="built_in">top</span>()&lt;&lt;<span class="string">&quot; &quot;</span>;</span><br><span class="line">st.<span class="built_in">pop</span>();</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="差分约束"><a href="#差分约束" class="headerlink" title="差分约束"></a>差分约束</h2><p>Bellman_Ford：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">Bellman_Ford</span><span class="params">(<span class="type">int</span> n)</span></span>&#123;</span><br><span class="line"><span class="keyword">auto</span> relax=[&amp;]()&#123;</span><br><span class="line"><span class="type">bool</span> f=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> k:to[i])&#123;</span><br><span class="line"><span class="keyword">if</span>(ans[i]&gt;ans[k.first]+k.second)&#123;</span><br><span class="line">ans[i]=<span class="built_in">min</span>(ans[i],ans[k.first]+k.second),f=<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> f;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;n<span class="number">-1</span>;++i)<span class="built_in">relax</span>();</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">relax</span>())cout&lt;&lt;<span class="string">&quot;NO&quot;</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)cout&lt;&lt;ans[i]&lt;&lt;<span class="string">&quot; &quot;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>完整<a href="https://www.luogu.com.cn/problem/P7771">题目</a>：</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">int</span> ans[<span class="number">5005</span>];</span><br><span class="line">vector&lt;pair&lt;<span class="type">int</span>,<span class="type">int</span>&gt;&gt;to[<span class="number">5005</span>];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">Bellman_Ford</span><span class="params">(<span class="type">int</span> n)</span></span>&#123;</span><br><span class="line"><span class="keyword">auto</span> relax=[&amp;]()&#123;</span><br><span class="line"><span class="type">bool</span> f=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> k:to[i])&#123;</span><br><span class="line"><span class="keyword">if</span>(ans[i]&gt;ans[k.first]+k.second)&#123;</span><br><span class="line">ans[i]=<span class="built_in">min</span>(ans[i],ans[k.first]+k.second),f=<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> f;</span><br><span class="line">&#125;;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;n<span class="number">-1</span>;++i)<span class="built_in">relax</span>();</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">relax</span>())cout&lt;&lt;<span class="string">&quot;NO&quot;</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;++i)cout&lt;&lt;ans[i]&lt;&lt;<span class="string">&quot; &quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> n,m,c1,c2,y;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">cin&gt;&gt;n&gt;&gt;m;</span><br><span class="line"><span class="built_in">fill</span>(ans,ans+n<span class="number">+1</span>,<span class="number">0</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=m;++i)&#123;</span><br><span class="line">cin&gt;&gt;c1&gt;&gt;c2&gt;&gt;y;</span><br><span class="line">to[c1].<span class="built_in">push_back</span>(&#123;c2,y&#125;);</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">Bellman_Ford</span>(n);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h1 id=&quot;图论之欧拉回路、差分约束——算法笔记&quot;&gt;&lt;a href=&quot;#图论之欧拉回路、差分约束——算法笔记&quot; class=&quot;headerlink&quot; title=&quot;图论之欧拉回路、差分约束——算法笔记&quot;&gt;&lt;/a&gt;图论之欧拉回路、差分约束——算法笔记&lt;/h1&gt;&lt;p&gt;&lt;a hre</summary>
      
    
    
    
    <category term="信息学奥赛" scheme="https://blog.rusin.lol/categories/%E4%BF%A1%E6%81%AF%E5%AD%A6%E5%A5%A5%E8%B5%9B/"/>
    
    
    <category term="C++" scheme="https://blog.rusin.lol/tags/C/"/>
    
    <category term="题解" scheme="https://blog.rusin.lol/tags/%E9%A2%98%E8%A7%A3/"/>
    
  </entry>
  
  <entry>
    <title>第22届浙大宁波理工学院程序设计大赛题解</title>
    <link href="https://blog.rusin.lol/article/74829/"/>
    <id>https://blog.rusin.lol/article/74829/</id>
    <published>2026-04-03T13:00:28.000Z</published>
    <updated>2026-06-06T10:42:54.319Z</updated>
    
    <content type="html"><![CDATA[<h2 id="A-字符串"><a href="#A-字符串" class="headerlink" title="A. 字符串"></a>A. 字符串</h2><p>按照题意模拟即可，如果想要省掉代码量可以开个 <code>std::vector&lt;std::pair&lt;char, int&gt;&gt; ve(n)</code> 前一个记录字符，后一个记录当前的下标，直接进行升序排序，然后直接从k+1个开始输出。 提供排序的代码。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">clearlove13</span><span class="params">(<span class="type">void</span>)</span></span>&#123;</span><br><span class="line">    <span class="type">int</span> n, k;</span><br><span class="line">    std::cin &gt;&gt; n &gt;&gt; k;</span><br><span class="line">    std::string s;</span><br><span class="line">    std::cin &gt;&gt; s;</span><br><span class="line">    std::vector&lt;std::pair&lt;<span class="type">char</span>, <span class="type">int</span>&gt;&gt; <span class="built_in">ve</span>(n);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line">        ve[i] = std::<span class="built_in">make_pair</span>(s[i], i);</span><br><span class="line">    &#125;</span><br><span class="line">    std::<span class="built_in">sort</span>(ve.<span class="built_in">begin</span>(), ve.<span class="built_in">end</span>());</span><br><span class="line">    std::vector&lt;std::pair&lt;<span class="type">char</span>, <span class="type">int</span>&gt;&gt; ans;</span><br><span class="line">    ans.<span class="built_in">reserve</span>(n);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = k; i &lt; n; i++) &#123;</span><br><span class="line">        ans.<span class="built_in">push_back</span>(&#123;ve[i].first, ve[i].second&#125;);</span><br><span class="line">    &#125;</span><br><span class="line">    std::<span class="built_in">sort</span>(ans.<span class="built_in">begin</span>(), ans.<span class="built_in">end</span>(), [&amp;](<span class="keyword">auto</span> &amp; a, <span class="keyword">auto</span> &amp; b) &#123;</span><br><span class="line">        <span class="keyword">return</span> a.second &lt; b.second;</span><br><span class="line">    &#125;);</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> &amp;[x, y] : ans) &#123;</span><br><span class="line">        std::cout &lt;&lt; x;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="B-价格跨度"><a href="#B-价格跨度" class="headerlink" title="B. 价格跨度"></a>B. 价格跨度</h2><p>题意大概就是求该 $a_i$ 前面第一个大于该 $a_i$ 的位置，从题目数据可得知，此题我们需要使用 $\mathcal{O(n)}$ 复杂度来写这道题，思考一下可以使用单调栈来实现，只需要等效思想来写即可。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">clearlove13</span><span class="params">(<span class="type">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    std::cin &gt;&gt; n;</span><br><span class="line">    <span class="function">std::vector&lt;<span class="type">int</span>&gt; <span class="title">a</span><span class="params">(n + <span class="number">1</span>)</span></span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        std::cin &gt;&gt; a[i];</span><br><span class="line">    &#125;</span><br><span class="line">    std::vector&lt;<span class="type">int</span>&gt;st;</span><br><span class="line">    <span class="function">std::vector&lt;<span class="type">int</span>&gt; <span class="title">ans</span><span class="params">(n + <span class="number">1</span>)</span></span>;</span><br><span class="line">    st.<span class="built_in">reserve</span>(n + <span class="number">1</span>);</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        <span class="keyword">while</span> (!st.<span class="built_in">empty</span>() &amp;&amp; a[st.<span class="built_in">back</span>()] &lt;= a[i]) &#123;</span><br><span class="line">            st.<span class="built_in">pop_back</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (st.<span class="built_in">empty</span>()) &#123;</span><br><span class="line">            ans[i] = i;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            ans[i] = i - st.<span class="built_in">back</span>();</span><br><span class="line">        &#125;</span><br><span class="line">        st.<span class="built_in">push_back</span>(i);</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        std::cout &lt;&lt; ans[i];</span><br><span class="line">        <span class="keyword">if</span> (i != n) std::cout &lt;&lt; <span class="string">&#x27; &#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="C-斐波那契数"><a href="#C-斐波那契数" class="headerlink" title="C. 斐波那契数"></a>C. 斐波那契数</h2><p>事实上题目已经告诉你了做法直接模拟即可。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">i64 a[<span class="number">51</span>];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">clearlove13</span><span class="params">(<span class="type">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    std::cin &gt;&gt; n;</span><br><span class="line">    std::cout &lt;&lt; a[n] &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">(<span class="type">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    std::ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">    std::cin.<span class="built_in">tie</span>(<span class="literal">nullptr</span>);</span><br><span class="line">    a[<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line">    a[<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">2</span>; i &lt;= <span class="number">50</span>; i++) &#123;</span><br><span class="line">        a[i] = a[i - <span class="number">1</span>] + a[i - <span class="number">2</span>];</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="type">int</span> cas = <span class="number">1</span>;</span><br><span class="line">    std::cin &gt;&gt; cas;</span><br><span class="line">    <span class="keyword">while</span> (cas--) <span class="built_in">clearlove13</span>();</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="D-回收礼物"><a href="#D-回收礼物" class="headerlink" title="D. 回收礼物"></a>D. 回收礼物</h2><p>设 $f(x\to y)$ 是以 $1$ 为根 ，求x到y的树上最小路径 我们先了解题意，就可以明白是需要求形如 $f(1\to 2)+f(2\to 3)+f(3\to <em>{\dots})+f(</em>{\dots}\to 2)$ 这么一个式子，那么我们应该怎么快速去求树上最短路径呢？引入lca求最近公共祖先，有一个小trick就是我们 所以我们就先求出到两个点的深度之和再减去公共祖先的深度就可以写出这道题了。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">struct</span> <span class="title class_">LCA</span> &#123;</span><br><span class="line">    <span class="type">int</span> n, lg;</span><br><span class="line">    std::vector&lt;std::vector&lt;<span class="type">int</span>&gt;&gt; up;</span><br><span class="line">    std::vector&lt;<span class="type">int</span>&gt; depth, tin, tout;</span><br><span class="line">    <span class="type">int</span> timer = <span class="number">0</span>;</span><br><span class="line"> </span><br><span class="line">    <span class="built_in">LCA</span>(std::vector&lt;std::vector&lt;<span class="type">int</span>&gt;&gt;&amp; ed, <span class="type">int</span> root = <span class="number">0</span>) &#123;</span><br><span class="line">        n = <span class="built_in">int</span>(ed.<span class="built_in">size</span>());</span><br><span class="line">        lg = std::__lg(n) + <span class="number">1</span>;</span><br><span class="line">        up.<span class="built_in">assign</span>(n, std::<span class="built_in">vector</span>&lt;<span class="type">int</span>&gt;(lg));</span><br><span class="line">        depth.<span class="built_in">assign</span>(n, <span class="number">0</span>);</span><br><span class="line">        tin.<span class="built_in">resize</span>(n), tout.<span class="built_in">resize</span>(n);</span><br><span class="line">        <span class="keyword">auto</span> dfs = [&amp;](<span class="keyword">auto</span> self, <span class="type">int</span> u, <span class="type">int</span> p) -&gt; <span class="type">void</span> &#123;</span><br><span class="line">            tin[u] = timer++;</span><br><span class="line">            up[u][<span class="number">0</span>] = p;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt; lg; ++i) up[u][i] = up[up[u][i - <span class="number">1</span>]][i - <span class="number">1</span>];</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> v : ed[u]) &#123;</span><br><span class="line">                <span class="keyword">if</span> (v == p) <span class="keyword">continue</span>;</span><br><span class="line">                depth[v] = depth[u] + <span class="number">1</span>;</span><br><span class="line">                <span class="built_in">self</span>(self, v, u);</span><br><span class="line">            &#125;</span><br><span class="line">            tout[u] = timer++;</span><br><span class="line">        &#125;;</span><br><span class="line">        <span class="built_in">dfs</span>(dfs, root, root);</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="function"><span class="type">bool</span> <span class="title">is_ancestor</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">return</span> tin[u] &lt;= tin[v] &amp;&amp; tout[v] &lt;= tout[u];</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="function"><span class="type">int</span> <span class="title">get_lca</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">is_ancestor</span>(u, v)) <span class="keyword">return</span> u;</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">is_ancestor</span>(v, u)) <span class="keyword">return</span> v;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = lg - <span class="number">1</span>; i &gt;= <span class="number">0</span>; --i)</span><br><span class="line">            <span class="keyword">if</span> (!<span class="built_in">is_ancestor</span>(up[u][i], v)) u = up[u][i];</span><br><span class="line">        <span class="keyword">return</span> up[u][<span class="number">0</span>];</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="function">std::vector&lt;<span class="type">int</span>&gt; <span class="title">get_path</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v)</span> </span>&#123;</span><br><span class="line">        <span class="type">int</span> w = <span class="built_in">get_lca</span>(u, v);</span><br><span class="line">        std::vector&lt;<span class="type">int</span>&gt; up_path, down_path;</span><br><span class="line">        <span class="keyword">while</span> (u != w) &#123;</span><br><span class="line">            up_path.<span class="built_in">push_back</span>(u);</span><br><span class="line">            u = up[u][<span class="number">0</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        up_path.<span class="built_in">push_back</span>(w);</span><br><span class="line">        <span class="keyword">while</span> (v != w) &#123;</span><br><span class="line">            down_path.<span class="built_in">push_back</span>(v);</span><br><span class="line">            v = up[v][<span class="number">0</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        std::<span class="built_in">reverse</span>(down_path.<span class="built_in">begin</span>(), down_path.<span class="built_in">end</span>());</span><br><span class="line">        up_path.<span class="built_in">insert</span>(up_path.<span class="built_in">end</span>(), down_path.<span class="built_in">begin</span>(), down_path.<span class="built_in">end</span>());</span><br><span class="line">        <span class="keyword">return</span> up_path;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">clearlove13</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="keyword">constexpr</span> <span class="type">int</span> lg = <span class="number">20</span>;</span><br><span class="line">    <span class="type">int</span> n, q, rt;</span><br><span class="line">    std::cin &gt;&gt; n &gt;&gt; q ;</span><br><span class="line">    rt = <span class="number">1</span>;</span><br><span class="line">    std::vector&lt;std::vector&lt;<span class="type">int</span>&gt;&gt; <span class="built_in">g</span>(n + <span class="number">1</span>);</span><br><span class="line">    std::vector&lt;<span class="type">int</span>&gt;<span class="built_in">ch</span>(q);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">2</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        <span class="type">int</span> u;</span><br><span class="line">        std::cin &gt;&gt; u;</span><br><span class="line">        g[u].<span class="built_in">push_back</span>(i);</span><br><span class="line">        g[i].<span class="built_in">push_back</span>(u);</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="function">std::vector&lt;<span class="type">int</span>&gt; <span class="title">dep</span><span class="params">(n + <span class="number">1</span>)</span></span>;</span><br><span class="line">    std::vector&lt;std::array&lt;<span class="type">int</span>, lg&gt;&gt; <span class="built_in">up</span>(n + <span class="number">1</span>);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        std::<span class="built_in">fill</span>(up[i].<span class="built_in">begin</span>(), up[i].<span class="built_in">end</span>(), <span class="number">-1</span>);</span><br><span class="line">    &#125;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">auto</span> dfs = [&amp;](<span class="keyword">auto</span> self, <span class="type">int</span> u, <span class="type">int</span> fa) -&gt; <span class="type">void</span> &#123;</span><br><span class="line">        up[u][<span class="number">0</span>] = fa;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt; lg; i++) &#123;</span><br><span class="line">            <span class="keyword">if</span> (up[u][i - <span class="number">1</span>] != <span class="number">-1</span>) &#123;</span><br><span class="line">                up[u][i] = up[up[u][i - <span class="number">1</span>]][i - <span class="number">1</span>];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> v : g[u]) &#123;</span><br><span class="line">            <span class="keyword">if</span> (v != fa) &#123;</span><br><span class="line">                dep[v] = dep[u] + <span class="number">1</span>;</span><br><span class="line">                <span class="built_in">self</span>(self, v, u);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;;</span><br><span class="line"> </span><br><span class="line">    <span class="built_in">dfs</span>(dfs, rt, <span class="number">-1</span>);</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">auto</span> lca = [&amp;](i64 u, i64 v) -&gt; <span class="type">int</span> &#123;</span><br><span class="line">        <span class="keyword">if</span> (dep[u] &lt; dep[v]) std::<span class="built_in">swap</span>(u, v);</span><br><span class="line">        i64 d = dep[u] - dep[v];</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; lg; i++) &#123;</span><br><span class="line">            <span class="keyword">if</span> (d &gt;&gt; i &amp; <span class="number">1</span>) u = up[u][i];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (u == v) <span class="keyword">return</span> u;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = lg - <span class="number">1</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line">            <span class="keyword">if</span> (up[u][i] != up[v][i]) &#123;</span><br><span class="line">                u = up[u][i];</span><br><span class="line">                v = up[v][i];</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> up[u][<span class="number">0</span>];</span><br><span class="line">    &#125;;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">auto</span> dist = [&amp;](i64 u, i64 v) -&gt; <span class="type">int</span> &#123;</span><br><span class="line">        i64 l = <span class="built_in">lca</span>(u, v);</span><br><span class="line">        <span class="keyword">return</span> dep[u] + dep[v] - <span class="number">2</span> * dep[l];</span><br><span class="line">    &#125;;</span><br><span class="line"> </span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">auto</span> &amp;i : ch) &#123;</span><br><span class="line">        std::cin &gt;&gt; i;</span><br><span class="line">    &#125;</span><br><span class="line">    i64 ans = <span class="built_in">dist</span>(<span class="number">1</span>, ch[<span class="number">0</span>]);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt; q; i++) &#123;</span><br><span class="line">        ans += <span class="built_in">dist</span>(ch[i - <span class="number">1</span>], ch[i]);</span><br><span class="line">    &#125;</span><br><span class="line">    std::cout &lt;&lt; ans &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="E-我们都是小怪兽-Rescue-Qfish"><a href="#E-我们都是小怪兽-Rescue-Qfish" class="headerlink" title="E. 我们都是小怪兽 (Rescue Qfish)"></a>E. 我们都是小怪兽 (Rescue Qfish)</h2><p>推导公式发现边权每 $4$ 步循环。利用分层图思想，将每个点按时刻拆为 $4$ 层，层间连边，跑 Dijkstra 最短路即可。提供建图的代码。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> (ll i = <span class="number">1</span>; i &lt;= m; i++) &#123;</span><br><span class="line">    cin &gt;&gt; u &gt;&gt; v &gt;&gt; w;</span><br><span class="line">    </span><br><span class="line">    ll w0 = w; <span class="comment">//第一层是L</span></span><br><span class="line">    ll w1 = (w - <span class="number">1</span>) * <span class="built_in">quickpow</span>(w + <span class="number">1</span>, md - <span class="number">2</span>, md) % md; <span class="comment">//第二层是(L-1)/(L+1)</span></span><br><span class="line">    ll w2 = -<span class="built_in">quickpow</span>(w, md - <span class="number">2</span>, md) % md;   <span class="comment">//第三层是(-1)/L</span></span><br><span class="line">    ll w3 = (w + <span class="number">1</span>) * <span class="built_in">quickpow</span>((<span class="number">1</span> - w + md) % md, md - <span class="number">2</span>, md) % md;<span class="comment">//第四层是(L+1)/(1-L) 每四次循环</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (w1 &lt; <span class="number">0</span>) w1 += md;</span><br><span class="line">    <span class="keyword">if</span> (w2 &lt; <span class="number">0</span>) w2 += md;</span><br><span class="line">    <span class="keyword">if</span> (w3 &lt; <span class="number">0</span>) w3 += md;</span><br><span class="line"></span><br><span class="line">    g[u].<span class="built_in">push_back</span>(&#123;w0, v + n&#125;);</span><br><span class="line">    g[v].<span class="built_in">push_back</span>(&#123;w0, u + n&#125;);</span><br><span class="line"></span><br><span class="line">    g[u + n].<span class="built_in">push_back</span>(&#123;w1, v + <span class="number">2</span> * n&#125;);</span><br><span class="line">    g[v + n].<span class="built_in">push_back</span>(&#123;w1, u + <span class="number">2</span> * n&#125;);</span><br><span class="line"></span><br><span class="line">    g[u + <span class="number">2</span> * n].<span class="built_in">push_back</span>(&#123;w2, v + <span class="number">3</span> * n&#125;);</span><br><span class="line">    g[v + <span class="number">2</span> * n].<span class="built_in">push_back</span>(&#123;w2, u + <span class="number">3</span> * n&#125;);</span><br><span class="line"></span><br><span class="line">    g[u + <span class="number">3</span> * n].<span class="built_in">push_back</span>(&#123;w3, v&#125;);</span><br><span class="line">    g[v + <span class="number">3</span> * n].<span class="built_in">push_back</span>(&#123;w3, u&#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="F-爱的魔力转圈圈——终极幸存者挑战赛"><a href="#F-爱的魔力转圈圈——终极幸存者挑战赛" class="headerlink" title="F. 爱的魔力转圈圈——终极幸存者挑战赛"></a>F. 爱的魔力转圈圈——终极幸存者挑战赛</h2><p>这是一道约瑟夫环问题，但是数据开小了遍历也能过，递推公式： $\mathcal{f(n, k)=f(n-1, k)+k}$</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    <span class="type">long</span> <span class="type">long</span> k;  </span><br><span class="line">    cin &gt;&gt; n &gt;&gt; k;</span><br><span class="line">    </span><br><span class="line">    <span class="type">long</span> <span class="type">long</span> res = <span class="number">0</span>;  <span class="comment">// f(1)=0（1个人时位置为0）</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">2</span>; i &lt;= n; ++i) &#123;</span><br><span class="line">        res = (res + k) % i;  <span class="comment">// 递推计算f(i)</span></span><br><span class="line">    &#125;</span><br><span class="line">    </span><br><span class="line">    cout &lt;&lt; res + <span class="number">1</span> &lt;&lt; endl;  <span class="comment">// 转换为1-based编号</span></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="G-探险者的补给路线"><a href="#G-探险者的补给路线" class="headerlink" title="G. 探险者的补给路线"></a>G. 探险者的补给路线</h2><p>直接根据题目意思写就行，$x, y$ 分别是 $a, b$ 的倍数。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">clearlove13</span><span class="params">(<span class="type">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    i64 a, b, x, y;</span><br><span class="line">    std::cin &gt;&gt; a &gt;&gt; b &gt;&gt; x &gt;&gt; y;</span><br><span class="line">    <span class="keyword">if</span> (x % a == <span class="number">0</span> &amp;&amp; y % b == <span class="number">0</span> &amp;&amp; x &gt;= <span class="number">0</span> &amp;&amp; y &gt;= <span class="number">0</span>) &#123;</span><br><span class="line">        std::cout &lt;&lt; <span class="string">&quot;YES\n&quot;</span>;</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">        std::cout &lt;&lt; <span class="string">&quot;NO\n&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="H-Qfish的法术"><a href="#H-Qfish的法术" class="headerlink" title="H. Qfish的法术"></a>H. Qfish的法术</h2><p>首先我们根据题意每次加2，可以知道区间和无论怎么操作奇偶性永远不会改变，由此延申我们进行分类讨论，如果区间长度是奇数的话，经过操作后的区间和直接贪心成偶数的目标去，因没有要求对操作后的值有具体要求，所以区间长度是奇数就一定可以，如果区间长度为偶数，但区间和为奇数，每次+2并不会改变奇偶性，所以无解。</p><p>值得注意的是，我们需要对长度为2的区间进行一个简单的特判，区间和直接用前缀和维护就行。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">clearlove13</span><span class="params">(<span class="type">void</span>)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="type">int</span> n, t;</span><br><span class="line">    std::cin &gt;&gt; n &gt;&gt; t;</span><br><span class="line">    std::vector&lt;i64&gt;<span class="built_in">a</span>(n + <span class="number">1</span>);</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">        std::cin &gt;&gt; a[i];</span><br><span class="line">        a[i] += a[i - <span class="number">1</span>];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> (t--) &#123;</span><br><span class="line">        <span class="type">int</span> l, r;</span><br><span class="line">        std::cin &gt;&gt; l &gt;&gt; r;</span><br><span class="line">        <span class="keyword">if</span> (r - l + <span class="number">1</span> == <span class="number">2</span> &amp;&amp; (a[r] != a[l - <span class="number">1</span>])) &#123;</span><br><span class="line">            std::cout &lt;&lt; <span class="string">&quot;NO\n&quot;</span>;</span><br><span class="line">            <span class="keyword">continue</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">if</span> (((r - l + <span class="number">1LL</span>) % <span class="number">2</span> == <span class="number">0</span>) &amp;&amp; ((a[r] - a[l - <span class="number">1</span>]) % <span class="number">2</span> == <span class="number">1</span>)) &#123;</span><br><span class="line">            std::cout &lt;&lt; <span class="string">&quot;NO\n&quot;</span>;</span><br><span class="line">        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">            std::cout &lt;&lt; <span class="string">&quot;YES\n&quot;</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="I-字母混淆"><a href="#I-字母混淆" class="headerlink" title="I. 字母混淆"></a>I. 字母混淆</h2><p>直接根据题目来模拟就行。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">void</span> <span class="title">solve</span><span class="params">()</span></span>&#123;</span><br><span class="line">    string s;</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    cin &gt;&gt; n &gt;&gt; s;</span><br><span class="line">    s = <span class="string">&quot; &quot;</span> + s;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; ++i)</span><br><span class="line">        cout &lt;&lt; (<span class="type">char</span>)((s[i] + <span class="number">32</span> - <span class="string">&#x27;a&#x27;</span> - <span class="number">2</span> + <span class="number">26</span>) % <span class="number">26</span> + <span class="string">&#x27;a&#x27;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="J-小s的杀戮尖塔"><a href="#J-小s的杀戮尖塔" class="headerlink" title="J. 小s的杀戮尖塔"></a>J. 小s的杀戮尖塔</h2><p>超级大模拟， 首先我们可以观察到，观者的血量不会超过1000，并且大鄂虫每行动3轮攻击力就会永久增加，而观者每轮理想情况下只能有15点格挡。所以计算可知游戏轮数一定不会超过60轮。因此可以使用三维 $dp$ 求解。$dp_{i, j, q}$，$i$ 代表第 $i$ 轮，$j$ 代表大鄂虫剩余 $j$ 滴血，$q$ 代表观者处于的姿态。记录的是观者剩余的血量。每次抽取 $5$ 张牌，用 dfs 记录所有会到达的状态。后面就是漫长的调试代码时间，总复杂度是 $\mathcal{O(60\times b \times  3 \times 5)}$。而且题目的伤害与大鄂虫的格挡实际上都是3的倍数，因此可以把伤害与血量 $\div 3$ 进行计算。实际上由于状态数远不会到达最高复杂度，因此代码可以通过。std 的耗时约 $150ms$。 一些容易导致 WA 的细节： </p><ul><li>第一轮的行动 $1$ 与后面轮次的行动 $1$ 不同。后面轮次的行动 $1$ 是有 $9$ 点护甲的，第一轮没有。 </li><li>最后 $1$ 轮观者战胜大鄂虫时，游戏立即结算，此时观者不会再受到伤害。 </li><li>把费用用完并不是最优解，例如手里是 $5$ 张暴怒，此时可能会选择一张都不打。 </li></ul><p>由于出题人的 std 过于臃肿，因此在这里放上能够通过对拍的 AI 代码。</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="type">long</span> <span class="type">long</span> ll;</span><br><span class="line"></span><br><span class="line">ll dp[<span class="number">2</span>][<span class="number">40400</span>][<span class="number">3</span>]; </span><br><span class="line">ll num[<span class="number">505050</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">MoveResult</span> &#123;</span><br><span class="line">    ll dmg;        <span class="comment">// 造成的伤害</span></span><br><span class="line">    ll self_blk;   <span class="comment">// 获得的格挡</span></span><br><span class="line">    ll end_stance; <span class="comment">// 结束姿态</span></span><br><span class="line">&#125;;</span><br><span class="line">vector&lt;MoveResult&gt; moves_cache[<span class="number">3</span>]; <span class="comment">// [起始姿态] -&gt; 结果列表</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    cin.<span class="built_in">tie</span>(<span class="number">0</span>); cout.<span class="built_in">tie</span>(<span class="number">0</span>); ios::<span class="built_in">sync_with_stdio</span>(<span class="number">0</span>);</span><br><span class="line">    ll t, a, b, n;</span><br><span class="line">    <span class="keyword">if</span>(!(cin &gt;&gt; t)) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">while</span>(t--)&#123;</span><br><span class="line">        cin &gt;&gt; a &gt;&gt; b &gt;&gt; n;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>; i&lt;=n; i++) cin &gt;&gt; num[i];</span><br><span class="line">        </span><br><span class="line">        <span class="comment">// 压缩敌方血量</span></span><br><span class="line">        ll max_b = (b - <span class="number">1</span>) / <span class="number">3</span> + <span class="number">1</span>;</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> x=<span class="number">0</span>; x&lt;=max_b; x++) </span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> s=<span class="number">0</span>; s&lt;<span class="number">3</span>; s++) dp[<span class="number">0</span>][x][s] = <span class="number">-1</span>;</span><br><span class="line">            </span><br><span class="line">        vector&lt;pair&lt;ll, ll&gt;&gt; q; <span class="comment">// 队列: &#123;敌方血量, 姿态&#125;</span></span><br><span class="line">        q.<span class="built_in">push_back</span>(&#123;max_b, <span class="number">0</span>&#125;);</span><br><span class="line">        dp[<span class="number">0</span>][max_b][<span class="number">0</span>] = a;</span><br><span class="line">        </span><br><span class="line">        ll ans = <span class="number">-1</span>;</span><br><span class="line">        ll turn = <span class="number">0</span>;</span><br><span class="line">        ll gong = <span class="number">0</span>; <span class="comment">// 力量</span></span><br><span class="line">        </span><br><span class="line">        <span class="keyword">while</span>(!q.<span class="built_in">empty</span>() &amp;&amp; turn &lt; <span class="number">60</span>) &#123;</span><br><span class="line">            ll cur = turn % <span class="number">2</span>;</span><br><span class="line">            ll nxt = (turn + <span class="number">1</span>) % <span class="number">2</span>;</span><br><span class="line">            turn++;</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 重置下一轮DP状态</span></span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> x=<span class="number">0</span>; x&lt;=max_b; x++)</span><br><span class="line">                <span class="keyword">for</span>(<span class="type">int</span> s=<span class="number">0</span>; s&lt;<span class="number">3</span>; s++) dp[nxt][x][s] = <span class="number">-1</span>;</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 1. 确定手牌</span></span><br><span class="line">            vector&lt;ll&gt; hand;</span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>; i&lt;<span class="number">5</span>; i++) &#123;</span><br><span class="line">                ll idx = ((turn - <span class="number">1</span>) * <span class="number">5</span> + i) % n + <span class="number">1</span>;</span><br><span class="line">                hand.<span class="built_in">push_back</span>(num[idx]);</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="built_in">sort</span>(hand.<span class="built_in">begin</span>(), hand.<span class="built_in">end</span>());</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 2. 预计算所有出牌结果</span></span><br><span class="line">            <span class="keyword">for</span>(<span class="type">int</span> s=<span class="number">0</span>; s&lt;<span class="number">3</span>; s++) moves_cache[s].<span class="built_in">clear</span>();</span><br><span class="line">            </span><br><span class="line">            <span class="keyword">do</span> &#123;</span><br><span class="line">                <span class="keyword">for</span>(<span class="type">int</span> start_s=<span class="number">0</span>; start_s&lt;<span class="number">3</span>; start_s++) &#123;</span><br><span class="line">                    ll c = <span class="number">3</span>, cur_s = start_s;</span><br><span class="line">                    ll raw_dmg = <span class="number">0</span>, self_blk = <span class="number">0</span>;</span><br><span class="line">                    </span><br><span class="line">                    <span class="comment">// 记录&quot;一张牌都不出&quot;也是一种可能</span></span><br><span class="line">                    moves_cache[start_s].<span class="built_in">push_back</span>(&#123;<span class="number">0</span>, <span class="number">0</span>, start_s&#125;);</span><br><span class="line">                    </span><br><span class="line">                    <span class="keyword">for</span>(ll card : hand) &#123;</span><br><span class="line">                        ll cost = (card &gt;= <span class="number">4</span>) ? <span class="number">2</span> : <span class="number">1</span>;</span><br><span class="line">                        <span class="keyword">if</span>(c &lt; cost) <span class="keyword">break</span>;</span><br><span class="line">                        c -= cost;</span><br><span class="line">                        </span><br><span class="line">                        <span class="comment">// 伤害计算</span></span><br><span class="line">                        ll d = <span class="number">0</span>;</span><br><span class="line">                        <span class="keyword">if</span>(card == <span class="number">1</span>) d = <span class="number">6</span>;</span><br><span class="line">                        <span class="keyword">else</span> <span class="keyword">if</span>(card == <span class="number">3</span> || card == <span class="number">4</span>) d = <span class="number">9</span>;</span><br><span class="line">                        <span class="keyword">if</span>(cur_s == <span class="number">1</span>) d *= <span class="number">2</span>; <span class="comment">// 愤怒翻倍</span></span><br><span class="line">                        raw_dmg += d;</span><br><span class="line">                        </span><br><span class="line">                        <span class="comment">// 格挡计算</span></span><br><span class="line">                        <span class="keyword">if</span>(card == <span class="number">2</span>) self_blk += <span class="number">5</span>;</span><br><span class="line">                        <span class="keyword">else</span> <span class="keyword">if</span>(card == <span class="number">5</span>) self_blk += <span class="number">8</span>;</span><br><span class="line">                        </span><br><span class="line">                        <span class="comment">// 姿态变更</span></span><br><span class="line">                        ll old_s = cur_s;</span><br><span class="line">                        <span class="keyword">if</span>(card == <span class="number">3</span>) cur_s = <span class="number">0</span>;</span><br><span class="line">                        <span class="keyword">else</span> <span class="keyword">if</span>(card == <span class="number">4</span>) cur_s = <span class="number">1</span>;</span><br><span class="line">                        <span class="keyword">else</span> <span class="keyword">if</span>(card == <span class="number">5</span>) cur_s = <span class="number">2</span>;</span><br><span class="line">                        <span class="keyword">if</span>(old_s == <span class="number">2</span> &amp;&amp; (card == <span class="number">3</span> || card == <span class="number">4</span>)) c += <span class="number">2</span>;</span><br><span class="line">                        </span><br><span class="line">                        <span class="comment">// 存入结果 (伤害/3, 格挡, 姿态)</span></span><br><span class="line">                        moves_cache[start_s].<span class="built_in">push_back</span>(&#123;raw_dmg / <span class="number">3</span>, self_blk, cur_s&#125;);</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">while</span>(<span class="built_in">next_permutation</span>(hand.<span class="built_in">begin</span>(), hand.<span class="built_in">end</span>()));</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 3. 大鄂虫属性计算</span></span><br><span class="line">            ll chong = (turn - <span class="number">1</span>) % <span class="number">3</span> + <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">if</span>(turn &gt; <span class="number">1</span> &amp;&amp; (turn - <span class="number">1</span>) % <span class="number">3</span> == <span class="number">0</span>) gong += <span class="number">5</span>; <span class="comment">// 每3回合加一次力量</span></span><br><span class="line">            </span><br><span class="line">            ll enemy_dmg = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">if</span>(chong == <span class="number">1</span>) enemy_dmg = <span class="number">12</span> + gong;</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span>(chong == <span class="number">2</span>) enemy_dmg = <span class="number">7</span> + gong;</span><br><span class="line">            </span><br><span class="line">            ll enemy_blk_reduce = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">if</span>(turn &gt; <span class="number">1</span>) &#123;</span><br><span class="line">                ll prev_act = (turn - <span class="number">2</span>) % <span class="number">3</span> + <span class="number">1</span>;</span><br><span class="line">                <span class="keyword">if</span>(prev_act == <span class="number">2</span>) enemy_blk_reduce = <span class="number">2</span>; <span class="comment">// 6/3</span></span><br><span class="line">                <span class="keyword">else</span> <span class="keyword">if</span>(prev_act == <span class="number">3</span>) enemy_blk_reduce = <span class="number">3</span>; <span class="comment">// 9/3</span></span><br><span class="line">            &#125;</span><br><span class="line">            </span><br><span class="line">            vector&lt;pair&lt;ll, ll&gt;&gt; next_q;</span><br><span class="line">            </span><br><span class="line">            <span class="comment">// 4. 状态转移</span></span><br><span class="line">            <span class="keyword">for</span>(<span class="keyword">auto</span> &amp;st : q) &#123;</span><br><span class="line">                ll e_hp = st.first;</span><br><span class="line">                ll p_stance = st.second;</span><br><span class="line">                ll p_hp = dp[cur][e_hp][p_stance];</span><br><span class="line">                </span><br><span class="line">                <span class="keyword">for</span>(<span class="keyword">auto</span> &amp;res : moves_cache[p_stance]) &#123;</span><br><span class="line">                    <span class="comment">// 计算实际对敌伤害</span></span><br><span class="line">                    ll dmg_dealt = <span class="built_in">max</span>(<span class="number">0LL</span>, res.dmg - enemy_blk_reduce);</span><br><span class="line">                    ll next_e_hp = e_hp - dmg_dealt;</span><br><span class="line">                    </span><br><span class="line">                    <span class="comment">// 击杀判定</span></span><br><span class="line">                    <span class="keyword">if</span>(next_e_hp &lt;= <span class="number">0</span>) &#123;</span><br><span class="line">                        ans = <span class="built_in">max</span>(ans, p_hp);</span><br><span class="line">                        <span class="keyword">continue</span>; <span class="comment">// 敌死，不入队</span></span><br><span class="line">                    &#125;</span><br><span class="line">                    </span><br><span class="line">                    <span class="comment">// 玩家承伤计算</span></span><br><span class="line">                    ll incoming = enemy_dmg;</span><br><span class="line">                    <span class="keyword">if</span>(res.end_stance == <span class="number">1</span>) incoming *= <span class="number">2</span>; <span class="comment">// 愤怒易伤</span></span><br><span class="line">                    ll take = <span class="built_in">max</span>(<span class="number">0LL</span>, incoming - res.self_blk);</span><br><span class="line">                    ll next_p_hp = p_hp - take;</span><br><span class="line">                    </span><br><span class="line">                    <span class="keyword">if</span>(next_p_hp &gt; <span class="number">0</span>) &#123;</span><br><span class="line">                        <span class="keyword">if</span>(dp[nxt][next_e_hp][res.end_stance] == <span class="number">-1</span>) &#123;</span><br><span class="line">                            next_q.<span class="built_in">push_back</span>(&#123;next_e_hp, res.end_stance&#125;);</span><br><span class="line">                            dp[nxt][next_e_hp][res.end_stance] = next_p_hp;</span><br><span class="line">                        &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                            dp[nxt][next_e_hp][res.end_stance] = <span class="built_in">max</span>(dp[nxt][next_e_hp][res.end_stance], next_p_hp);</span><br><span class="line">                        &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            q = next_q;</span><br><span class="line">        &#125;</span><br><span class="line">        cout &lt;&lt; ans &lt;&lt; <span class="string">&quot;\n&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;A-字符串&quot;&gt;&lt;a href=&quot;#A-字符串&quot; class=&quot;headerlink&quot; title=&quot;A. 字符串&quot;&gt;&lt;/a&gt;A. 字符串&lt;/h2&gt;&lt;p&gt;按照题意模拟即可，如果想要省掉代码量可以开个 &lt;code&gt;std::vector&amp;lt;std::pair&amp;lt</summary>
      
    
    
    
    <category term="信息学奥赛" scheme="https://blog.rusin.lol/categories/%E4%BF%A1%E6%81%AF%E5%AD%A6%E5%A5%A5%E8%B5%9B/"/>
    
    
    <category term="题解" scheme="https://blog.rusin.lol/tags/%E9%A2%98%E8%A7%A3/"/>
    
    <category term="比赛" scheme="https://blog.rusin.lol/tags/%E6%AF%94%E8%B5%9B/"/>
    
  </entry>
  
</feed>
