<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>House Tsumugi</title>
  
  <subtitle>A little planet among the sea of Internet</subtitle>
  <link href="http://blog.tsumugi.icu/atom.xml" rel="self"/>
  
  <link href="http://blog.tsumugi.icu/"/>
  <updated>2026-01-28T14:23:39.472Z</updated>
  <id>http://blog.tsumugi.icu/</id>
  
  <author>
    <name>co7ahang</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>题解：P11762 [IAMOI R1] 走亲访友</title>
    <link href="http://blog.tsumugi.icu/2025/11/27/solution-p11762/"/>
    <id>http://blog.tsumugi.icu/2025/11/27/solution-p11762/</id>
    <published>2025-11-27T11:44:00.000Z</published>
    <updated>2026-01-28T14:23:39.472Z</updated>
    
    <content type="html"><![CDATA[<h2 id="题意">题意</h2><p>给出一张 \( n \) 个点，\( m \) 条边的无向连通图，图中无自环、重边，初始位置为 \( s \)，每次沿边移动，移动后可以选择是否删除当前这条边。未删除的边可以多次移动，求构造 \( k \) 步移动内未删除边组成树的移动方案。</p><p>对于 \( 100 % \) 的数据，\( n \leq 10^3 \)，\( n - 1 \leq m \leq \frac{n(n - 1)}{2} \)，\( k \leq m + n \)。保证有解。</p><span id="more"></span><h2 id="Subtask-1、2-和-4">Subtask 1、2 和 4</h2><p>考虑先钦定一棵生成树，在树上移动并且删除剩下不在生成树上的边。容易发现遍历整棵树时，树上每条边最多经过 \( 2 \) 次，而对于每条多余的边，一去一回删除也最多经过 \( 2 \) 次，总移动步数最多为 \( 2m \) 次，又有 \( m \leq \frac{n(n - 1)}{2} \)，则移动步数严格小于 \( n^2 \)，可通过 Subtask 1、2 和 4。</p><h2 id="Subtask-3">Subtask 3</h2><p>\( m = n \)，基环树。判断出需要删掉的边，移动到此位置并删掉即可。移动步数严格小于 \( n \) 步。</p><p>其实用上面所述生成树的写法也可以。</p><h2 id="Subtask-5">Subtask 5</h2><p>前面的 Subtask 其实和正解没有特别强的相关性。注意到如果这张图是一张欧拉图，那么肯定有一个显然的解法：还是钦定一棵生成树，在跑欧拉路径的时候判断若为树边则保留，否则删去。这样的最大移动步数为 \( m \) 次。</p><p>于是考虑怎么把一张普通的图变成一张欧拉图。往图中加边，在 dfs 遍历生成树上节点的时候，判断该点度数是否为偶。若为奇则向父节点连边。可以证明最后会形成一个欧拉图。</p><p>对于增加的边，由于原先向父节点的连边为树边，所以保证这条边不会被删除。根节点不用向上连边，最多增加边数为 \( n - 1 \)，总移动次数严格小于 \( n + m \)。</p><p>实现细节上要注意在 dfs 遍历的同时不要加边。这是未定义行为。可能会导致 RE 或 WA。</p><div class="note info flat"><p><strong>如何证明“最后一定会形成一个欧拉图”？</strong></p><p>简单意会即可。欧拉图的总度数必为偶数，保证了根节点以下的度数均为偶，那么根节点的度数也必然为偶。</p></div><div class="note success flat"><p><strong>代码</strong></p><p>dfs 的时候可以直接生成树，我也不知道当时为什么写了个并查集。</p><pre><code class="language-cpp">#include &lt;iostream&gt;#include &lt;vector&gt;#include &lt;queue&gt;#include &lt;algorithm&gt;#include &lt;stack&gt;#include &lt;cstring&gt;#include &lt;cstdio&gt;using namespace std;using i64 = long long;using u64 = unsigned long long;using pii = pair&lt;int, int&gt;;#define FILENAME &quot;path&quot;const int N = 3e6 + 10;const i64 P = 1e9 + 7;struct node {int v, tag, ID;node() : v(0), tag(0), ID(0) {}node(int v, int tag, int ID) : v(v), tag(tag), ID(ID) {}};int n, m, k, s;int deg[N], fa[N], etag[N]; // etag：每条边对应的 tagvector &lt;node&gt; G[N];int rel[N], vis[N]; // rel：新建边对应的旧边编号int Find(int x) {return (x == fa[x]) ? x : fa[x] = Find(fa[x]);}// 构造欧拉图vector &lt;node&gt; V[N];void dfs1(int u, int f, int fid) {for(auto [v, tag, ID] : G[u]) {if(v == f) continue;if(tag == 1) dfs1(v, u, ID);}if((deg[u] &amp; 1) &amp;&amp; u != s) {m++;G[u].emplace_back(node(f, 2, m));V[f].emplace_back(node(u, 2, m)); // 不要在遍历时加边rel[m] = fid, etag[m] = 2, deg[u]++, deg[f]++;}return void();}// 无向图欧拉路径vector &lt;pii&gt; ans;int now[N];void dfs2(int u, int fid) {if(vis[fid]) return void();vis[fid] = 1;for(; now[u] &lt; G[u].size();) {auto [v, tag, ID] = G[u][now[u]++];dfs2(v, ID);}if(fid) ans.emplace_back(make_pair(fid, etag[fid]));return void();}void solve() {cin &gt;&gt; n &gt;&gt; m &gt;&gt; k &gt;&gt; s;int rm = m;for(int i = 1; i &lt;= n; i++) fa[i] = i;for(int i = 1; i &lt;= m; i++)  {int u, v; cin &gt;&gt; u &gt;&gt; v;int uu = Find(u), vv = Find(v);if(uu == vv) {etag[i] = 0;G[u].emplace_back(node(v, 0, i)); G[v].emplace_back(node(u, 0, i));} else {etag[i] = 1;G[u].emplace_back(node(v, 1, i)); G[v].emplace_back(node(u, 1, i));fa[uu] = vv;}deg[u]++, deg[v]++;}dfs1(s, s, 0);for(int i = 1; i &lt;= n; i++) {for(auto k : V[i]) G[i].push_back(k);}dfs2(s, 0);reverse(ans.begin(), ans.end());cout &lt;&lt; ans.size() &lt;&lt; '\n';for(auto [i, j] : ans) cout &lt;&lt; (i &gt; rm ? rel[i] : i) &lt;&lt; ' ' &lt;&lt; (j ? 1 : 0) &lt;&lt; '\n';return void();}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);#ifdef FILENAMEfreopen(FILENAME &quot;.in&quot;, &quot;r&quot;, stdin);freopen(FILENAME &quot;.out&quot;, &quot;w&quot;, stdout);#endifsolve();return 0;}</code></pre></div>]]></content>
    
    
    <summary type="html">&lt;h2 id=&quot;题意&quot;&gt;题意&lt;/h2&gt;
&lt;p&gt;给出一张 &#92;( n &#92;) 个点，&#92;( m &#92;) 条边的无向连通图，图中无自环、重边，初始位置为 &#92;( s &#92;)，每次沿边移动，移动后可以选择是否删除当前这条边。未删除的边可以多次移动，求构造 &#92;( k &#92;) 步移动内未删除边组成树的移动方案。&lt;/p&gt;
&lt;p&gt;对于 &#92;( 100 % &#92;) 的数据，&#92;( n &#92;leq 10^3 &#92;)，&#92;( n - 1 &#92;leq m &#92;leq &#92;frac{n(n - 1)}{2} &#92;)，&#92;( k &#92;leq m + n &#92;)。保证有解。&lt;/p&gt;</summary>
    
    
    
    <category term="OI" scheme="http://blog.tsumugi.icu/categories/OI/"/>
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/OI/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="OI" scheme="http://blog.tsumugi.icu/tags/OI/"/>
    
    <category term="题解" scheme="http://blog.tsumugi.icu/tags/%E9%A2%98%E8%A7%A3/"/>
    
    <category term="图论" scheme="http://blog.tsumugi.icu/tags/%E5%9B%BE%E8%AE%BA/"/>
    
    <category term="欧拉回路" scheme="http://blog.tsumugi.icu/tags/%E6%AC%A7%E6%8B%89%E5%9B%9E%E8%B7%AF/"/>
    
    <category term="构造" scheme="http://blog.tsumugi.icu/tags/%E6%9E%84%E9%80%A0/"/>
    
  </entry>
  
  <entry>
    <title>题解：P4809 [CCC 2018] 最大战略储备</title>
    <link href="http://blog.tsumugi.icu/2025/11/18/solution-p4089/"/>
    <id>http://blog.tsumugi.icu/2025/11/18/solution-p4089/</id>
    <published>2025-11-18T06:45:00.000Z</published>
    <updated>2026-01-28T14:27:35.020Z</updated>
    
    <content type="html"><![CDATA[<p>最小生成树，比 CSP-S 2025 T2 简单。（这个是可以说的吗）</p><span id="more"></span><h2 id="题意">题意</h2><p>给你 \( n \times m \) 个点，\( p \) 种横向边链接每对 \( (e, a_i) \) 和 \( (e, b_i) \)，\( q \) 种纵向边链接每对 \( (x_i, f) \) 和 \( (y_i, f) \)，求最小生成树权值。</p><p>暴力是 \( O(nm + np + mq + (p + q) \log (p + q)) \) 的按照题意模拟跑 MST，期望 59 pts。</p><h2 id="优化思路">优化思路</h2><p>考虑优化。假定存在一条横边（红色），我们将其建全后可以看为将两个纵列合并了起来（如图 1），此时当我们再尝试建纵边（绿色），对于已经合并了的列我们可以只建一条边（如图 2），此时其又会合并两个横排（如图 3）。对此我们发现每建一类边的操作相当于合并两个纵列或横排。</p><p><img src="https://cdn.luogu.com.cn/upload/image_hosting/i71hcx8m.png" alt=""></p><p>对于每一列和每一排考虑，再次假设建一条横边，所建的边数应该为合并后的排数（即横排数减去已建纵边数），纵边同理，再拿第二组样例举个例子如下（图 4）：</p><figure class="highlight text"><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">2 3 4 1</span><br><span class="line">-----</span><br><span class="line">2 3 5</span><br><span class="line">3 2 7</span><br><span class="line">1 2 6</span><br><span class="line">1 1 8</span><br><span class="line">------</span><br><span class="line">2 1 5</span><br></pre></td></tr></table></figure><p><img src="https://cdn.luogu.com.cn/upload/image_hosting/d70keepa.png" alt=""></p><p>按照这个思路，对横点和纵点一起跑一边最小生成树即可。复杂度 \( O(n + m + (p + q) \log (p + q)) \)。</p><div class="note info flat"><p><strong>代码</strong></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></pre></td><td class="code"><pre><span class="line">i64 n, m, p, q;</span><br><span class="line">i64 sum;</span><br><span class="line">i64 fa[N];</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">Find</span><span class="params">(<span class="type">int</span> u)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span>(fa[u] == u) <span class="keyword">return</span> fa[u];</span><br><span class="line">fa[u] = <span class="built_in">Find</span>(fa[u]); <span class="keyword">return</span> fa[u];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">edge</span> &#123;</span><br><span class="line">i64 u, v, w, fac; <span class="comment">// 0 = r / 1 = c</span></span><br><span class="line"><span class="type">bool</span> <span class="keyword">operator</span> &lt; (<span class="type">const</span> edge &amp;p) <span class="type">const</span> &#123;</span><br><span class="line"><span class="keyword">return</span> w &lt; p.w;</span><br><span class="line">&#125;</span><br><span class="line">&#125;;</span><br><span class="line">vector &lt;edge&gt; E;</span><br><span class="line"></span><br><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">cin &gt;&gt; n &gt;&gt; m &gt;&gt; p &gt;&gt; q;</span><br><span class="line"><span class="type">int</span> jud = <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;= p; i++) &#123;</span><br><span class="line">i64 u, v, w; cin &gt;&gt; u &gt;&gt; v &gt;&gt; w;</span><br><span class="line">sum += w * n, jud &amp;= (w == <span class="number">1</span>);</span><br><span class="line">E.<span class="built_in">push_back</span>(&#123;u, v, w, <span class="number">0</span>&#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;= q; i++) &#123;</span><br><span class="line">i64 u, v, w; cin &gt;&gt; u &gt;&gt; v &gt;&gt; w;</span><br><span class="line">sum += w * m, jud &amp;= (w == <span class="number">1</span>);</span><br><span class="line">E.<span class="built_in">push_back</span>(&#123;u, v, w, <span class="number">1</span>&#125;);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(jud) <span class="keyword">return</span> cout &lt;&lt; sum - (n * m - <span class="number">1</span>) &lt;&lt; <span class="string">&#x27;\n&#x27;</span>, <span class="built_in">void</span>(); <span class="comment">// w = 1</span></span><br><span class="line"></span><br><span class="line">i64 ans = <span class="number">0</span>, cntr = <span class="number">0</span>, cntc = <span class="number">0</span>;</span><br><span class="line"><span class="built_in">sort</span>(E.<span class="built_in">begin</span>(), E.<span class="built_in">end</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++) fa[i] = i;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> [u, v, w, f] : E) &#123;</span><br><span class="line"><span class="keyword">if</span>(!f) &#123;</span><br><span class="line"><span class="type">int</span> uu = <span class="built_in">Find</span>(u), vv = <span class="built_in">Find</span>(v);</span><br><span class="line"><span class="keyword">if</span>(uu != vv) fa[uu] = vv, ans += (n - cntc) * w, cntr++;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="type">int</span> uu = <span class="built_in">Find</span>(u + m + <span class="number">1</span>), vv = <span class="built_in">Find</span>(v + m + <span class="number">1</span>);</span><br><span class="line"><span class="keyword">if</span>(uu != vv) fa[uu] = vv, ans += (m - cntr) * w, cntc++;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//cout &lt;&lt; ans &lt;&lt; &#x27;\n&#x27;;</span></span><br><span class="line">cout &lt;&lt; sum - ans &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">void</span>();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></div>]]></content>
    
    
    <summary type="html">&lt;p&gt;最小生成树，比 CSP-S 2025 T2 简单。（这个是可以说的吗）&lt;/p&gt;</summary>
    
    
    
    <category term="OI" scheme="http://blog.tsumugi.icu/categories/OI/"/>
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/OI/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="OI" scheme="http://blog.tsumugi.icu/tags/OI/"/>
    
    <category term="题解" scheme="http://blog.tsumugi.icu/tags/%E9%A2%98%E8%A7%A3/"/>
    
    <category term="图论" scheme="http://blog.tsumugi.icu/tags/%E5%9B%BE%E8%AE%BA/"/>
    
    <category term="最小生成树" scheme="http://blog.tsumugi.icu/tags/%E6%9C%80%E5%B0%8F%E7%94%9F%E6%88%90%E6%A0%91/"/>
    
    <category term="贪心" scheme="http://blog.tsumugi.icu/tags/%E8%B4%AA%E5%BF%83/"/>
    
  </entry>
  
  <entry>
    <title>题解：P9676 [ICPC 2022 Jinan R] Skills</title>
    <link href="http://blog.tsumugi.icu/2025/10/13/solution-p9676/"/>
    <id>http://blog.tsumugi.icu/2025/10/13/solution-p9676/</id>
    <published>2025-10-13T02:31:00.000Z</published>
    <updated>2026-01-28T14:39:45.135Z</updated>
    
    <content type="html"><![CDATA[<p>考虑动态规划。</p><span id="more"></span><h2 id="转移方程">转移方程</h2><p>首先读题可以明确出一个性质：<strong>当一种技能被选择后，其熟练度在此后不会降为 \( 0 \)，否则一定有更优的取法。</strong> 这样就只需要无需考虑熟练度为负的状态。定义 dp 方程 \( f_{i, j, k, h} \) 表示第 \( i \) 天选择了第 \( h \) 个技能，剩余两个技能的未练习天数为 \( j \) 和 \( k \) 时的熟练度。使用 \( j, k = 0 \) 的情况来表示时候未选择这个技能的情况。由此可以得出转移方程如下：</p><ul><li>\( f_{i+1, nextj, nextk, h} \leftarrow \max(f_{i, j, k, h} + a_{i, h} - nextj - nextk) \) （选择当前技能的情况）</li><li>\( f_{i+1, nextk, 1, h + 1} \leftarrow \max(f_{i, j, k, h} + a_{i, h+1} - nextk - 1) \) （选择下一种技能的情况）</li><li>\( f_{i+1, 1, nextj, h+2} \leftarrow \max(f_{i, j, k, h} + a_{i, h+2} - nextj - 1) \) （选择下下种技能的情况）</li></ul><p>其中 \( nextj = j + (j \neq 0) \)，\( nextk \) 同理。在处理 \( h \) 的时候可以进行对 \( 3 \) 取模来用 \( {0, 1, 2} \) 表示三种技能。</p><h2 id="复杂度分析">复杂度分析</h2><p>这个 dp 的时间复杂度为 \( O(nm^2) \)，空间复杂度为 \( O(m^2) \)（显然可以用滚动数组滚掉第一维），其中 \( m \) 为未联系天数的值域。注意到在选择一个值 \( x \) 后，降到 \( 0 \) 的天数不超过 \( \sqrt{2x} \)，因此 \( m \leq \sqrt{\max a_{i, j}} \)。令 \( a \) 值域为 \( W \)，则 dp 时间复杂度为 \( O(nW) \)，空间复杂度 \( O(W) \)，可以通过此题。注意多测清空，以及滚动数组也要清空，因为这道题不能保证 \( f_{i, j, k, h} &gt; f_{i - 2, j, k, h} \)。全 \( 0 \) 的反例就可证明。</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="type">int</span> n, a[N][<span class="number">3</span>];</span><br><span class="line"><span class="type">int</span> f[M][M][<span class="number">3</span>], g[M][M][<span class="number">3</span>];</span><br><span class="line"><span class="type">int</span> mx, p;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">cpy</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt;= mx; i++) <span class="keyword">for</span>(<span class="type">int</span> j = <span class="number">0</span>; j &lt;= mx; j++) <span class="keyword">for</span>(<span class="type">int</span> k = <span class="number">0</span>; k &lt; <span class="number">3</span>; k++) g[i][j][k] = f[i][j][k], f[i][j][k] = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">void</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><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">cin &gt;&gt; n;</span><br><span class="line">p = <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="type">int</span> j = <span class="number">0</span>; j &lt; <span class="number">3</span>; j++) &#123;</span><br><span class="line">cin &gt;&gt; a[i][j];</span><br><span class="line">p = <span class="built_in">max</span>(p, a[i][j]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">mx = <span class="number">2</span> * <span class="built_in">sqrt</span>(p + <span class="number">1</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt;= mx; i++) <span class="keyword">for</span>(<span class="type">int</span> j = <span class="number">0</span>; j &lt;= mx; j++) <span class="keyword">for</span>(<span class="type">int</span> k = <span class="number">0</span>; k &lt; <span class="number">3</span>; k++) f[i][j][k] = g[i][j][k] = <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="type">int</span> j = <span class="number">0</span>; j &lt;= <span class="built_in">min</span>(mx, i); j++) <span class="keyword">for</span>(<span class="type">int</span> k = <span class="number">0</span>; k &lt;= <span class="built_in">min</span>(mx, i); k++) <span class="keyword">for</span>(<span class="type">int</span> h = <span class="number">0</span>; h &lt; <span class="number">3</span>; h++) &#123;</span><br><span class="line"><span class="type">int</span> nj = j + (j != <span class="number">0</span>), nk = k + (k != <span class="number">0</span>);</span><br><span class="line">f[nj][nk][h] = <span class="built_in">max</span>(g[j][k][h] + a[i][h] - nj - nk, f[nj][nk][h]);</span><br><span class="line">f[nk][<span class="number">1</span>][(h + <span class="number">1</span>) % <span class="number">3</span>] = <span class="built_in">max</span>(g[j][k][h] + a[i][(h + <span class="number">1</span>) % <span class="number">3</span>] - nk - <span class="number">1</span>, f[nk][<span class="number">1</span>][(h + <span class="number">1</span>) % <span class="number">3</span>]);</span><br><span class="line">f[<span class="number">1</span>][nj][(h + <span class="number">2</span>) % <span class="number">3</span>] = <span class="built_in">max</span>(g[j][k][h] + a[i][(h + <span class="number">2</span>) % <span class="number">3</span>] - nj - <span class="number">1</span>, f[<span class="number">1</span>][nj][(h + <span class="number">2</span>) % <span class="number">3</span>]);</span><br><span class="line">&#125;</span><br><span class="line">        <span class="built_in">cpy</span>();</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> res = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">0</span>; i &lt;= mx; i++) <span class="keyword">for</span>(<span class="type">int</span> j = <span class="number">0</span>; j &lt;= mx; j++) <span class="keyword">for</span>(<span class="type">int</span> k = <span class="number">0</span>; k &lt; <span class="number">3</span>; k++) res = <span class="built_in">max</span>(res, g[i][j][k]);</span><br><span class="line">cout &lt;&lt; res &lt;&lt; <span class="string">&#x27;\n&#x27;</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">void</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;/p&gt;</summary>
    
    
    
    <category term="OI" scheme="http://blog.tsumugi.icu/categories/OI/"/>
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/OI/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="OI" scheme="http://blog.tsumugi.icu/tags/OI/"/>
    
    <category term="题解" scheme="http://blog.tsumugi.icu/tags/%E9%A2%98%E8%A7%A3/"/>
    
    <category term="动态规划" scheme="http://blog.tsumugi.icu/tags/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92/"/>
    
    <category term="ICPC" scheme="http://blog.tsumugi.icu/tags/ICPC/"/>
    
  </entry>
  
  <entry>
    <title>Yorushika</title>
    <link href="http://blog.tsumugi.icu/2025/07/30/yorushika-article/"/>
    <id>http://blog.tsumugi.icu/2025/07/30/yorushika-article/</id>
    <published>2025-07-30T13:11:35.000Z</published>
    <updated>2025-08-03T02:31:12.844Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>あのね、空が青いのってどうやって伝えればいいんだろうね</p><p>夜の雲が高いのってどうすれば君もわかるんだろう</p></blockquote><blockquote><p>Y’know, how should I tell you that the sky is blue today?<br>What should I do to tell you<br>that the clouds are high in the night sky,<br>so that you would understand too?</p><p>——<em>Say It</em> 「言って」</p></blockquote><h2 id="About-Yorushika">About Yorushika</h2><p>Yorushika(ヨルシカ) is a Japanese rock duo founded in 2017, composed of N-buna, a vocaloid music producer(ボカロP), and Suis, a female vocalist. The name “Yorushika” is taken from a lyric in their song “The Clouds and the Ghost”; “yoru shika mō nemurezu ni” (夜しかもう眠れずに, meaning “I can only sleep at night”). The theme of Yorushika’s logo is a motif of two moons facing each other and also serves as a clock hand, portraying the time “from 6:00 to night”.</p><p>As a vocaloid producer, N-buna released his first vocaloid song “Alice Trust” (アリストラスト) in 2012, continuously gathering popularity on Niconico. What really made him famous is his 13th creation “Umiyuri Kanteitan” (ウミユリ海底譚), which gained over 11M views on Niconico and 30M on Youtube. His vocaloid songs conveyed a sense of summer to the audiences, which made us deeply immersed in the lively summer scenery painted by him. Though he believed that vocaloid has its strengths as the singing is uniquely emotionless, he also wanted to compose songs better expressed by human, and that’s why he gave up vocaloid and founded Yorushika with Suis.</p><p>Suis was a longtime fan of N-buna’s vocaloid work. N-buna reached out to her to form Yorushika as part of his effort to find a “more human” voice to use in his music, as opposed to vocaloid. Since then, the two have released three extended plays and three full albums, all of which charted on both the Oricon Albums Chartand the Billboard Japan Hot 100 Albums Chart. As of May 2023, their faces and detailed profiles have not been disclosed, as they want their fans to listen to their music without “preconceptions”.</p><h2 id="About-“Say-It”">About “Say It”</h2><p>My favorite song of Yorushika is “Say It”(言って), which is the third track in their debut extended play “Summer Grass”, released on June 28th, 2017. The track encapsulates themes of youth, memory, and the fleeting nature of life. At its heart, “Say It” reflects the emotional tension between the desire to articulate one’s thoughts and the difficulty of doing so. The narrator seems to look back on a significant moment—possibly tied to a relationship with a loved one or close friend—where they failed to fully express themselves. The title itself, “Say It”, serves as both a command and a lament: an urging to speak out and a subtle nod to the phrase “they passed away” (a possible interpretation of <em>itte</em> in Japanese, “逝って”), hinting at loss and missed opportunities.</p><p>Ultimately, “Say It” is both a call to action and a reflective lament. It urges listeners to express their feelings while they can, warning that life’s impermanence can turn unsaid words into lasting regrets. Whether it’s about a romantic connection, a friendship, or a personal truth, the song captures the emotional stakes of communication—or the lack thereof.</p><p>Like many of Yorushika’s works, “Say It” is open to interpretation, inviting listeners to find their own meaning in its layers. Its blend of catchy melodies and melancholic depth makes it a standout track that lingers long after the music fades.</p><p><img src="/image/photo_2025-07-30_21-07-00.jpg" alt=""></p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;あのね、空が青いのってどうやって伝えればいいんだろうね&lt;/p&gt;
&lt;p&gt;夜の雲が高いのってどうすれば君もわかるんだろう&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Y’know, how should I tell you t</summary>
      
    
    
    
    
    <category term="ヨルシカ" scheme="http://blog.tsumugi.icu/tags/%E3%83%A8%E3%83%AB%E3%82%B7%E3%82%AB/"/>
    
  </entry>
  
  <entry>
    <title>题解 CF413D</title>
    <link href="http://blog.tsumugi.icu/2025/07/30/solution-CF413D/"/>
    <id>http://blog.tsumugi.icu/2025/07/30/solution-CF413D/</id>
    <published>2025-07-30T12:45:05.000Z</published>
    <updated>2025-07-30T13:02:00.887Z</updated>
    
    <content type="html"><![CDATA[<p>机房同学借“理解题意”之名在模拟赛时打了很久的 2048。在此表示严厉谴责。</p><p>考虑怎么存储状态。进行模拟，每次入栈的元素可能为 \(2\) 或 \(4\)。</p><ul><li>如果入栈的元素为 \(2\) 的话，可以证明（模拟）能够一直合并。</li><li>但如果入栈元素为 \(4\) 的话且栈顶为 \(2\)，\(2\) 和其以前的元素就再也无法继续合并了。但如果栈顶不为 \(2\) 仍可以合并。</li></ul><p>因此我们只需要储存 <strong>最后一个可合并的单调递减序列</strong>。来看两个实例如下：</p><table><thead><tr><th style="text-align:center">128</th><th style="text-align:center">32</th><th style="text-align:center">8</th><th style="text-align:center">4</th><th style="text-align:center">2</th></tr></thead></table><ul><li>此时如果入栈为 \(2\)，最终合并结果为 \(\{ 128, 32, 16 \}\)。</li><li>此时如果入栈为 \(4\)，最终合并结果为 \(\{ 128, 32, 8, 4, 2, 4 \}\)，前面的部分已经不可合并，故只需存储 \(\{ 4 \}\)。</li></ul><table><thead><tr><th style="text-align:center">128</th><th style="text-align:center">32</th><th style="text-align:center">16</th><th style="text-align:center">8</th><th style="text-align:center">4</th></tr></thead></table><ul><li>此时如果入栈为 \(2\)，结果为 \(\{ 128, 32, 16, 8, 4, 2 \}\)，依旧可以合并。</li><li>此时如果入栈为 \(4\)，最终合并结果为 \(\{ 128, 64 \}\)。</li></ul><hr><p>由于是单减序列，又注意到 \(k \leq 11\)，可以想到用状压来存储。</p><p>定义状态：\( \text{dp}[i][s] \) 表示前 \(i\) 个元素，栈内状态为 \(s\) 的方案数。</p><ul><li>初始状态：\( \text{dp}[0][0] = 1 \)</li><li>状态转移略复杂，大致思路如下：<ul><li>插入 \(2\)：可以一直合并（单调序列加深）</li><li>插入 \(4\)：若栈顶为 \(2\) 则阻断，重新开始一个新段；否则也能继续合并</li></ul></li></ul><hr><h2 id="Code">Code</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">const</span> <span class="type">int</span> N = <span class="number">2e3</span> + <span class="number">10</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> P = <span class="number">1e9</span> + <span class="number">7</span>;</span><br><span class="line"><span class="type">int</span> n, m, k;</span><br><span class="line"><span class="type">int</span> val[N];</span><br><span class="line"><span class="type">int</span> dp[N][(<span class="number">1</span> &lt;&lt; <span class="number">11</span>) + <span class="number">1</span>];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int32_t</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">n = <span class="built_in">read</span>(), k = <span class="built_in">read</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++) val[i] = <span class="built_in">read</span>();</span><br><span class="line">dp[<span class="number">0</span>][<span class="number">0</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> i = <span class="number">0</span>; i &lt; n; i++) &#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j = <span class="number">0</span>; j &lt;= (<span class="number">1</span> &lt;&lt; k); j++) &#123;</span><br><span class="line"><span class="type">int</span> ni = i + <span class="number">1</span>, nj;</span><br><span class="line"><span class="keyword">if</span>(val[i] != <span class="number">4</span>) &#123;</span><br><span class="line"><span class="comment">// 插入 2</span></span><br><span class="line">nj = <span class="built_in">min</span>((<span class="type">int</span>)(<span class="number">1</span> &lt;&lt; k), j + <span class="number">2</span>);</span><br><span class="line">dp[ni][nj] = (dp[i][j] + dp[ni][nj]) % P;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(val[i] != <span class="number">2</span>) &#123;</span><br><span class="line"><span class="comment">// 插入 4</span></span><br><span class="line"><span class="keyword">if</span>(j == (<span class="number">1</span> &lt;&lt; k)) nj = j;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(j &amp; <span class="number">2</span>) nj = <span class="number">4</span>;</span><br><span class="line"><span class="keyword">else</span> nj = <span class="built_in">min</span>(j + <span class="number">4</span>, (<span class="type">int</span>)(<span class="number">1</span> &lt;&lt; k));</span><br><span class="line">dp[ni][nj] = (dp[i][j] + dp[ni][nj]) % P;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">write</span>(dp[n][(<span class="number">1</span> &lt;&lt; k)]);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// i love mike qwq</span></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">[通过记录](https:<span class="comment">//codeforces.com/contest/413/submission/316087620)</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;机房同学借“理解题意”之名在模拟赛时打了很久的 2048。在此表示严厉谴责。&lt;/p&gt;
&lt;p&gt;考虑怎么存储状态。进行模拟，每次入栈的元素可能为 &#92;(2&#92;) 或 &#92;(4&#92;)。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果入栈的元素为 &#92;(2&#92;) 的话，可以证明（模拟）能够一直合并。&lt;/li&gt;</summary>
      
    
    
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="Codeforces" scheme="http://blog.tsumugi.icu/tags/Codeforces/"/>
    
    <category term="DP" scheme="http://blog.tsumugi.icu/tags/DP/"/>
    
    <category term="状压DP" scheme="http://blog.tsumugi.icu/tags/%E7%8A%B6%E5%8E%8BDP/"/>
    
  </entry>
  
  <entry>
    <title>题解 CF2096B</title>
    <link href="http://blog.tsumugi.icu/2025/07/30/solution-CF2096B/"/>
    <id>http://blog.tsumugi.icu/2025/07/30/solution-CF2096B/</id>
    <published>2025-07-30T12:45:05.000Z</published>
    <updated>2025-07-30T12:53:34.663Z</updated>
    
    <content type="html"><![CDATA[<h1>题意</h1><p>给你 $n$ 种手套，第 $i$ 种手套有左手套 $l_i$ 只，右手套 $r_i$ 只。找到最小值 $x$ 使得选择任意 $x$ 只手套，总能保证有 $k$ 副不同的手套。</p><h1>思路</h1><p>数学题，贪心。</p><p>这道题需要使用<a href="https://oi-wiki.org/math/combinatorics/drawer-principle/">抽屉原理（鸽巢原理，the pigeonhole principle）</a>进行贪心。</p><blockquote><p>把多于 $n$ 个的物体放到 $n$ 个抽屉里，则至少有一个抽屉里的东西不少于两件。</p><p>证明（反证法）：如果每个抽屉至多只能放进一个物体，那么物体的总数至多是 $n$，而不是题设的 $n + k \ (k \geq 1)$，故不可能。</p></blockquote><p>如果每副手套左右各只有一只，答案为 $n + k$。此时的策略是先取每种手套的一只，然后取 $k$ 次另外一只。此时种类数为 $k$。</p><p>如果每副手套左右有若干只，考虑最差的情况，先取完每种手套的某一只手，再选取 $k$ 种手套取另外一只手。使用贪心法，先取每种手套较多的一只手，再降序排列取 $k - 1$ 种另一只手，最后再任意取 $1$ 只，此时种类数为 $k$。若 $(l_i, r_i)$ 按照 $\min(l_i, r_i)$ 降序排序，答案就是 $\sum_{i = 1}^n \max(l_i, r_i) + \sum_{i = 1}^{k - 1} \min(l_i, r_i) + 1$。</p><h1>代码</h1><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br></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="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unordered_map&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;map&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cstdint&gt;</span></span></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N = <span class="number">2e5</span> + <span class="number">10</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> P = <span class="number">1e9</span> + <span class="number">7</span>;</span><br><span class="line"><span class="meta">#<span class="keyword">define</span> int int64_t</span></span><br><span class="line"><span class="keyword">namespace</span> IO &#123;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">int</span> <span class="title">read</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="type">int</span> x = <span class="number">0</span>, f = <span class="number">1</span>; <span class="type">char</span> ch = <span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">while</span>(ch &gt; <span class="string">&#x27;9&#x27;</span> || ch &lt; <span class="string">&#x27;0&#x27;</span>) &#123;</span><br><span class="line"><span class="keyword">if</span>(ch == <span class="string">&#x27;-&#x27;</span>) f = <span class="number">-1</span>; </span><br><span class="line">ch = <span class="built_in">getchar</span>();</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">while</span>(ch &gt;= <span class="string">&#x27;0&#x27;</span> &amp;&amp; ch &lt;= <span class="string">&#x27;9&#x27;</span>) x = (x &lt;&lt; <span class="number">3</span>) + (x &lt;&lt; <span class="number">1</span>) + (ch - <span class="number">48</span>), ch = <span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">return</span> x * f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">write</span><span class="params">(<span class="type">int</span> x)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span>(x &lt; <span class="number">0</span>) &#123;</span><br><span class="line">x = -x;</span><br><span class="line"><span class="built_in">putchar</span>(<span class="string">&#x27;-&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(x &gt; <span class="number">9</span>) <span class="built_in">write</span>(x / <span class="number">10</span>);</span><br><span class="line"><span class="built_in">putchar</span>(x % <span class="number">10</span> + <span class="string">&#x27;0&#x27;</span>);</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">namespace</span> math &#123;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">qpow</span><span class="params">(<span class="type">int</span> a, <span class="type">int</span> x)</span></span>&#123;</span><br><span class="line"><span class="type">int</span> ans = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span>(x) &#123;</span><br><span class="line"><span class="keyword">if</span>(x &amp; <span class="number">1</span>) ans = ans % P * a % P;</span><br><span class="line">a = a * a % P;</span><br><span class="line">x &gt;&gt;= <span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">exgcd</span><span class="params">(<span class="type">int</span> a, <span class="type">int</span> b, <span class="type">int</span> &amp;x, <span class="type">int</span> &amp;y)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span>(b == <span class="number">0</span>) &#123;</span><br><span class="line">x = <span class="number">1</span>, y = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> a;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> d = <span class="built_in">exgcd</span>(b, a % b, x, y);</span><br><span class="line"><span class="type">int</span> xp = x;</span><br><span class="line">x = y;</span><br><span class="line">y = xp - a / b * y;</span><br><span class="line"><span class="keyword">return</span> d;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">using</span> IO::read, IO::write;</span><br><span class="line"><span class="keyword">using</span> math::qpow;</span><br><span class="line"><span class="type">int</span> n, k;</span><br><span class="line"><span class="type">int</span> l[N], r[N];</span><br><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"><span class="comment">//clear</span></span><br><span class="line"><span class="comment">//end clear</span></span><br><span class="line">n = <span class="built_in">read</span>(); k = <span class="built_in">read</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++) l[i] = <span class="built_in">read</span>();</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> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line">r[i] = <span class="built_in">read</span>();</span><br><span class="line"><span class="keyword">if</span>(l[i] &gt; r[i]) <span class="built_in">swap</span>(l[i], r[i]);</span><br><span class="line">ans += r[i];</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">sort</span>(l + <span class="number">1</span>, l + n + <span class="number">1</span>, greater &lt;<span class="type">int</span>&gt; ());</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt; k; i++) ans += l[i];</span><br><span class="line">ans++;</span><br><span class="line">cout &lt;&lt; ans &lt;&lt; <span class="string">&quot;\n&quot;</span>;</span><br><span class="line"><span class="keyword">return</span> <span class="built_in">void</span>(<span class="number">0</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int32_t</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="comment">//int T = read();</span></span><br><span class="line"><span class="type">int</span> T = <span class="built_in">read</span>();</span><br><span class="line"><span class="keyword">while</span>(T--) <span class="built_in">solve</span>();</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;<span class="comment">//qwq</span></span><br></pre></td></tr></table></figure><p>通过记录： <a href="https://codeforces.com/contest/2096/submission/319027880">https://codeforces.com/contest/2096/submission/319027880</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;题意&lt;/h1&gt;
&lt;p&gt;给你 $n$ 种手套，第 $i$ 种手套有左手套 $l_i$ 只，右手套 $r_i$ 只。找到最小值 $x$ 使得选择任意 $x$ 只手套，总能保证有 $k$ 副不同的手套。&lt;/p&gt;
&lt;h1&gt;思路&lt;/h1&gt;
&lt;p&gt;数学题，贪心。&lt;/p&gt;
&lt;p&gt;这道题</summary>
      
    
    
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="数学" scheme="http://blog.tsumugi.icu/tags/%E6%95%B0%E5%AD%A6/"/>
    
    <category term="Codeforces" scheme="http://blog.tsumugi.icu/tags/Codeforces/"/>
    
  </entry>
  
  <entry>
    <title>题解 CF466E Information Graph</title>
    <link href="http://blog.tsumugi.icu/2025/04/12/solution-CF466E/"/>
    <id>http://blog.tsumugi.icu/2025/04/12/solution-CF466E/</id>
    <published>2025-04-12T11:35:05.000Z</published>
    <updated>2025-04-12T11:35:55.764Z</updated>
    
    <content type="html"><![CDATA[<p>题目：CF466E<br><a href="https://www.luogu.com.cn/problem/CF466E">洛谷链接</a><br><a href="https://codeforces.com/problemset/problem/466/E">CF 链接</a></p><p>模拟赛把 T1 跳了来写这个（T3），离线思路很简单，比 T1 思维题好想。</p><p>首先，最终状态是若干颗上下级关系的树，所以我们可以将整个问题放在最后建好的树树上考虑。</p><p>对于操作一，将 $x$ 与 $y$ 连边即可。</p><p>对于操作二，可以用并查集优化复杂度快速找出当前的最高上司。</p><p>对于操作三，我们在每次操作二时把上下两个节点 $(u_p, u_d)$ 储存下来，判断节点 $x$ 是否在路径 $i$ 上可以使用最近公共祖先（LCA），若 $\text{LCA}(u_p, x) = u_p \land \text{LCA}(x, u_d) = x$，则 $x$ 在路径上，反之则不在。</p><p>需要注意的是，最终状态不一定是一棵树，可能有多棵树，在 LCA 初始化时要处理一下。</p><p>倍增写 LCA 的话时间复杂度为 $O(n \log n)$。</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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> dsu &#123;</span><br><span class="line"><span class="type">int</span> fa[N];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">init</span><span class="params">(<span class="type">int</span> n)</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;= n; i++) fa[i] = i;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">find</span><span class="params">(<span class="type">int</span> u)</span> </span>&#123;</span><br><span class="line"><span class="keyword">if</span>(fa[u] == u) <span class="keyword">return</span> u;</span><br><span class="line">fa[u] = <span class="built_in">find</span>(fa[u]);</span><br><span class="line"><span class="keyword">return</span> fa[u];</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">connect</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> v)</span> </span>&#123;</span><br><span class="line">fa[u] = v;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">typedef</span> pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt; pii;</span><br><span class="line"> </span><br><span class="line">vector &lt;<span class="type">int</span>&gt; G[N]; <span class="comment">// 存图</span></span><br><span class="line"><span class="type">int</span> n, m;</span><br><span class="line">vector &lt;pii&gt; ask; <span class="comment">// 离线询问</span></span><br><span class="line">pii cov[N]; <span class="comment">// 操作二区间存储</span></span><br><span class="line"><span class="type">int</span> tp = <span class="number">0</span>;</span><br><span class="line"><span class="type">int</span> root;</span><br><span class="line"><span class="type">int</span> st[N][<span class="number">20</span>];</span><br><span class="line"><span class="type">int</span> dep[N];</span><br><span class="line"><span class="type">bool</span> vis[N];</span><br><span class="line"> </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> f, <span class="type">int</span> d)</span> </span>&#123;</span><br><span class="line">vis[u] = <span class="number">1</span>;</span><br><span class="line">st[u][<span class="number">0</span>] = f;</span><br><span class="line">dep[u] = d;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt;= <span class="number">19</span>; i++) st[u][i] = st[ st[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="keyword">auto</span> v : G[u]) &#123;</span><br><span class="line"><span class="keyword">if</span>(v == f) <span class="keyword">continue</span>;</span><br><span class="line"><span class="built_in">dfs</span>(v, u, d + <span class="number">1</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">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>(dep[u] &lt; dep[v]) <span class="built_in">swap</span>(u, v);</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 = <span class="number">19</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line"><span class="keyword">if</span>(dep[st[u][i]] &gt;= dep[v]) u = st[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 = <span class="number">19</span>; i &gt;= <span class="number">0</span>; i--) &#123;</span><br><span class="line"><span class="keyword">if</span>(st[u][i] != st[v][i]) u = st[u][i], v = st[v][i];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> st[u][<span class="number">0</span>];</span><br><span class="line">&#125;</span><br><span class="line">vector &lt;<span class="type">int</span>&gt; rootl;</span><br><span class="line"> </span><br><span class="line"><span class="function"><span class="type">int32_t</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line">n = <span class="built_in">read</span>(), m = <span class="built_in">read</span>();</span><br><span class="line">dsu::<span class="built_in">init</span>(n);</span><br><span class="line"><span class="keyword">while</span>(m--) &#123;</span><br><span class="line"><span class="type">int</span> opt = <span class="built_in">read</span>();</span><br><span class="line"><span class="keyword">if</span>(opt == <span class="number">-1</span>) <span class="keyword">break</span>;</span><br><span class="line"><span class="keyword">if</span>(opt == <span class="number">1</span>) &#123;</span><br><span class="line"><span class="type">int</span> u = <span class="built_in">read</span>(), v = <span class="built_in">read</span>();</span><br><span class="line">dsu::<span class="built_in">connect</span>(u, 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">rootl.<span class="built_in">push_back</span>(v);</span><br><span class="line">&#125; <span class="keyword">else</span> <span class="keyword">if</span>(opt == <span class="number">2</span>) &#123;</span><br><span class="line"><span class="type">int</span> u = <span class="built_in">read</span>();</span><br><span class="line">cov[++tp] = &#123;u, dsu::<span class="built_in">find</span>(u)&#125;;</span><br><span class="line"><span class="comment">//cout &lt;&lt; &quot;Line: &quot; &lt;&lt; tp &lt;&lt;&quot; / &quot;&lt;&lt; u &lt;&lt; &quot; -&gt; &quot; &lt;&lt; dsu::find(u) &lt;&lt; endl;</span></span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="type">int</span> u = <span class="built_in">read</span>(), v = <span class="built_in">read</span>();</span><br><span class="line">ask.<span class="built_in">push_back</span>(&#123;u, v&#125;);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) &#123;</span><br><span class="line"><span class="type">int</span> root = dsu::<span class="built_in">find</span>(i);</span><br><span class="line"><span class="keyword">if</span>(!vis[root]) <span class="built_in">dfs</span>(root, root, <span class="number">1</span>);</span><br><span class="line">&#125;<span class="comment">//不止一棵树，有多个根节点要初始化 </span></span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> [x, i]:ask) &#123;</span><br><span class="line"><span class="type">int</span> upp = cov[i].second, udd = cov[i].first;</span><br><span class="line"><span class="keyword">if</span>(dsu::<span class="built_in">find</span>(x) != dsu::<span class="built_in">find</span>(upp)) cout &lt;&lt; <span class="string">&quot;NO&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(x == upp || x == udd) cout &lt;&lt; <span class="string">&quot;YES&quot;</span> &lt;&lt; endl;</span><br><span class="line"><span class="keyword">else</span> cout &lt;&lt; (<span class="built_in">lca</span>(upp, x) == upp &amp;&amp; <span class="built_in">lca</span>(udd, x) == x ? <span class="string">&quot;YES&quot;</span> : <span class="string">&quot;NO&quot;</span>) &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>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;题目：CF466E&lt;br&gt;
&lt;a href=&quot;https://www.luogu.com.cn/problem/CF466E&quot;&gt;洛谷链接&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://codeforces.com/problemset/problem/466/E&quot;&gt;CF</summary>
      
    
    
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="LCA" scheme="http://blog.tsumugi.icu/tags/LCA/"/>
    
    <category term="Codeforces" scheme="http://blog.tsumugi.icu/tags/Codeforces/"/>
    
    <category term="dsu" scheme="http://blog.tsumugi.icu/tags/dsu/"/>
    
  </entry>
  
  <entry>
    <title>题解 CF755D PolandBall and Polygon</title>
    <link href="http://blog.tsumugi.icu/2025/04/12/solution-CF755D/"/>
    <id>http://blog.tsumugi.icu/2025/04/12/solution-CF755D/</id>
    <published>2025-04-12T11:35:05.000Z</published>
    <updated>2025-04-12T11:37:05.146Z</updated>
    
    <content type="html"><![CDATA[<p>题目：CF755D<br><a href="https://www.luogu.com.cn/problem/CF755D">洛谷</a><br><a href="https://codeforces.com/problemset/problem/755/D">Codeforces</a></p><p>这是一道数据结构大水题。</p><p>打模拟赛的时候把这道题放到了 T4，做完 T1 就看这道题有思路就写出来了。</p><p>首先考虑如何暴力模拟计算答案，当每链接一条边 $(x, x + k)$ 时，被分割的区域数 $s$ 会增加 $u + 1$，其中 $u$ 是与这条边在正多边形中有交叉的线段数量。而题目保证边数（即点数）$n$ 与 $k$ 互质，说明在每一个点都被连接后才会回到初始节点，共链接 $n$ 条边。我们把每一次的连边存下来，在新的一次连边时判断有多少条边与此时的连边相交。暴力复杂度 $O(n^2)$，期望得分 $0$ 分。</p><p>考虑优化。时间复杂度的瓶颈是计算重复的边。想出了一个很奇怪的判断方法，用两颗树状数组储存每条边的左节点和右节点，由于 $k$ 是确认的，所以只用一个节点的位置就可以求出另一个节点。对于左节点与当前边 $(l, r)$ 相交时，统计左节点在区间 $[r - k + 1, r - 1]$ 的线段数量，右节点则统计 $[l + 1, l + k - 1]$。如果节点越界的话特判一下 $\pm n$ 即可。使用树状数组的话复杂度 $O(n \log n)$。</p><p>最开始要注意把 $k$ 赋值为 $\min(k, n - k)$，这两种情况是等效的，但是可以缩小一点范围防止越界。卡这个卡了很久。</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><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></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="meta">#<span class="keyword">include</span> <span class="string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> int 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="function"><span class="keyword">inline</span> <span class="type">int</span> <span class="title">read</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="type">int</span> x = <span class="number">0</span>, f = <span class="number">1</span>; <span class="type">char</span> ch = <span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">while</span>(ch &gt; <span class="string">&#x27;9&#x27;</span> || ch &lt; <span class="string">&#x27;0&#x27;</span>) &#123;</span><br><span class="line"><span class="keyword">if</span>(ch == <span class="string">&#x27;-&#x27;</span>) f = <span class="number">-1</span>; ch = <span class="built_in">getchar</span>();</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">while</span>(ch &gt;= <span class="string">&#x27;0&#x27;</span> &amp;&amp; ch &lt;= <span class="string">&#x27;9&#x27;</span>) x = (x &lt;&lt; <span class="number">3</span>) + (x &lt;&lt; <span class="number">1</span>) + (ch - <span class="number">48</span>), ch = <span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">return</span> x * f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N = <span class="number">2e6</span> + <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt; pii;</span><br><span class="line"><span class="type">int</span> n, k;</span><br><span class="line">priority_queue &lt;<span class="type">int</span>&gt; E[N];</span><br><span class="line">vector &lt;pii&gt; V;</span><br><span class="line"><span class="keyword">namespace</span> Tree &#123;</span><br><span class="line"><span class="type">int</span> vall[N], valr[N];</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">lowbit</span><span class="params">(<span class="type">int</span> x)</span> </span>&#123;</span><br><span class="line"><span class="keyword">return</span> x &amp; -x;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">queryl</span><span class="params">(<span class="type">int</span> x)</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">while</span>(x) &#123;</span><br><span class="line">ans += vall[x];</span><br><span class="line">x -= <span class="built_in">lowbit</span>(x);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">modifyl</span><span class="params">(<span class="type">int</span> x, <span class="type">int</span> y)</span> </span>&#123;</span><br><span class="line"><span class="keyword">while</span>(x &lt;= n) &#123;</span><br><span class="line">vall[x] += y;</span><br><span class="line">x += <span class="built_in">lowbit</span>(x);</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">queryr</span><span class="params">(<span class="type">int</span> x)</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">while</span>(x) &#123;</span><br><span class="line">ans += valr[x];</span><br><span class="line">x -= <span class="built_in">lowbit</span>(x);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">modifyr</span><span class="params">(<span class="type">int</span> x, <span class="type">int</span> y)</span> </span>&#123;</span><br><span class="line"><span class="keyword">while</span>(x &lt;= n) &#123;</span><br><span class="line">valr[x] += y;</span><br><span class="line">x += <span class="built_in">lowbit</span>(x);</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">void</span> <span class="title">solve</span><span class="params">()</span></span>;</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span> </span>&#123;</span><br><span class="line"><span class="type">int</span> T; T = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">while</span>(T--) <span class="built_in">solve</span>();</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="keyword">using</span> <span class="keyword">namespace</span> Tree;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">calc1</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r)</span> </span>&#123;</span><br><span class="line"><span class="comment">//[l, r] 闭区间</span></span><br><span class="line">    <span class="comment">//这里可能向左越界</span></span><br><span class="line"><span class="keyword">if</span>(l &gt;= <span class="number">1</span> &amp;&amp; r &lt;= n) <span class="keyword">return</span> <span class="built_in">queryl</span>(r) - <span class="built_in">queryl</span>(l - <span class="number">1</span>);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> <span class="built_in">queryl</span>(n) - <span class="built_in">queryl</span>(l - <span class="number">1</span> + n) + <span class="built_in">queryl</span>(r);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">calc2</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r)</span> </span>&#123;</span><br><span class="line">    <span class="comment">//这里可能向右越界</span></span><br><span class="line"><span class="keyword">if</span>(l &gt;= <span class="number">1</span> &amp;&amp; r &lt;= n) <span class="keyword">return</span> <span class="built_in">queryr</span>(r) - <span class="built_in">queryr</span>(l - <span class="number">1</span>);</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> <span class="built_in">queryr</span>(n) - <span class="built_in">queryr</span>(l - <span class="number">1</span>) + <span class="built_in">queryr</span>(r - n);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">SegmentJudge</span><span class="params">(<span class="type">int</span> l, <span class="type">int</span> r)</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">if</span>(l &gt; r) <span class="built_in">swap</span>(l, r);</span><br><span class="line">ans += <span class="built_in">calc1</span>(r - k + <span class="number">1</span>, r - <span class="number">1</span>);</span><br><span class="line">ans += <span class="built_in">calc2</span>(l + <span class="number">1</span>, l + k - <span class="number">1</span>);</span><br><span class="line"><span class="keyword">return</span> ans;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">solve</span><span class="params">()</span> </span>&#123;</span><br><span class="line">n = <span class="built_in">read</span>(), k = <span class="built_in">read</span>();</span><br><span class="line">k = <span class="built_in">min</span>(k, n - k);</span><br><span class="line"><span class="type">int</span> x = <span class="number">1</span>;</span><br><span class="line"><span class="type">int</span> ans = <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"><span class="type">int</span> y = (x + k &gt; n ? x + k - n: x + k);</span><br><span class="line"><span class="comment">// x -&gt; x + k</span></span><br><span class="line">ans += <span class="built_in">SegmentJudge</span>(x, y) + <span class="number">1</span>;</span><br><span class="line">cout &lt;&lt; ans &lt;&lt; <span class="string">&quot; &quot;</span>;</span><br><span class="line">Tree::<span class="built_in">modifyl</span>(x, <span class="number">1</span>);</span><br><span class="line">Tree::<span class="built_in">modifyr</span>(y, <span class="number">1</span>);</span><br><span class="line">x = y;</span><br><span class="line">&#125;</span><br><span class="line">cout &lt;&lt; endl;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;题目：CF755D&lt;br&gt;
&lt;a href=&quot;https://www.luogu.com.cn/problem/CF755D&quot;&gt;洛谷&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;https://codeforces.com/problemset/problem/755/D&quot;&gt;Code</summary>
      
    
    
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="Codeforces" scheme="http://blog.tsumugi.icu/tags/Codeforces/"/>
    
    <category term="数据结构" scheme="http://blog.tsumugi.icu/tags/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/"/>
    
    <category term="树状数组" scheme="http://blog.tsumugi.icu/tags/%E6%A0%91%E7%8A%B6%E6%95%B0%E7%BB%84/"/>
    
  </entry>
  
  <entry>
    <title>题解 P11838</title>
    <link href="http://blog.tsumugi.icu/2025/03/16/solution-p11838/"/>
    <id>http://blog.tsumugi.icu/2025/03/16/solution-p11838/</id>
    <published>2025-03-16T03:45:05.000Z</published>
    <updated>2025-03-22T13:46:24.041Z</updated>
    
    <content type="html"><![CDATA[<p>题目：<a href="https://www.luogu.com.cn/problem/P11838">P11838 [USACO25FEB] Printing Sequences B - 洛谷</a></p><p>赛场上很自然想到的是区间 DP。</p><p>定义 $dp[l][r]$ 为区间 $[l, r]$ 内最少使用 <code>PRINT</code> 语句的次数。考虑转移，在 $[l, r]$ 内枚举 $m$，若 $[l, r]$ 区间可以由 $[l, m]$ 循环得到，就把 $[l, m]$ 的答案转移给 $[l, r]$。如果不可以就把两个区间 $[l, m]$ 与 $[m+1,r]$ 答案相加。</p><p>转移方程如下：</p><p>$$<br>dp[l][r]=<br>\begin{cases}<br>dp[l][m]+dp[m+1][r] &amp; \text{任意情况} \<br>dp[l][p] &amp; [l, r] \text{可由若干个} [l, p] \text{循环得到}<br>\end{cases}<br>$$</p><p>常数不是很大，直接暴力循环判断是否满足即可。时间复杂度 $O(T \times n^4)$。</p><p>慢着，似乎哪里有问题？这个复杂度能过？</p><p>对于任意情况的转移是 $O(T \times n^3)$。把视线放到暴力判断那一块，不难发现，在枚举 $p$ 的时候并不用循环处理每一位，可以判断 $(p-l+1) \mid len$ 是否成立，若不成立则说明 $[l, r]$ 不可由若干个 $[l, p]$ 循环得到，直接跳出循环。$len$ 的约数个数肯定是严格小于 $2 \sqrt{len}$ 的（貌似高了许多），最简单的质数筛的写法就可以证明。这样看总复杂度（最坏）就是 $O(T \times n^3 \sqrt{n})$。循环判断不符合很快也会跳出循环。$10^2$ 绰绰有余（逃）</p><pre><code class="language-cpp">#include&lt;iostream&gt;#include&lt;cstdio&gt;#include&lt;string&gt;#include&lt;cstring&gt;#include&lt;algorithm&gt;#include&lt;vector&gt;#include&lt;stack&gt;#include&lt;map&gt;#define int long longusing namespace std;inline int read()&#123;    int x=0,f=1; char ch=getchar();    while(ch&lt;'0'||ch&gt;'9')&#123;if(ch=='-') f=-1; ch=getchar();&#125;    while(ch&gt;='0'&amp;&amp;ch&lt;='9') x=x*10+ch-'0',ch=getchar();    return x*f;&#125;void solve();void fac();signed main()&#123;    ios::sync_with_stdio(false);    int _=read();    while(_--) solve();    return 0;&#125;const int N=2e3+10;int n,K;int val[N];int dp[N][N];void solve()&#123;    memset(dp,0x3f,sizeof(dp));     n=read(),K=read();    for(int i=1;i&lt;=n;i++) val[i]=read();    for(int i=1;i&lt;=n;i++) dp[i][i]=1;    for(int len=2;len&lt;=n;len++)&#123;        for(int l=1;l&lt;=n;l++)&#123;            int r=l+len-1; if(r&gt;n) continue;            for(int m=l;m&lt;r;m++)&#123;                dp[l][r]=min(dp[l][r],dp[l][m]+dp[m+1][r]);            &#125;            for(int p=1;p&lt;=len;p++)&#123;                if(len%p!=0) continue;                bool rr=true;                for(int pos=l;pos&lt;=r;pos++) if(val[pos]!=val[l+(pos-l)%p])&#123;                    rr=false; break;                &#125;                if(rr) dp[l][r]=min(dp[l][r],dp[l][l+p-1]);            &#125;        &#125;    &#125;    cout&lt;&lt;((dp[1][n]&lt;=K)?&quot;YES&quot;:&quot;NO&quot;)&lt;&lt;&quot;\n&quot;;    return;&#125;</code></pre>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;题目：&lt;a href=&quot;https://www.luogu.com.cn/problem/P11838&quot;&gt;P11838 [USACO25FEB] Printing Sequences B - 洛谷&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;赛场上很自然想到的是区间 DP。&lt;/p&gt;
&lt;p&gt;定义 </summary>
      
    
    
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="洛谷" scheme="http://blog.tsumugi.icu/tags/%E6%B4%9B%E8%B0%B7/"/>
    
    <category term="算法" scheme="http://blog.tsumugi.icu/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="DP" scheme="http://blog.tsumugi.icu/tags/DP/"/>
    
    <category term="USACO" scheme="http://blog.tsumugi.icu/tags/USACO/"/>
    
  </entry>
  
  <entry>
    <title>组合数学笔记</title>
    <link href="http://blog.tsumugi.icu/2025/02/15/combination-math/"/>
    <id>http://blog.tsumugi.icu/2025/02/15/combination-math/</id>
    <published>2025-02-15T12:01:47.000Z</published>
    <updated>2025-02-15T12:07:18.161Z</updated>
    
    <content type="html"><![CDATA[<p>等填坑。</p><h2 id="二项式定理">二项式定理</h2><p>定理：</p><p>$$ (a+b)^{n} = \sum_{i=0}^{n} C_{n}^{i} a^{i} b^{n-i} $$</p><p>当 $b=1$ 时：</p><p>$$ (a+1)^n = \sum_{i=0}^{n} C_{n}^{i} a^{i} $$</p><h2 id="二项式反演">二项式反演</h2><p>定理：</p><p>$$f(i)=\sum_{j=i}^{n}(-1)^{j-i}C_{j}^{i} g(j) $$</p><p>$$ g(i)=\sum^{n}<em>{j=i}C^{i}</em>{j} f(j) $$</p><p>证明：</p><p>$$ \sum_{j=i}^{n} (-1)^{j-i} C_{j}^{i} g(j) = \sum_{j=i}^{n} (-1)^{j-i} C_{j}^{i} \sum^{n}<em>{k=j} C^{j}</em>{k} f(k) = \sum_{k=i}^{n} f(k) \sum_{j=i}^{k} C^j_k \times C^i_j \times (-1)^{(j-i)} $$</p><p>上述等式中求和保证 $i \leq j \leq k \leq n$ 。</p><p>令 $\sum_{k=i}^{n}f(k)$ 右侧的系数为 $a$ ，即 $a=\sum_{j=i}^{k} C^j_k \times C^i_j \times (-1)^{(j-i)}$ 。</p><ul><li><p>当 $k=i$ 时，$a=1$ 。</p></li><li><p>当 $k \neq i$ 时，$a=0$ 。</p></li></ul><p>此时，$原式 = f(i)$ ，证毕。</p><h2 id="费马小定理">费马小定理</h2><p>定理：</p><p>$$ 1 \equiv a^{p-1} \mod p $$</p><p>等价于（逆元）：</p><p>$$\frac{1}{a} \equiv a^{p-2} \mod p$$</p><p>证明：</p><p>令 $S={1,2,\cdots,p-1 }$ ，$T={a,2a,\cdots,(p-1)a}$ 。</p><p>反证法可证 $S$ 和 $T$ 为同一排列。</p><p>$$\prod_{i=1}^{p-1} i \equiv \prod_{i=1}^{p-1}i \times a \mod p$$</p><p>$$1 \equiv a^{p-1} \mod p$$</p><p>证毕。</p><h2 id="卡特兰数">卡特兰数</h2><h2 id="拓展欧几里得">拓展欧几里得</h2><h2 id="组合数模板">组合数模板</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></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> comb&#123;</span><br><span class="line"><span class="comment">//const int P=mod;</span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">qpow</span><span class="params">(<span class="type">int</span> a,<span class="type">int</span> x)</span></span>&#123;</span><br><span class="line"><span class="keyword">if</span>(x==<span class="number">0</span>) <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"><span class="type">int</span> res=<span class="built_in">qpow</span>(a,x&gt;&gt;<span class="number">1</span>)%P;</span><br><span class="line"><span class="keyword">if</span>(x%<span class="number">2</span>) <span class="keyword">return</span> res*res%P*a%P;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">return</span> res*res%P;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> maxn=<span class="number">1e3</span><span class="number">+10</span>; <span class="comment">// 模数以下</span></span><br><span class="line"><span class="type">int</span> inv[maxn],fac[maxn]; </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"><span class="comment">//阶乘</span></span><br><span class="line">fac[<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">1</span>;i&lt;maxn;i++) fac[i]=fac[i<span class="number">-1</span>]*i%P;</span><br><span class="line"><span class="comment">//逆元（线性</span></span><br><span class="line">inv[maxn<span class="number">-1</span>]=<span class="built_in">qpow</span>(fac[maxn<span class="number">-1</span>],P<span class="number">-2</span>);</span><br><span class="line"><span class="comment">//cout&lt;&lt;fac[1000000]&lt;&lt;&quot; &quot;&lt;&lt;P&lt;&lt;endl;</span></span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=maxn<span class="number">-2</span>;i&gt;=<span class="number">0</span>;i--) inv[i]=inv[i<span class="number">+1</span>]*(i<span class="number">+1</span>)%P;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">C</span><span class="params">(<span class="type">int</span> n,<span class="type">int</span> m)</span></span>&#123; <span class="comment">//$C _&#123;n&#125; ^&#123;m&#125;$</span></span><br><span class="line"><span class="keyword">if</span>(m&gt;n||m&lt;<span class="number">0</span>) <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"><span class="keyword">return</span> fac[n]*inv[m]%P*inv[n-m]%P;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;等填坑。&lt;/p&gt;
&lt;h2 id=&quot;二项式定理&quot;&gt;二项式定理&lt;/h2&gt;
&lt;p&gt;定理：&lt;/p&gt;
&lt;p&gt;$$ (a+b)^{n} = &#92;sum_{i=0}^{n} C_{n}^{i} a^{i} b^{n-i} $$&lt;/p&gt;
&lt;p&gt;当 $b=1$ 时：&lt;/p&gt;
&lt;p&gt;$$ (a+</summary>
      
    
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="数学" scheme="http://blog.tsumugi.icu/tags/%E6%95%B0%E5%AD%A6/"/>
    
    <category term="组合数学" scheme="http://blog.tsumugi.icu/tags/%E7%BB%84%E5%90%88%E6%95%B0%E5%AD%A6/"/>
    
  </entry>
  
  <entry>
    <title>2025/2/9~10 集训 DP IV &amp; V</title>
    <link href="http://blog.tsumugi.icu/2025/02/10/2025-2-9-10/"/>
    <id>http://blog.tsumugi.icu/2025/02/10/2025-2-9-10/</id>
    <published>2025-02-10T15:28:24.000Z</published>
    <updated>2025-02-10T16:23:48.753Z</updated>
    
    <content type="html"><![CDATA[<p>昨天没写，今天一起补上。</p><p><a href="https://www.luogu.com.cn/training/705788#problems">寒假集训（动态规划四）补 - 题单 - 洛谷 | 计算机科学教育新生态</a></p><p><a href="https://www.luogu.com.cn/training/706548#problems">寒假集训（动态规划五）补 - 题单 - 洛谷 | 计算机科学教育新生态</a></p><h1>D4T1 #(subset sum = K) with Add and Erase/背包の撤销</h1><h2 id="题面">题面</h2><p>原题面 <a href="https://www.luogu.com.cn/problem/AT_abc321_f">ABC321F</a></p><h2 id="题意">题意</h2><p>$Q$ 次询问，每次加入或取出一个物品，求此时维护出价值 $K$ 的方案数。</p><h2 id="思路">思路</h2><p>用 $dp[j]$ 表示前 $i$ 次操作后凑出 $j$ 的方案数，有 $dp[j]`=dp[j]+dp[j-x]$ ，可推出柿子。</p><h2 id="代码">代码</h2><p><a href="https://atcoder.jp/contests/abc321/submissions/62645136">Submission #62645136</a></p><h1>D4T2 Infected Tree/简单染色问题</h1><h2 id="题面-2">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/1689/C">CF1689C</a></p><h2 id="题意-2">题意</h2><p>给一棵树，节点有点权，一个节点的价值为包含该节点的连通块的权值之和的最大值。求每个节点的价值？</p><h2 id="思路-2">思路</h2><h3 id="定义">定义</h3><blockquote><p>$siz[u]$ 表示以 $1$ 为根节点时，子树 $u$ 的大小</p><p>$f[u]$ 表示表示以 $1$ 为根节点时，子树 $u$ 中所有节点 $siz$ 之和</p><p>$g[u]$ 表示以 $u$ 节点为根是，所有节点的子树的 $siz$ 之和</p><p>换根 DP 老套路：$g[1]=f[1]$</p></blockquote><h3 id="状态转移">状态转移</h3><p>$siz[u]=1+\sum_{v \in son(u)}siz[v]$</p><p>$f[u]=siz[u]+\sum_{v \in son(u)}f[u]$</p><p>$g[v]=g[u]+n-siz[v] \times 2$</p><h2 id="代码-2">代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> n;</span><br><span class="line">vector &lt;<span class="type">int</span>&gt; G[N];</span><br><span class="line"><span class="type">int</span> siz[N],f[N],g[N];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs1</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line">        <span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">        <span class="built_in">dfs1</span>(v,u);</span><br><span class="line">        siz[u]+=siz[v];</span><br><span class="line">    &#125;</span><br><span class="line">    siz[u]+=<span class="number">1</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs2</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line">    f[u]=siz[u];</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line">        <span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">        <span class="built_in">dfs2</span>(v,u);</span><br><span class="line">        f[u]+=f[v];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs3</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line">        <span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">        g[v]=g[u]+n-siz[v]*<span class="number">2</span>;</span><br><span class="line">        <span class="built_in">dfs3</span>(v,u);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    n=<span class="built_in">read</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="type">int</span> u=<span class="built_in">read</span>(),v=<span class="built_in">read</span>();</span><br><span class="line">        G[u].<span class="built_in">push_back</span>(v); 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">dfs1</span>(<span class="number">1</span>,<span class="number">1</span>);</span><br><span class="line">    <span class="built_in">dfs2</span>(<span class="number">1</span>,<span class="number">1</span>);</span><br><span class="line">    g[<span class="number">1</span>]=f[<span class="number">1</span>];</span><br><span class="line">    <span class="built_in">dfs3</span>(<span class="number">1</span>,<span class="number">1</span>);</span><br><span class="line">    <span class="type">int</span> res=<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++) res=<span class="built_in">max</span>(res,g[i]);</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><h1>D4T3 Select Edges/切边</h1><h2 id="题面-3">题面</h2><p>原题面 <a href="https://atcoder.jp/contests/abc259/tasks/abc259_f">ABC259F</a></p><h2 id="题意-3">题意</h2><p>给一棵有权树，节点 $i$ 最多保留 $d_i$ 条邻边，求保留边权之和最大值。</p><h2 id="思路-3">思路</h2><p>$dp[u][0/1]$ 代表 $u$ 子树中的边确定后的方案中 <strong>不能/还能</strong> 与父节点链接的最优解。</p><table><thead><tr><th>$dp[v][0]$</th><th>$a_1$</th><th>$a_2$</th><th>$…$</th><th>$a_n$</th></tr></thead><tbody><tr><td>$dp[v][1] + w$</td><td>$b_1$</td><td>$b_2$</td><td>$…$</td><td>$b_n$</td></tr></tbody></table><p>$dp[u][0]$ → 在上表中选 $d_u$ 个 $dp[v][1] + w$ 。</p><p>$dp[u][1]$ → 在上表中选 $d_u-1$ 个 $dp[v][1] + w$ 。</p><p>选择方法：假设全选 $dp[v][0]$ ，对两个选项作差，选或不选，pq 维护。实际上用了 sort。</p><h2 id="代码-3">代码</h2><p><a href="https://atcoder.jp/contests/abc259/submissions/62594792">Submission #62594792 </a></p><h1>D4T4 Pac-Takahashi/限时寻糖</h1><h2 id="题面-4">题面</h2><p>原题面 <a href="https://atcoder.jp/contests/abc301/tasks/abc301_e">ABC301E</a></p><h2 id="题意-4">题意</h2><p>给一张图，图中有起点 $S$ ，终点 $G$ ，糖果 $o$（不超过 $18$ 个）。给定时间 $T$ ，求最多能捡多少个糖果。</p><h2 id="思路-4">思路</h2><p>先 BFS 确定每个点之间距离，然后状压 DP。</p><h2 id="代码-4">代码</h2><p><a href="https://atcoder.jp/contests/abc301/submissions/62597421">Submission #62597421</a> 心态炸了，BFS 用 AI 修出来的，感谢 Logic。</p><h1>D5T1 Round Subset/最多の零度</h1><h2 id="题面-5">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/837/D">CF837D</a></p><h2 id="题意-5">题意</h2><p>$n$ 个数，取 $k$ 个数相乘，求末尾 $0$ 个数最大值。</p><h2 id="思路-5">思路</h2><p>将每个数 $a_i$ 分解因数，分别计算由几个 $2$ 和几个 $5$ 相乘得到，作为权值 DP，答案取两数中的最小值。</p><p>发现自己卡过了，好离谱的数据。</p><h2 id="代码-5">代码</h2><p>因为是卡过的所以不想放，CF 上过不了（</p><h1>D5T2 Infected Tree/保护计划</h1><h2 id="题面-6">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/1689/C">CF1689C</a></p><h2 id="题意-6">题意</h2><p>给一棵二叉树，根节点被感染，每秒扩散一步。每秒之前可以选择一个未感染的点切除，最多保护多少节点？</p><h2 id="思路-6">思路</h2><p>典型的树形 DP。注意到是二叉树，差点眼瞎。</p><h2 id="代码-6">代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> n;</span><br><span class="line">vector &lt;<span class="type">int</span>&gt; G[N];</span><br><span class="line"><span class="type">int</span> dep[N]; <span class="comment">//深度</span></span><br><span class="line"><span class="type">int</span> siz[N]; <span class="comment">//子树大小</span></span><br><span class="line"><span class="type">int</span> dp[N]; </span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs1</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line">dep[u]=dep[fa]<span class="number">+1</span>;</span><br><span class="line">siz[u]=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line"><span class="built_in">dfs1</span>(v,u);</span><br><span class="line">siz[u]+=siz[v];</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">cmp</span><span class="params">(<span class="type">const</span> <span class="type">int</span> &amp;x,<span class="type">const</span> <span class="type">int</span> &amp;y)</span></span>&#123;<span class="keyword">return</span> x&gt;y;&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs2</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line"><span class="type">int</span> s=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line"><span class="built_in">dfs2</span>(v,u);</span><br><span class="line">s+=dp[v];</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">dp[u]=<span class="built_in">max</span>(dp[u],s-dp[v]+siz[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">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">n=<span class="built_in">read</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="type">int</span> u=<span class="built_in">read</span>(),v=<span class="built_in">read</span>();</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">dep[<span class="number">0</span>]=<span class="number">0</span>; <span class="built_in">dfs1</span>(<span class="number">1</span>,<span class="number">0</span>);</span><br><span class="line"><span class="built_in">dfs2</span>(<span class="number">1</span>,<span class="number">0</span>);</span><br><span class="line">cout&lt;&lt;dp[<span class="number">1</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></pre></td></tr></table></figure><h1>D5T3 编辑距离</h1><p>能不能原谅我我真的没修出来qwq <a href="https://www.luogu.com.cn/problem/U527240">Luogu</a> $60/100$</p><h1>D5T4 Tree Painting/染色方案</h1><h2 id="题面-7">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/1187/E">CF1187E</a></p><h2 id="题意-7">题意</h2><p>给一棵树，需要给边染色，要求所有节点到根节点路径上最多只有一条染色边。求所有节点作为根节点时的染色染色方案。</p><h2 id="思路-7">思路</h2><p>换根 DP。</p><h2 id="代码-7">代码</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="function"><span class="type">void</span> <span class="title">dfs1</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span> </span>&#123;</span><br><span class="line">    <span class="type">int</span> tmp=<span class="number">1</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line">        <span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">        <span class="built_in">dfs1</span>(v,u);</span><br><span class="line">        tmp=(tmp*(f[v]<span class="number">+1</span>))%P;</span><br><span class="line">    &#125;</span><br><span class="line">    f[u]=tmp;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs2</span><span class="params">(<span class="type">int</span> u, <span class="type">int</span> fa)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">h[v]=(h[u]<span class="number">+1</span>)%P;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> tmp=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">h[v]=(h[v]*tmp)%P;</span><br><span class="line">tmp=(tmp*(f[v]<span class="number">+1</span>))%P;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">reverse</span>(G[u].<span class="built_in">begin</span>(),G[u].<span class="built_in">end</span>());</span><br><span class="line">tmp=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">h[v]=(h[v]*tmp)%P;</span><br><span class="line">tmp=(tmp*(f[v]<span class="number">+1</span>))%P;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">g[v]=((h[v]<span class="number">+1</span>)*f[v])%P;</span><br><span class="line"><span class="built_in">dfs2</span>(v,u);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"> </span><br></pre></td></tr></table></figure><p>睡觉。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;昨天没写，今天一起补上。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.luogu.com.cn/training/705788#problems&quot;&gt;寒假集训（动态规划四）补 - 题单 - 洛谷 | 计算机科学教育新生态&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;h</summary>
      
    
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="dp" scheme="http://blog.tsumugi.icu/tags/dp/"/>
    
    <category term="集训" scheme="http://blog.tsumugi.icu/tags/%E9%9B%86%E8%AE%AD/"/>
    
  </entry>
  
  <entry>
    <title>2025/2/8 集训 DP III</title>
    <link href="http://blog.tsumugi.icu/2025/02/08/2025-2-8/"/>
    <id>http://blog.tsumugi.icu/2025/02/08/2025-2-8/</id>
    <published>2025-02-08T13:06:08.000Z</published>
    <updated>2025-02-10T15:31:28.775Z</updated>
    
    <content type="html"><![CDATA[<p>在听这个，很上头。</p><p>今天挺逆天，就树的那道题有 $60$ 分qwq，写不下去了。</p><iframe src="//player.bilibili.com/player.html?isOutside=true&aid=330820835&bvid=BV1cA411x7pF&cid=271345564&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe><h1>T1 Porcelain</h1><h2 id="题面">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/148/E">CF148E</a></p><p>$n$ 个货架，用二维数组表示价值，每个货架只能取出头部若干和尾部若干。取 $m$ 个物品价值之和最大多少。</p><h2 id="代码">代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> dp[N][M];</span><br><span class="line"><span class="type">int</span> val[N][N];</span><br><span class="line"><span class="type">int</span> num[N][N];</span><br><span class="line"><span class="type">int</span> siz[N];</span><br><span class="line"><span class="type">int</span> pre[N],suf[N];</span><br><span class="line"><span class="type">int</span> n,m;</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="comment">//输入</span></span><br><span class="line">n=<span class="built_in">read</span>(); m=<span class="built_in">read</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">siz[i]=<span class="built_in">read</span>();</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">1</span>;j&lt;=siz[i];j++)&#123;</span><br><span class="line">num[i][j]=<span class="built_in">read</span>();</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//预处理 val[i][j] 第 i 个货架选 j 个最大贡献</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="built_in">memset</span>(pre,<span class="number">0</span>,<span class="keyword">sizeof</span> pre);</span><br><span class="line"><span class="built_in">memset</span>(suf,<span class="number">0</span>,<span class="keyword">sizeof</span> suf);</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">1</span>;j&lt;=siz[i];j++) pre[j]=pre[j<span class="number">-1</span>]+num[i][j];</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=siz[i];j&gt;=<span class="number">1</span>;j--) suf[j]=suf[j<span class="number">+1</span>]+num[i][j];</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">1</span>;j&lt;=siz[i];j++)&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> k=<span class="number">0</span>;k&lt;=j;k++)&#123;</span><br><span class="line"><span class="type">int</span> ls=k,rs=j-k;<span class="comment">//左边取 k 个，右边 j-k 个</span></span><br><span class="line">val[i][j]=<span class="built_in">max</span>(val[i][j],pre[ls]+suf[siz[i]<span class="number">+1</span>-rs]);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//dp[i][j] 前 i 个货架取 j 个物品的最大贡献</span></span><br><span class="line"><span class="comment">//memset(dp,~0x3f,sizeof dp);</span></span><br><span class="line">dp[<span class="number">0</span>][<span class="number">0</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++) <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;=m;j++) <span class="keyword">for</span>(<span class="type">int</span> k=<span class="number">0</span>;k&lt;=<span class="built_in">min</span>(siz[i],j);k++)&#123;</span><br><span class="line">dp[i][j]=<span class="built_in">max</span>(dp[i][j],dp[i<span class="number">-1</span>][j-k]+val[i][k]);</span><br><span class="line"><span class="comment">//cout&lt;&lt;dp[i][j]&lt;&lt;&quot; &quot;&lt;&lt;dp[i-1][j-k]&lt;&lt;&quot;+&quot;&lt;&lt;val[i][k]&lt;&lt;endl;</span></span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;dp[n][m]&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><h1>T2 邪恶之书</h1><h2 id="题面-2">题面</h2><p>原题面 <a href="https://www.luogu.com.cn/problem/U525840">Luogu</a></p><p>给一棵树，树上有若干关键节点，计算有多少节点到所有关键节点的距离都不超过 $d$ 。</p><h2 id="思路">思路</h2><p><img src="/image/08.png" alt=""></p><h2 id="代码-2">代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> n,m,d;</span><br><span class="line"><span class="type">int</span> s[N],t[N],f[N],h[N],g[N],dis[N],val[N];</span><br><span class="line">vector &lt;<span class="type">int</span>&gt; G[N];</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs1</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line">f[u]=h[u]=g[u]=-inf;</span><br><span class="line"><span class="keyword">if</span>(val[u]) f[u]=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line"><span class="built_in">dfs1</span>(v,u);</span><br><span class="line">f[u]=<span class="built_in">max</span>(f[u],f[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">void</span> <span class="title">dfs2</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line"><span class="keyword">if</span>(fa)&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">h[v]=<span class="built_in">max</span>(h[v],h[u]<span class="number">+1</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> tmp=-inf;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">h[v]=<span class="built_in">max</span>(h[v],tmp);</span><br><span class="line">tmp=<span class="built_in">max</span>(tmp,f[v]<span class="number">+1</span>);</span><br><span class="line">&#125;</span><br><span class="line">tmp=-inf;</span><br><span class="line"><span class="built_in">reverse</span>(G[u].<span class="built_in">begin</span>(),G[u].<span class="built_in">end</span>());</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">h[v]=<span class="built_in">max</span>(h[v],tmp);</span><br><span class="line">tmp=<span class="built_in">max</span>(tmp,f[v]<span class="number">+1</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">if</span>(val[u]) h[v]=<span class="built_in">max</span>(h[v],<span class="number">0</span>);</span><br><span class="line">g[v]=<span class="built_in">max</span>(f[v],h[v]<span class="number">+1</span>);</span><br><span class="line"><span class="built_in">dfs2</span>(v,u);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">n=<span class="built_in">read</span>(),m=<span class="built_in">read</span>(),d=<span class="built_in">read</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++) val[<span class="built_in">read</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">1</span>;i&lt;n;i++)&#123;</span><br><span class="line"><span class="type">int</span> u=<span class="built_in">read</span>(),v=<span class="built_in">read</span>();</span><br><span class="line">G[u].<span class="built_in">push_back</span>(v);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">dfs1</span>(<span class="number">1</span>,<span class="number">0</span>);</span><br><span class="line">g[<span class="number">1</span>]=f[<span class="number">1</span>];</span><br><span class="line"><span class="built_in">dfs2</span>(<span class="number">1</span>,<span class="number">0</span>);</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> i=<span class="number">1</span>;i&lt;=n;i++)&#123;</span><br><span class="line"><span class="keyword">if</span>(g[i]&lt;=d) ans++;</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;ans&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><h1>T3</h1><p>还没写完，题面 <a href="https://www.luogu.com.cn/problem/U524741">Luogu</a> 。</p><h1>T4 Coloring Brackets</h1><h2 id="题面-3">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/149/D">CF149D</a></p><p>给括号序列每个半括号，要求：</p><ul><li><ol><li>不染色或者染红/蓝色；</li></ol></li><li><ol start="2"><li>一对括号正好有一半染色；</li></ol></li><li><ol start="3"><li>相邻括号不能染相同颜色。</li></ol></li></ul><p>求方案数。</p><h2 id="思路-2">思路</h2><p>$dp[l][r][a][b]$ 表示区间 $[l,r]$ 两端点的染色状态分别为 $a$ 和 $b$ （$a,b \in \left{ 0,1,2 \right} $）</p><h2 id="代码-3">代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line">stack &lt;pc&gt; st;</span><br><span class="line"><span class="type">int</span> re[N];<span class="comment">//相匹配括号的位置</span></span><br><span class="line"><span class="type">int</span> dp[N][N][<span class="number">3</span>][<span class="number">3</span>];<span class="comment">//0,1,2三种颜色</span></span><br><span class="line"><span class="type">int</span> ans=<span class="number">0</span>;</span><br><span class="line"><span class="type">int</span> c[N];</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> l,<span class="type">int</span> r)</span></span>&#123;</span><br><span class="line"><span class="keyword">if</span>(r==l<span class="number">+1</span>) dp[l][r][<span class="number">0</span>][<span class="number">1</span>]=dp[l][r][<span class="number">0</span>][<span class="number">2</span>]=dp[l][r][<span class="number">1</span>][<span class="number">0</span>]=dp[l][r][<span class="number">2</span>][<span class="number">0</span>]=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span>(re[l]==r)&#123;</span><br><span class="line"><span class="built_in">dfs</span>(l<span class="number">+1</span>,r<span class="number">-1</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">2</span>;i++)&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;=<span class="number">2</span>;j++)&#123;</span><br><span class="line"><span class="keyword">if</span>(j!=<span class="number">1</span>)dp[l][r][<span class="number">0</span>][<span class="number">1</span>]+=dp[l<span class="number">+1</span>][r<span class="number">-1</span>][i][j],dp[l][r][<span class="number">0</span>][<span class="number">1</span>]%=P;</span><br><span class="line"><span class="keyword">if</span>(j!=<span class="number">2</span>)dp[l][r][<span class="number">0</span>][<span class="number">2</span>]+=dp[l<span class="number">+1</span>][r<span class="number">-1</span>][i][j],dp[l][r][<span class="number">0</span>][<span class="number">2</span>]%=P;</span><br><span class="line"><span class="keyword">if</span>(i!=<span class="number">1</span>)dp[l][r][<span class="number">1</span>][<span class="number">0</span>]+=dp[l<span class="number">+1</span>][r<span class="number">-1</span>][i][j],dp[l][r][<span class="number">1</span>][<span class="number">0</span>]%=P;</span><br><span class="line"><span class="keyword">if</span>(i!=<span class="number">2</span>)dp[l][r][<span class="number">2</span>][<span class="number">0</span>]+=dp[l<span class="number">+1</span>][r<span class="number">-1</span>][i][j],dp[l][r][<span class="number">2</span>][<span class="number">0</span>]%=P;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line"><span class="built_in">dfs</span>(l,re[l]);</span><br><span class="line"><span class="built_in">dfs</span>(re[l]<span class="number">+1</span>,r);</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">2</span>;i++) <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;=<span class="number">2</span>;j++) <span class="keyword">for</span>(<span class="type">int</span> p=<span class="number">0</span>;p&lt;=<span class="number">2</span>;p++) <span class="keyword">for</span>(<span class="type">int</span> q=<span class="number">0</span>;q&lt;=<span class="number">2</span>;q++)&#123;</span><br><span class="line"><span class="keyword">if</span>(j==<span class="number">1</span>&amp;&amp;p==<span class="number">1</span>||j==<span class="number">2</span>&amp;&amp;p==<span class="number">2</span>) <span class="keyword">continue</span>;</span><br><span class="line">dp[l][r][i][q]+=(dp[l][re[l]][i][j]*dp[re[l]<span class="number">+1</span>][r][p][q]%P);</span><br><span class="line">dp[l][r][i][q]%=P;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line">string s; cin&gt;&gt;s;</span><br><span class="line"><span class="type">int</span> n=s.<span class="built_in">length</span>(); 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++)&#123;</span><br><span class="line"><span class="keyword">if</span>(st.<span class="built_in">empty</span>()) st.<span class="built_in">push</span>(&#123;s[i],i&#125;);</span><br><span class="line">pc k=st.<span class="built_in">top</span>();</span><br><span class="line"><span class="keyword">if</span>(k.first==<span class="string">&#x27;(&#x27;</span>&amp;&amp;s[i]==<span class="string">&#x27;)&#x27;</span>)&#123;</span><br><span class="line">st.<span class="built_in">pop</span>();</span><br><span class="line">re[i]=k.second;</span><br><span class="line">re[k.second]=i;</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line"></span><br><span class="line">st.<span class="built_in">push</span>(&#123;s[i],i&#125;);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">dfs</span>(<span class="number">1</span>,n);</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> i=<span class="number">0</span>;i&lt;=<span class="number">2</span>;i++) <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;=<span class="number">2</span>;j++)&#123;</span><br><span class="line">ans+=dp[<span class="number">1</span>][n][i][j],ans%=P;</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;ans&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;p&gt;在听这个，很上头。&lt;/p&gt;
&lt;p&gt;今天挺逆天，就树的那道题有 $60$ 分qwq，写不下去了。&lt;/p&gt;
&lt;iframe src=&quot;//player.bilibili.com/player.html?isOutside=true&amp;aid=330820835&amp;bvid=BV1c</summary>
      
    
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="dp" scheme="http://blog.tsumugi.icu/tags/dp/"/>
    
    <category term="集训" scheme="http://blog.tsumugi.icu/tags/%E9%9B%86%E8%AE%AD/"/>
    
  </entry>
  
  <entry>
    <title>2025/2/7 集训 DP II</title>
    <link href="http://blog.tsumugi.icu/2025/02/07/2025-2-7/"/>
    <id>http://blog.tsumugi.icu/2025/02/07/2025-2-7/</id>
    <published>2025-02-07T15:58:12.000Z</published>
    <updated>2025-02-07T13:47:29.541Z</updated>
    
    <content type="html"><![CDATA[<p>赛事得分：$100 + 0 + 50 + 30$ 鉴定为史。</p><h1>T1 Palindrome Basis</h1><h2 id="题面">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/1673/C">CF1673C</a></p><h2 id="题意">题意</h2><p>问一个数拆成回文数，有多少种拆分方案。</p><h2 id="思路">思路</h2><p>完全背包。想了一个小时差点没想出来。然后局势就很明朗了。</p><h2 id="代码">代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Contest code</span></span><br><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="meta">#<span class="keyword">include</span><span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="comment">//#define int 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="keyword">typedef</span> <span class="type">long</span> <span class="type">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair&lt;<span class="type">int</span>,<span class="type">int</span>&gt; pii;</span><br><span class="line"><span class="type">const</span> ll inf=<span class="number">1e18</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N=<span class="number">4e4</span><span class="number">+10</span>;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">int</span> <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="type">int</span> x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line">    <span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> ll <span class="title">lread</span><span class="params">()</span></span>&#123;</span><br><span class="line">    ll x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line">    <span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> dp[N],n;</span><br><span class="line">vector &lt;<span class="type">int</span>&gt; v;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> P=<span class="number">1e9</span><span class="number">+7</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">    dp[<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">1</span>;i&lt;=<span class="number">9</span>;i++) v.<span class="built_in">push_back</span>(i);</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=<span class="number">9</span>;i++) v.<span class="built_in">push_back</span>(i*<span class="number">11</span>);</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=<span class="number">9</span>;i++) <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;=<span class="number">9</span>;j++) v.<span class="built_in">push_back</span>(<span class="number">101</span>*i<span class="number">+10</span>*j);</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=<span class="number">9</span>;i++) <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;=<span class="number">9</span>;j++) v.<span class="built_in">push_back</span>(<span class="number">1001</span>*i<span class="number">+110</span>*j);</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=<span class="number">9</span>;i++) <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;=<span class="number">9</span>;j++) <span class="keyword">for</span>(<span class="type">int</span> k=<span class="number">0</span>;k&lt;=<span class="number">9</span>;k++) v.<span class="built_in">push_back</span>(<span class="number">10001</span>*i<span class="number">+1010</span>*j<span class="number">+100</span>*k);</span><br><span class="line"><span class="comment">//    for(int i=1;i&lt;=4e4;i++)&#123;</span></span><br><span class="line"><span class="comment">//        for(auto j:v)&#123;</span></span><br><span class="line"><span class="comment">//            if(i-j&gt;=0) dp[i]+=dp[i-j];</span></span><br><span class="line"><span class="comment">//            else break;</span></span><br><span class="line"><span class="comment">//        &#125;</span></span><br><span class="line"><span class="comment">//    &#125;</span></span><br><span class="line">    <span class="comment">//for(auto i:v) cout&lt;&lt;i&lt;&lt;endl;</span></span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">auto</span> i:v)&#123;</span><br><span class="line">        <span class="keyword">for</span>(<span class="type">int</span> j=i;j&lt;=<span class="number">4e4</span>;j++)&#123;</span><br><span class="line">            dp[j]=(dp[j]+dp[j-i])%P;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="built_in">init</span>();</span><br><span class="line">    <span class="type">int</span> _=<span class="built_in">read</span>();<span class="keyword">while</span>(_--) &#123;<span class="type">int</span> a=<span class="built_in">read</span>();cout&lt;&lt;dp[a]&lt;&lt;endl;&#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>T2 Armchairs</h1><h2 id="题面-2">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/1525/D">CF1525D</a></p><h2 id="题意-2">题意</h2><p>$n$ 把椅子，其中不多于一半有人占着。由 $i$ 换座到 $j$ 代价为 $abs (i-j)$。问所有人都换座到初始没被占的位置代价最小多少。</p><h2 id="代码-2">代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Contest code</span></span><br><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="meta">#<span class="keyword">include</span><span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="comment">//#define int 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="keyword">typedef</span> <span class="type">long</span> <span class="type">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair&lt;<span class="type">int</span>,<span class="type">int</span>&gt; pii;</span><br><span class="line"><span class="type">const</span> ll inf=<span class="number">1e18</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N=<span class="number">5e3</span><span class="number">+10</span>;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">int</span> <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line">    <span class="type">int</span> x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line">    <span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> ll <span class="title">lread</span><span class="params">()</span></span>&#123;</span><br><span class="line">    ll x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line">    <span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> n,val[N],dp[N][N];</span><br><span class="line"><span class="type">int</span> pla[N],plb[N];</span><br><span class="line"><span class="type">int</span> ta,tb;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    n=<span class="built_in">read</span>();<span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;i++) val[i]=<span class="built_in">read</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>(val[i]) pla[++ta]=i;</span><br><span class="line">        <span class="keyword">else</span> plb[++tb]=i;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">memset</span>(dp,<span class="number">0x3f</span>,<span class="built_in">sizeof</span>(dp));</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;=tb;i++) dp[<span class="number">0</span>][i]=<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;=ta;i++) <span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">1</span>;j&lt;=tb;j++)&#123;</span><br><span class="line">        dp[i][j]=<span class="built_in">min</span>(dp[i<span class="number">-1</span>][j<span class="number">-1</span>]+<span class="built_in">abs</span>(pla[i]-plb[j]),dp[i][j<span class="number">-1</span>]);</span><br><span class="line">    &#125;</span><br><span class="line">    cout&lt;&lt;dp[ta][tb]&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><h1>T3 Choosing Capital for Treeland</h1><h2 id="题面-3">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/219/D">CF219D</a></p><h2 id="题意-3">题意</h2><p>给一棵树，边有方向，一个节点作为根节点的权值为指向根节点的边数。求所有节点作为根节点的权值。</p><h2 id="思路-2">思路</h2><p>将以 $u$ 作为根节点的反转答案即为 $dp[u]$ ，对于每条边 $(u,v)$ ，可以通过边的方向确定 $dp[v]$ （$|dp[u]-dp[v]|=1$）。</p><p>懒不证明。</p><h2 id="代码-3">代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Contest code</span></span><br><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="meta">#<span class="keyword">include</span><span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="comment">//#define int 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="keyword">typedef</span> <span class="type">long</span> <span class="type">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair&lt;<span class="type">int</span>,<span class="type">int</span>&gt; pii;</span><br><span class="line"><span class="type">const</span> ll inf=<span class="number">1e18</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N=<span class="number">2e5</span><span class="number">+10</span>;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">int</span> <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="type">int</span> x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line"><span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> ll <span class="title">lread</span><span class="params">()</span></span>&#123;</span><br><span class="line">ll x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line"><span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">int</span> n;</span><br><span class="line">vector &lt;pii&gt; G[N];</span><br><span class="line"><span class="type">int</span> vl[N];</span><br><span class="line"><span class="type">int</span> minn=<span class="number">1e9</span>;</span><br><span class="line">vector &lt;<span class="type">int</span>&gt; ve[N];</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">dfs1</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line"><span class="type">int</span> res=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> k:G[u])&#123;</span><br><span class="line"><span class="type">int</span> v=k.first,w=k.second;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line">res+=<span class="built_in">dfs1</span>(v,u)+w;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> res;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs2</span><span class="params">(<span class="type">int</span> u,<span class="type">int</span> fa)</span></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> k:G[u])&#123;</span><br><span class="line"><span class="type">int</span> v=k.first,w=k.second;</span><br><span class="line"><span class="keyword">if</span>(v==fa) <span class="keyword">continue</span>;</span><br><span class="line"><span class="keyword">if</span>(w) vl[v]=vl[u]<span class="number">-1</span>;</span><br><span class="line"><span class="keyword">else</span> vl[v]=vl[u]<span class="number">+1</span>;</span><br><span class="line"><span class="built_in">dfs2</span>(v,u);</span><br><span class="line">&#125;</span><br><span class="line">minn=<span class="built_in">min</span>(minn,vl[u]);</span><br><span class="line">ve[vl[u]].<span class="built_in">push_back</span>(u);</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">n=<span class="built_in">read</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="type">int</span> u=<span class="built_in">read</span>(),v=<span class="built_in">read</span>();</span><br><span class="line">G[u].<span class="built_in">push_back</span>(&#123;v,<span class="number">0</span>&#125;);<span class="comment">//正</span></span><br><span class="line">G[v].<span class="built_in">push_back</span>(&#123;u,<span class="number">1</span>&#125;);<span class="comment">//反</span></span><br><span class="line">&#125;</span><br><span class="line">vl[<span class="number">1</span>]=<span class="built_in">dfs1</span>(<span class="number">1</span>,<span class="number">1</span>);</span><br><span class="line"><span class="comment">//cout&lt;&lt;vl[1]&lt;&lt;endl;</span></span><br><span class="line"><span class="built_in">dfs2</span>(<span class="number">1</span>,<span class="number">1</span>);</span><br><span class="line"><span class="comment">//for(int i=1;i&lt;=n;i++) cout&lt;&lt;vl[i]&lt;&lt;&quot; &quot;;</span></span><br><span class="line"><span class="comment">//cout&lt;&lt;endl;</span></span><br><span class="line">cout&lt;&lt;minn&lt;&lt;endl;</span><br><span class="line"><span class="built_in">sort</span>(ve[minn].<span class="built_in">begin</span>(),ve[minn].<span class="built_in">end</span>());</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> i:ve[minn]) cout&lt;&lt;i&lt;&lt;<span class="string">&quot; &quot;</span>;cout&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><h1>T4 Kaavi and Magic Spell</h1><h2 id="题面-4">题面</h2><p>原题面 <a href="https://codeforces.com/problemset/problem/1336/C">CF1336C</a></p><h2 id="题意-4">题意</h2><p>给定字符串 $T$ 和 $S$ 。有个空字符 $A$ ，每次可以把 $S$ 的首字母插入 $A$ 的开头或者结尾后删除，最多操作|S|次。求有多少种方案使得 $T$ 是 $A$ 的前缀。</p><h2 id="代码-4">代码</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></pre></td><td class="code"><pre><span class="line"><span class="comment">// Contest code</span></span><br><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="meta">#<span class="keyword">include</span><span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="comment">//#define int 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="keyword">typedef</span> <span class="type">long</span> <span class="type">long</span> ll;</span><br><span class="line"><span class="keyword">typedef</span> pair&lt;<span class="type">int</span>,<span class="type">int</span>&gt; pii;</span><br><span class="line"><span class="type">const</span> ll inf=<span class="number">1e18</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N=<span class="number">5e3</span><span class="number">+10</span>;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">int</span> <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="type">int</span> x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line"><span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> ll <span class="title">lread</span><span class="params">()</span></span>&#123;</span><br><span class="line">ll x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line"><span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> P=<span class="number">998244353</span>;</span><br><span class="line"><span class="type">int</span> dp[N][N];</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">string t,s; cin&gt;&gt;s&gt;&gt;t;</span><br><span class="line"><span class="type">int</span> n,m; n=s.<span class="built_in">length</span>(),m=t.<span class="built_in">length</span>();</span><br><span class="line">s=<span class="string">&quot;?&quot;</span>+s,t=<span class="string">&quot;?&quot;</span>+t;</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++) dp[i][i]=(i&gt;m||s[<span class="number">1</span>]==t[i])*<span class="number">2</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> len=<span class="number">2</span>;len&lt;=n;len++)&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> l=<span class="number">1</span>;l+len<span class="number">-1</span>&lt;=n;l++)&#123;</span><br><span class="line"><span class="type">int</span> r=l+len<span class="number">-1</span>;</span><br><span class="line"><span class="keyword">if</span>(l&gt;m||s[len]==t[l]) dp[l][r]+=dp[l<span class="number">+1</span>][r],dp[l][r]%=P;</span><br><span class="line"><span class="keyword">if</span>(r&gt;m||s[len]==t[r]) dp[l][r]+=dp[l][r<span class="number">-1</span>],dp[l][r]%=P;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</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> i=m;i&lt;=n;i++) ans+=dp[<span class="number">1</span>][i],ans%=P;</span><br><span class="line">cout&lt;&lt;ans&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;p&gt;赛事得分：$100 + 0 + 50 + 30$ 鉴定为史。&lt;/p&gt;
&lt;h1&gt;T1 Palindrome Basis&lt;/h1&gt;
&lt;h2 id=&quot;题面&quot;&gt;题面&lt;/h2&gt;
&lt;p&gt;原题面 &lt;a href=&quot;https://codeforces.com/problemset/pro</summary>
      
    
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="dp" scheme="http://blog.tsumugi.icu/tags/dp/"/>
    
    <category term="集训" scheme="http://blog.tsumugi.icu/tags/%E9%9B%86%E8%AE%AD/"/>
    
  </entry>
  
  <entry>
    <title>2025/2/6 集训 DP I</title>
    <link href="http://blog.tsumugi.icu/2025/02/06/2025-2-6/"/>
    <id>http://blog.tsumugi.icu/2025/02/06/2025-2-6/</id>
    <published>2025-02-06T15:58:12.000Z</published>
    <updated>2025-02-07T13:46:51.144Z</updated>
    
    <content type="html"><![CDATA[<p>赛事得分：$100 + 0 + 12 + 30$ 鉴定为史。</p><h1>T1 Running Miles / 最佳の锻炼</h1><h2 id="题面">题面</h2><p>原题面 <a href="https://codeforces.com/contest/1826/problem/D">CF1826D</a> <a href="https://www.luogu.com.cn/problem/CF1826D">Luogu</a></p><h2 id="题意">题意</h2><p>给一个数组，选取一个区间 $[l, r]$ ，收益为区间最大的三个值减去区间长度，求最大收益</p><h2 id="思路1（非动态规划）">思路1（非动态规划）</h2><p>令选择的数为 $a_l,a_m,a_r$ ，易得 $l = a_l \leq a_m \leq a_r = r$ 。</p><p>将柿子整理为 $(a_l + l) + a_m + (a_r - r)$ ，可以用前缀/后缀最大值优化，枚举 $a_m$ ，答案即为 $pre[i-1]+a_i+suf[i+1]$ ，复杂度 $\text{O}(n)$ 。</p><h2 id="思路二（动态规划）">思路二（动态规划）</h2><p>dp状态定义</p><table><thead><tr><th style="text-align:center">0</th><th style="text-align:center">1</th><th style="text-align:center">2</th><th style="text-align:center">3</th><th style="text-align:center">4</th></tr></thead><tbody><tr><td style="text-align:center">$a_l$</td><td style="text-align:center">$(a_l,a_m)$</td><td style="text-align:center">$a_m$</td><td style="text-align:center">$(a_m,a_r)$</td><td style="text-align:center">$a_r$</td></tr></tbody></table><p>各状态贡献</p><table><thead><tr><th style="text-align:center">0</th><th style="text-align:center">1</th><th style="text-align:center">2</th><th style="text-align:center">3</th><th style="text-align:center">4</th></tr></thead><tbody><tr><td style="text-align:center">$a_l$</td><td style="text-align:center">$-1$</td><td style="text-align:center">$a_m-1$</td><td style="text-align:center">$-1$</td><td style="text-align:center">$a_r-1$</td></tr></tbody></table><p>转移方程</p><p>$dp[i][0]=a[i]$</p><p>$dp[i][1]=dp[i-1][0/1]-1$</p><p>$dp[i][2]=dp[i-1][1]+a[i]-1$</p><p>$dp[i][3]=dp[i-1][2/3]-1$</p><p>$dp[i][4]=dp[i-1][3]+a[i]-1$</p><h2 id="代码">代码</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></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">const</span> <span class="type">int</span> N=<span class="number">1e5</span><span class="number">+10</span>;</span><br><span class="line"><span class="type">int</span> n,val[N];</span><br><span class="line"><span class="type">int</span> lv[N],rv[N];</span><br><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"><span class="built_in">memset</span>(val,<span class="number">0</span>,<span class="built_in">sizeof</span>(val));</span><br><span class="line"><span class="built_in">memset</span>(val,<span class="number">0</span>,<span class="built_in">sizeof</span>(lv));</span><br><span class="line"><span class="built_in">memset</span>(val,<span class="number">0</span>,<span class="built_in">sizeof</span>(rv));</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;val[i];</span><br><span class="line">&#125;<span class="comment">//(a_1+l)+a_2+(a_3-r)</span></span><br><span class="line">lv[<span class="number">0</span>]=<span class="number">0</span>,rv[n<span class="number">+1</span>]=<span class="number">-1e9</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">lv[i]=<span class="built_in">max</span>(lv[i<span class="number">-1</span>],val[i]+i);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=n;i&gt;=<span class="number">1</span>;i--)&#123;</span><br><span class="line">rv[i]=<span class="built_in">max</span>(rv[i<span class="number">+1</span>],val[i]-i);</span><br><span class="line">&#125;</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> i=<span class="number">2</span>;i&lt;n;i++)&#123;</span><br><span class="line">ans=<span class="built_in">max</span>(ans,lv[i<span class="number">-1</span>]+rv[i<span class="number">+1</span>]+val[i]);</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;ans&lt;&lt;endl;</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">ios::<span class="built_in">sync_with_stdio</span>(<span class="literal">false</span>);</span><br><span class="line"><span class="type">int</span> T;cin&gt;&gt;T;</span><br><span class="line"><span class="keyword">while</span>(T--) <span class="built_in">solve</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><h1>T2 子集の子集</h1><h2 id="题面-2">题面</h2><p>原题面 <a href="https://codeforces.com/contest/687/problem/C">CF687C</a> <a href="https://www.luogu.com.cn/problem/CF687C">Luogu</a></p><h2 id="题意-2">题意</h2><p>$n$ 个硬币，每个价值 $a_i$。所有能够凑出 $k$ 的硬币集合，其子集能表示的价值有多少种？</p><h2 id="思路">思路</h2><p><a href="https://www.luogu.com/user/696391">@The_chariot</a></p><blockquote><p>将硬币集合分为三个集合 $s,p,q$ , $s+p=k$ , $s+p+q=n$<br>定义$dp[i][j][k]$为前$i$个物品，$s$集合总和为$j$，$p$集合总和为&gt;$k$是否可行<br>初始化<br>$$dp[0][0][0]=1$$</p><p>转移<br>$$dp[i+1][j+c[i+1]][k]=dp[i][j][k]$$<br>$$dp[i+1][j][k+c[i+1]]=dp[i][j][k]$$<br>$$dp[i+1][j][k]=dp[i][j][k]$$</p></blockquote><p>空间！空间！空间！重要的事情说三遍</p><h2 id="代码-2">代码</h2><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="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">const</span> <span class="type">int</span> N=<span class="number">1010</span>;</span><br><span class="line"><span class="type">int</span> n,m;</span><br><span class="line"><span class="type">int</span> G[N][N];</span><br><span class="line"><span class="type">int</span> E[N][N];</span><br><span class="line"><span class="type">int</span> val[N];</span><br><span class="line"><span class="type">int</span> ans;</span><br><span class="line">vector &lt;<span class="type">int</span>&gt; v;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">int</span> <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="type">int</span> x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line"><span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">return</span> x*f;</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">n=<span class="built_in">read</span>(),m=<span class="built_in">read</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++) val[i]=<span class="built_in">read</span>();</span><br><span class="line">G[<span class="number">0</span>][<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">0</span>;i&lt;n;i++) &#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;=m;j++) <span class="keyword">for</span>(<span class="type">int</span> k=<span class="number">0</span>;k&lt;=m;k++)&#123;</span><br><span class="line"><span class="keyword">if</span>(!G[j][k]) <span class="keyword">continue</span>;</span><br><span class="line">E[j+val[i<span class="number">+1</span>]][k]=<span class="number">1</span>;</span><br><span class="line">E[j][k+val[i<span class="number">+1</span>]]=<span class="number">1</span>;</span><br><span class="line">E[j][k]=<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">0</span>;i&lt;=m;i++)&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;=m;j++)&#123;</span><br><span class="line">G[i][j]=E[i][j];</span><br><span class="line">E[i][j]=<span class="number">0</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">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;=m;i++)&#123;</span><br><span class="line"><span class="keyword">if</span>(G[i][m-i]) ans++;</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;ans&lt;&lt;endl;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;=m;i++)&#123;</span><br><span class="line"><span class="keyword">if</span>(G[i][m-i]) cout&lt;&lt;i&lt;&lt;<span class="string">&quot; &quot;</span>;</span><br><span class="line">&#125;</span><br><span class="line">cout&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><h1>T3 Vlad and Trouble at MIT</h1><h2 id="题面-3">题面</h2><p>原题面 <a href="https://codeforces.com/contest/1926/problem/G">CF1926G</a> <a href="https://www.luogu.com.cn/problem/CF1926G">Luogu</a></p><h2 id="题意-3">题意</h2><p>没时间写了</p><h1>T4 设计信封</h1><h2 id="题面-4">题面</h2><p><a href="https://www.luogu.com.cn/problem/U527234">Luogu</a></p><h2 id="题意-4">题意</h2><p>长 $a_i$，宽 $b_i$，个数 $c_i$ 。需要制作 $k$ 种信封，长 $A_i$ ,宽 $B_i$ 。最少浪费多少空间？</p><h2 id="代码-3">代码</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;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cstring&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="meta">#<span class="keyword">define</span> int long long</span></span><br><span class="line"><span class="function"><span class="keyword">inline</span> <span class="type">int</span> <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="type">int</span> x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line"><span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line"><span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N=<span class="number">16</span>;</span><br><span class="line"><span class="type">int</span> n,k;</span><br><span class="line"><span class="type">int</span> a[N],b[N],c[N];</span><br><span class="line"><span class="type">int</span> dp[<span class="number">1</span>&lt;&lt;N][<span class="number">20</span>];</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line"><span class="built_in">memset</span>(dp,<span class="number">63</span>,<span class="built_in">sizeof</span>(dp));</span><br><span class="line">n=<span class="built_in">read</span>(),k=<span class="built_in">read</span>();</span><br><span class="line"><span class="type">int</span> maxn=(<span class="number">1</span>&lt;&lt;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++) a[i]=<span class="built_in">read</span>(),b[i]=<span class="built_in">read</span>(),c[i]=<span class="built_in">read</span>();</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;maxn;i++)&#123;</span><br><span class="line">dp[i][<span class="number">1</span>]=<span class="number">0</span>;</span><br><span class="line"><span class="type">int</span> ml=<span class="number">0</span>,mr=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;n;j++) <span class="keyword">if</span>((<span class="number">1</span>&lt;&lt;j)&amp;i) ml=<span class="built_in">max</span>(ml,a[j<span class="number">+1</span>]),mr=<span class="built_in">max</span>(mr,b[j<span class="number">+1</span>]);</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;n;j++) <span class="keyword">if</span>((<span class="number">1</span>&lt;&lt;j)&amp;i) dp[i][<span class="number">1</span>]+=(ml*mr-a[j<span class="number">+1</span>]*b[j<span class="number">+1</span>])*c[j<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;maxn;i++) <span class="keyword">for</span>(<span class="type">int</span> r=<span class="number">2</span>;r&lt;=k;r++) <span class="keyword">for</span>(<span class="type">int</span> j=i;j;j=(j<span class="number">-1</span>)&amp;i)&#123;</span><br><span class="line">dp[i][r]=<span class="built_in">min</span>(dp[i][r],dp[j][<span class="number">1</span>]+dp[i^j][r<span class="number">-1</span>]);</span><br><span class="line">&#125;</span><br><span class="line">cout&lt;&lt;dp[maxn<span class="number">-1</span>][k]&lt;&lt;endl;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;赛事得分：$100 + 0 + 12 + 30$ 鉴定为史。&lt;/p&gt;
&lt;h1&gt;T1 Running Miles / 最佳の锻炼&lt;/h1&gt;
&lt;h2 id=&quot;题面&quot;&gt;题面&lt;/h2&gt;
&lt;p&gt;原题面 &lt;a href=&quot;https://codeforces.com/contest/1</summary>
      
    
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="dp" scheme="http://blog.tsumugi.icu/tags/dp/"/>
    
    <category term="集训" scheme="http://blog.tsumugi.icu/tags/%E9%9B%86%E8%AE%AD/"/>
    
  </entry>
  
  <entry>
    <title>标签外挂笔记</title>
    <link href="http://blog.tsumugi.icu/2025/01/26/note-tags/"/>
    <id>http://blog.tsumugi.icu/2025/01/26/note-tags/</id>
    <published>2025-01-26T14:06:45.000Z</published>
    <updated>2025-01-26T14:15:11.590Z</updated>
    
    <content type="html"><![CDATA[<ol><li>带 <u>下划线</u> 的文本</li><li>带 <emp>着重号</emp> 的文本</li><li>带 <wavy>波浪线</wavy> 的文本</li><li>带 <del>删除线</del> 的文本</li><li>键盘样式的文本 <kbd>command</kbd> + <kbd>D</kbd></li><li>密码样式的文本：<psw>这里没有验证码</psw></li></ol><ul><li>彩色文字<br>在一段话中方便插入各种颜色的标签，包括：<span class='p red'>红色</span>、<span class='p yellow'>黄色</span>、<span class='p green'>绿色</span>、<span class='p cyan'>青色</span>、<span class='p blue'>蓝色</span>、<span class='p gray'>灰色</span>。</li><li>超大号文字<br>文档「开始」页面中的标题部分就是超大号文字。</li></ul><span class='p center logo large'>Volantis</span><span class='p center small'>A Wonderful Theme for Hexo</span><div class="tip "><p>default</p></div><div class="tip info"><p>info</p></div><div class="tip success"><p>success</p></div><div class="tip error"><p>error</p></div><div class="tip warning"><p>warning</p></div><div class="tip bolt"><p>bolt</p></div><div class="tip ban"><p>ban</p></div><div class="tip home"><p>home</p></div><div class="tip sync"><p>sync</p></div><div class="tip cogs"><p>cogs</p></div><div class="tip key"><p>key</p></div><div class="tip bell"><p>bell</p></div><div class="tip fa-atom"><p>自定义font awesome图标</p></div><div class='checkbox'><input type="checkbox" />            <p>纯文本测试</p>            </div><div class='checkbox checked'><input type="checkbox" checked="checked"/>            <p>支持简单的 <a href="https://guides.github.com/features/mastering-markdown/">markdown</a> 语法</p>            </div><div class='checkbox red'><input type="checkbox" />            <p>支持自定义颜色</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>绿色 + 默认选中</p>            </div><div class='checkbox yellow checked'><input type="checkbox" checked="checked"/>            <p>黄色 + 默认选中</p>            </div><div class='checkbox cyan checked'><input type="checkbox" checked="checked"/>            <p>青色 + 默认选中</p>            </div><div class='checkbox blue checked'><input type="checkbox" checked="checked"/>            <p>蓝色 + 默认选中</p>            </div><div class='checkbox plus green checked'><input type="checkbox" checked="checked"/>            <p>增加</p>            </div><div class='checkbox minus yellow checked'><input type="checkbox" checked="checked"/>            <p>减少</p>            </div><div class='checkbox times red checked'><input type="checkbox" checked="checked"/>            <p>叉</p>            </div><div class='checkbox'><input type="radio" />            <p>纯文本测试</p>            </div><div class='checkbox checked'><input type="radio" checked="checked"/>            <p>支持简单的 <a href="https://guides.github.com/features/mastering-markdown/">markdown</a> 语法</p>            </div><div class='checkbox red'><input type="radio" />            <p>支持自定义颜色</p>            </div><div class='checkbox green'><input type="radio" />            <p>绿色</p>            </div><div class='checkbox yellow'><input type="radio" />            <p>黄色</p>            </div><div class='checkbox cyan'><input type="radio" />            <p>青色</p>            </div><div class='checkbox blue'><input type="radio" />            <p>蓝色</p>            </div><div class="timeline blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴样式</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2020-07-24 <a href="https://github.com/volantis-x/hexo-theme-volantis/releases">2.6.6 -&gt; 3.0</a></p></div></div><div class='timeline-item-content'><ol><li>如果有 <code>hexo-lazyload-image</code> 插件，需要删除并重新安装最新版本，设置 <code>lazyload.isSPA: true</code>。</li><li>2.x 版本的 css 和 js 不适用于 3.x 版本，如果使用了 <code>use_cdn: true</code> 则需要删除。</li><li>2.x 版本的 fancybox 标签在 3.x 版本中被重命名为 gallery 。</li><li>2.x 版本的置顶 <code>top: true</code> 改为了 <code>pin: true</code>，并且同样适用于 <code>layout: page</code> 的页面。</li><li>如果使用了 <code>hexo-offline</code> 插件，建议卸载，3.0 版本默认开启了 pjax 服务。</li></ol></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2020-05-15 <a href="https://github.com/volantis-x/hexo-theme-volantis/releases/tag/2.6.6">2.6.3 -&gt; 2.6.6</a></p></div></div><div class='timeline-item-content'><p>不需要额外处理。</p></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2020-04-20 <a href="https://github.com/volantis-x/hexo-theme-volantis/releases/tag/2.6.3">2.6.2 -&gt; 2.6.3</a></p></div></div><div class='timeline-item-content'><ol><li>全局搜索 <code>seotitle</code> 并替换为 <code>seo_title</code>。</li><li>group 组件的索引规则有变，使用 group 组件的文章内，<code>group: group_name</code> 对应的组件名必须是 <code>group_name</code>。</li><li>group 组件的列表名优先显示文章的 <code>short_title</code> 其次是 <code>title</code>。</li></ol></div></div></div><div class="tag link"><a class="link-card" title="糖果屋教程贴" href="https://akilar.top/posts/615e2dec/"><div class="left"><img src="/img/siteicon/favicon.ico"/></div><div class="right"><p class="text">糖果屋教程贴</p><p class="url">https://akilar.top/posts/615e2dec/</p></div></a></div><div class="tabs"><div class="nav-tabs"><button type="button" class="tab active">第一个Tab</button><button type="button" class="tab"><i class="fab fa-apple-pay"></i></button><button type="button" class="tab"><i class="fas fa-bomb"></i>炸弹</button></div><div class="tab-contents"><div class="tab-item-content active"><p><strong>tab名字为第一个Tab</strong></p></div><div class="tab-item-content"><p><strong>只有图标 没有Tab名字</strong></p></div><div class="tab-item-content"><p><strong>名字+icon</strong></p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div><div class='poem'><div class='poem-title'>水调歌头</div><div class='poem-author'>苏轼</div><p>丙辰中秋，欢饮达旦，大醉，作此篇，兼怀子由。<br>明月几时有？把酒问青天。<br>不知天上宫阙，今夕是何年？<br>我欲乘风归去，又恐琼楼玉宇，高处不胜寒。<br>起舞弄清影，何似在人间？</p><p>转朱阁，低绮户，照无眠。<br>不应有恨，何事长向别时圆？<br>人有悲欢离合，月有阴晴圆缺，此事古难全。<br>但愿人长久，千里共婵娟。</p></div>]]></content>
    
    
      
      
    <summary type="html">&lt;ol&gt;
&lt;li&gt;带 &lt;u&gt;下划线&lt;/u&gt; 的文本&lt;/li&gt;
&lt;li&gt;带 &lt;emp&gt;着重号&lt;/emp&gt; 的文本&lt;/li&gt;
&lt;li&gt;带 &lt;wavy&gt;波浪线&lt;/wavy&gt; 的文本&lt;/li&gt;
&lt;li&gt;带 &lt;del&gt;删除线&lt;/del&gt; 的文本&lt;/li&gt;
&lt;li&gt;键盘样式的文本 &lt;kbd&gt;</summary>
      
    
    
    
    <category term="博客" scheme="http://blog.tsumugi.icu/categories/%E5%8D%9A%E5%AE%A2/"/>
    
    
    <category term="标签外挂" scheme="http://blog.tsumugi.icu/tags/%E6%A0%87%E7%AD%BE%E5%A4%96%E6%8C%82/"/>
    
  </entry>
  
  <entry>
    <title>随笔之二</title>
    <link href="http://blog.tsumugi.icu/2025/01/14/essay-2/"/>
    <id>http://blog.tsumugi.icu/2025/01/14/essay-2/</id>
    <published>2025-01-14T14:18:12.000Z</published>
    <updated>2025-01-16T15:18:28.702Z</updated>
    
    <content type="html"><![CDATA[<p>写在前面</p><p>聊聊压力、生活、音乐和一滩烂泥。</p><blockquote><p>噢多麼美麗的一顆心</p><p>怎麼會 怎麼會 就變成了一灘爛泥</p><p>噢多麼單純的一首詩</p><p>怎麼會 怎麼會 都變成了諷刺</p><p>我想要說的 前人們都說過了</p><p>我想要做的 有錢人都做過了</p><p>我想要的公平都是不公們虛構的</p></blockquote><p>我对于摇滚的态度很奇怪。有时候听着嫌吵，有时候却像珍宝一样握着爱不释手。我听歌喜欢按照专辑听，一次必须听完一整张。在这个快时代里可能显得有些奇怪，但是专辑和歌单不一样。专辑是作者给自己做的诗集，作品里有起承转合，歌单则是后人整理的，只有精华，却总少了些什么。专辑里有电影开场一样的 Intro ，有开始的小高潮、中间的平庸作品、结尾如电影片尾一样的大高潮，中间还有丝滑的链接，然后死去。歌单像电影切片，浓缩的让人咽不下去。我对音乐只是个门外汉，只是自己的感受，看个乐就行。</p><p>摇滚是反叛、自由与爱，是时代的影子。</p><p>我也挺喜欢ツユ，最喜欢的是《やっぱり雨は降るんだね》，即指单曲也指专辑。我比较讨厌ぷす的所作所为，很难说是出于什么。我看到去年（2024年）末时ツユ的删歌公告时，并没有觉得有些惋惜，或者“作品无罪”无感，直接就说我认为ぷす有罪，所以牵连到ツユ是活该吧。看到那个消息是自己一个人在家里跨年的时候，似乎不能对我有些厌世（可能这样说）情绪有些鼓励作用。</p><p>还有一个乐队，让我想想是什么，最近太累了记性真的不好。</p><p>很快地想起来了，不是乐队，是郭顶的《飞行器的执行周期》。很多人知道这张专辑甚至这个人是因为《水星记》或者《凄美地》，我似乎也不例外。通过最有名的作品来进一步了解一位创作者，我觉得不错。专辑里的每一首歌我都挺喜欢，总有那种听多了折射到自己身上的感觉。比如“在 每个眼神都/只身荒野那瞬间/你和我面对面/如此地安慰”，说不出来是什么感觉。</p><blockquote><p>你会发现这张专辑的情感表达非常直接，它鼓励你去尝试任何可能性，尝试感知自己每一个细微情绪的转变，尝试去飞飞行。</p></blockquote><p>反正是郭顶和ツユ陪我走过了精神状态最差的那段时间（并不是现在，抱歉），谢谢你们。</p><p>是不是到聊聊压力的时候了？大概吧。我内耗很严重，从以前到现在，但是现在比之前好多了。期末周是全世界人类最讨厌的东西，拿个很老套的东西举例，“黎明前的黑暗”。我很讨厌别人给予我过高的期望我却不能达成。别人似乎不在意，但自己的感受是藏不住的。记得初中的时候，班主任给“可能考进年级前十”的名单上写了 11 个人。对于 500 人的一个年级，运气立大功了。就如“你是我全部的希望”这样，当个赌怪一样孤注一掷的话语我认为是错误的。</p><p>我的这句话好像是错的，我曾经说过“政治没有对错，只有立场”，放在生活上似乎也一样。说到生活，或者说人文，我总感觉理科和文科呈现的是两个东西。理科构成了世界，文科成就了世界，但是却相隔万里，似乎不在一个世界。比如一个原子似乎与中国特色社会主义，三角函数与统一多民族国家，不像是同一个客观的世界。人际关系不能用牛顿三定律来解决，人文学科的基本公理究竟为何物，我不明白。</p><p>提出的问题似乎有些过多了，回到生活的现实。朋友说过一句话，“分数是身外之物，活不带来，死不带去。”对于分数，另外一个朋友又说，“考前害怕失败，考后无所谓待之。”人就是这么矛盾。现在的我应该处于后悔状态，后悔怎么不好好复习弱势学科。这个时候应该骂应试教育，大概吧？不过我不想这样说，太死板老套了。“英语作文才 17/20 ，要是多听点劝书写好一点不就年一了？”这样就是典型的傻逼，按照我们物理老师的话说。我又何尝不是呐，呵呵。</p><p>说到傻逼，那就是我自己了。最近最大的攻击武器是黑脸，发现没用，并且会让自己心情很糟糕。其他的下次再讲吧。</p><p>写到这里，把草东的《丑奴儿》这张专辑播完了，接下来放 Harry Styles 的《Harry’s House》吧。</p><p>现在应该享受考完试的三连休才对。</p><hr><p>很感谢你能看到这里，这篇文章很乱，我以为没人会看，但是如果你在看我还是很高兴。</p><p>建议你去听一下我提到的全部专辑吧。</p><ul><li><p>丑奴儿 - 草东没有派对</p></li><li><p>飞行器的执行周期 - 郭顶</p></li><li><p>やっぱり雨は降るんだね - ツユ</p></li><li><p>Harry’s House - Harry Styles</p></li></ul><p>希望你看到这篇文章能记住我，谢谢你。今天居然是 114 年 1 月 14 日呢，真巧。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;写在前面&lt;/p&gt;
&lt;p&gt;聊聊压力、生活、音乐和一滩烂泥。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;噢多麼美麗的一顆心&lt;/p&gt;
&lt;p&gt;怎麼會 怎麼會 就變成了一灘爛泥&lt;/p&gt;
&lt;p&gt;噢多麼單純的一首詩&lt;/p&gt;
&lt;p&gt;怎麼會 怎麼會 都變成了諷刺&lt;/p&gt;
&lt;p&gt;我想要說的 前人</summary>
      
    
    
    
    <category term="随笔" scheme="http://blog.tsumugi.icu/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="期末" scheme="http://blog.tsumugi.icu/tags/%E6%9C%9F%E6%9C%AB/"/>
    
    <category term="生活" scheme="http://blog.tsumugi.icu/tags/%E7%94%9F%E6%B4%BB/"/>
    
  </entry>
  
  <entry>
    <title>随笔之月</title>
    <link href="http://blog.tsumugi.icu/2025/01/05/essay-tsuki/"/>
    <id>http://blog.tsumugi.icu/2025/01/05/essay-tsuki/</id>
    <published>2025-01-05T08:46:50.000Z</published>
    <updated>2025-01-16T15:12:56.873Z</updated>
    
    <content type="html"><![CDATA[<p>在我心里，月亮是美好的象征，总是会把月亮看成“お月様”差不多的存在。小的时候，夜空还稍微明朗一些的时候，天上除了月亮也都其他的星星。数星星之类的正常回忆不怎么想说。在那是我觉得月亮和其他的星星没什么不同，只是大一点、明一点、有“阴晴圆缺”而已。<br>现在已经很久没看到过夜空中的星星了。对月亮感情最深的时候初一和初二。那时每天骑车上下学，晚自习下课是九点。在熟悉到不能再熟悉的、钢筋混凝土的丛林之间，只有月亮有些新意。但是月亮总不是想象中的慷慨大方的，要么是被楼房卡住视角、要么就是藏在盆地的云层之上，只有偶然转到路口时，抬头望去，月亮就挂在那栋楼上面。<br>我知道我的文笔很烂，完全讲不清楚月亮的美和我对月亮的感受。日复一日的两点一线，月亮却给了我生活中的一点“差异化”。看着月相，数着日子，能给生活创造点细微的不同。</p><p>——中秋前夕 2024/R6/113-9-16</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;在我心里，月亮是美好的象征，总是会把月亮看成“お月様”差不多的存在。小的时候，夜空还稍微明朗一些的时候，天上除了月亮也都其他的星星。数星星之类的正常回忆不怎么想说。在那是我觉得月亮和其他的星星没什么不同，只是大一点、明一点、有“阴晴圆缺”而已。&lt;br&gt;
现在已经很久没看到过</summary>
      
    
    
    
    <category term="随笔" scheme="http://blog.tsumugi.icu/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="月亮" scheme="http://blog.tsumugi.icu/tags/%E6%9C%88%E4%BA%AE/"/>
    
  </entry>
  
  <entry>
    <title>倍增 LCA 笔记</title>
    <link href="http://blog.tsumugi.icu/2025/01/05/lca-review-note/"/>
    <id>http://blog.tsumugi.icu/2025/01/05/lca-review-note/</id>
    <published>2025-01-05T08:46:50.000Z</published>
    <updated>2025-01-10T11:39:18.077Z</updated>
    
    <content type="html"><![CDATA[<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="type">int</span> fa[N],st[N][<span class="number">20</span>],dep[N];</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> f,<span class="type">int</span> d)</span></span>&#123;</span><br><span class="line">    fa[u]=f;dep[u]=d;st[u][<span class="number">0</span>]=f;</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=<span class="number">19</span>;i++)&#123;</span><br><span class="line">        st[u][i]=st[st[u][i<span class="number">-1</span>]][i<span class="number">-1</span>];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">auto</span> v:G[u])&#123;</span><br><span class="line">        <span class="keyword">if</span>(v==f||v==u) <span class="keyword">continue</span>;</span><br><span class="line">        <span class="built_in">dfs</span>(v,u,d<span class="number">+1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>以上为 <code>dfs</code> 函数。<strong><code>dfs</code> 函数的意义是预处理每个点 $N$ 向上跳跃 $2^i (0 \leq i \leq 19)$ 个节点的结果</strong>。</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">int</span> <span class="title">lca</span><span class="params">(<span class="type">int</span> x,<span class="type">int</span> y)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(dep[x]&lt;dep[y]) <span class="built_in">swap</span>(x,y);</span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> k=<span class="number">19</span>;k&gt;=<span class="number">0</span>;k--)&#123;</span><br><span class="line">        <span class="keyword">if</span>(dep[ st[x][k] ]&gt;=dep[y]) x=st[x][k];</span><br><span class="line">    &#125; </span><br><span class="line">    <span class="keyword">if</span>(x==y) <span class="keyword">return</span> x; </span><br><span class="line">    <span class="keyword">for</span>(<span class="type">int</span> k=<span class="number">19</span>;k&gt;=<span class="number">0</span>;k--)&#123;</span><br><span class="line">        <span class="keyword">if</span>(st[x][k]!=st[y][k]) x=st[x][k],y=st[y][k]; </span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> st[x][<span class="number">0</span>];</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>以上为 <code>lca</code> 函数。<strong><code>lca</code> 函数的处理分为 2 步：</strong></p><ol><li><p>保证 $dep_x \leq dep_y$ ，并向上跳跃直至 $dep_x = dep_y$ 。不妨令 $x$ 低于 $y$ ，即 $x$ 需要向上跳到与 $y$ 高度相同的节点，即若 $dep_{node(x,2^k)} \geq dep_y$ 则跳跃。当处理完毕后若 $x$ 与 $y$ 为同一节点，则返回 $x$ 。</p></li><li><p>向上寻找，迫近 $LCA(x ,y)$ 的直接儿子节点。若 $node(x,2^k)$ 与 $node(y,2^k)$ 不同，就说明 $x$ 与 $y$ 还在 $LCA(x ,y)$ 以下，则跳跃。最终返回 $node(x,2^0)$ 或 $node(y,2^0)$ ，事实上这两个点就是同一个节点。</p></li></ol><hr><p>今天是 CSP-J2/S2 的前夕。写下这篇笔记的原因是确保明天我还看得懂我写的是什么。</p><p>2024/10/25，@<a href="https://www.luogu.com.cn/user/831011">co7ahang</a> 于 SSDF 三机房。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;figure class=&quot;highlight cpp&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;</summary>
      
    
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="LCA" scheme="http://blog.tsumugi.icu/tags/LCA/"/>
    
  </entry>
  
  <entry>
    <title>题解 P11506</title>
    <link href="http://blog.tsumugi.icu/2025/01/05/solution-p11506/"/>
    <id>http://blog.tsumugi.icu/2025/01/05/solution-p11506/</id>
    <published>2025-01-05T08:45:05.000Z</published>
    <updated>2025-01-26T13:49:28.814Z</updated>
    
    <content type="html"><![CDATA[<p>题目：<a href="https://www.luogu.com.cn/problem/P11506">[ROIR 2017 Day 1] 校园</a></p><h3 id="题意">题意</h3><p>一个表格有 $n$ 行，无限多列，在每一列中要求行数为 $k$ 的倍数的格子里有 $x$ 个数，其他各自中有 $y$ 个数，格子中的数按照自然数顺序排序。共 $q$ 次询问，求给出的数 $a_1, a_2, \dots, a_q$ 在表格中的行数。</p><p>下图是一种 $n = 7$, $k = 3$, $x = 2$, $y = 3$ 的情况，同题面样例：</p><p><img src="https://cdn.luogu.com.cn/upload/image_hosting/vre6suig.png" alt=""></p><h3 id="思路">思路</h3><p>如果对于每一次询问，直接按照题意模拟填数的话，时间复杂度为 $\text{O} (qn)$ ，显然只能通过 subtask #1 。</p><p>考虑优化，规定每填 $k - 1$ 次 $y$ 和 $1$ 次 $x$ 为一个周期。</p><p>我们可以预处理出<strong>每一列填入数字的数量</strong>和<strong>一个完整周期内填入数字的数量</strong> $S_T$ 和 $S_k$  ，如果 $a_i &gt; S_T$ ， 那么 $a_i$ 所在的行数与 ${a_i}^{\prime} = a_i \bmod S_T $ (${a_i}^{\prime} &lt; S_T$) 所在的行数相同，可以缩小一定范围的常数。</p><p>接下来对于每次询问 ${a_i}^{\prime}$ ，我们可以计算出其经历了几个完整的周期，以及周期之外最后剩余的行数。这些都可以通过数学方法直接处理，时间复杂度 $\text{O} (q)$ 。</p><ul><li><p>在周期之内，计算经历了几个完整的周期，直接用 ${a_i}^{\prime}$ 整除 $S_k$ 即可。这一部分答案为周期数乘以周期 $k$ 。</p></li><li><p>在周期以外，因为每个周期前 $k-1$ 格均为 $y$ 情况，最后 $1$ 格为 $x$ 情况，我们先判断其是否在周期的最后 $1$ 行，如果是，这一部分答案即为周期 $k$ 。反之则前面每一格内数量均为 $y$ ，使用周期外数字的数量除以 $y$ ，判断一下是否整除即可。</p></li></ul><p>以样例为例， $S_T = 8$，$S_k = 19$ ，若询问 $a_1 = 50$ ，那么 ${a_1}^{\prime} = a_1 \bmod n = 12$ ， ${a_1}^{\prime}$ 经历了 $1$ 个完整的周期，最终剩余 $2$ 行，所以最终答案为 $3 + 2 = 5$ 。</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></pre></td><td class="code"><pre><span class="line"><span class="function">ll <span class="title">query</span><span class="params">(ll a)</span></span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(a==<span class="number">0</span>) <span class="keyword">return</span> n;</span><br><span class="line">    ll block=a/Sk,tmp=block*Sk;<span class="comment">// block 代表经历了几个完整周期， tmp 代表前面的周期有多少个数</span></span><br><span class="line">    <span class="comment">//printf(&quot;%lld block:%lld tmp:%lld\n&quot;,a,block,tmp);</span></span><br><span class="line">    a-=tmp;</span><br><span class="line">    <span class="keyword">if</span>(a&lt;=(k<span class="number">-1</span>)*y)&#123;<span class="comment">//全 y</span></span><br><span class="line">        <span class="keyword">if</span>(a%y) <span class="keyword">return</span> block*k+a/y<span class="number">+1</span>;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">return</span> block*k+a/y;</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;<span class="comment">//含有 x &amp; y</span></span><br><span class="line">        <span class="keyword">return</span> block*k+k;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="代码">代码</h3><p>评测记录：<a href="https://www.luogu.com.cn/record/197131297">https://www.luogu.com.cn/record/197131297</a></p><p>代码(C++)：<a href="https://www.luogu.com/paste/0ulbm2nd">https://www.luogu.com/paste/0ulbm2nd</a></p><h3 id="闲话">闲话</h3><p>很好的签到题，注意 $a_i \leq 10^{18}$ 要开 long long 。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;题目：&lt;a href=&quot;https://www.luogu.com.cn/problem/P11506&quot;&gt;[ROIR 2017 Day 1] 校园&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&quot;题意&quot;&gt;题意&lt;/h3&gt;
&lt;p&gt;一个表格有 $n$ 行，无限多列，在每一列中要求行数为 $k$ </summary>
      
    
    
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="洛谷" scheme="http://blog.tsumugi.icu/tags/%E6%B4%9B%E8%B0%B7/"/>
    
    <category term="算法" scheme="http://blog.tsumugi.icu/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="模拟" scheme="http://blog.tsumugi.icu/tags/%E6%A8%A1%E6%8B%9F/"/>
    
    <category term="ROIR" scheme="http://blog.tsumugi.icu/tags/ROIR/"/>
    
  </entry>
  
  <entry>
    <title>题解 P11496</title>
    <link href="http://blog.tsumugi.icu/2025/01/05/solution-p11496/"/>
    <id>http://blog.tsumugi.icu/2025/01/05/solution-p11496/</id>
    <published>2025-01-05T08:45:05.000Z</published>
    <updated>2025-01-26T13:49:25.530Z</updated>
    
    <content type="html"><![CDATA[<p><strong>题目：<a href="https://www.luogu.com.cn/problem/P11496">P11496 [ROIR 2019 Day 1] 完全平方</a></strong></p><h3 id="题意">题意</h3><p>给出一个整数 $k$ ，寻找 $i, j \in \mathbb{N}$ 使得 $k+i^2=j^2$ ，求 $j$ 的最小值。若没有满足的取值，则输出 <code>none</code> 。</p><h3 id="思路">思路</h3><p>对于 $k=0$ 的情况，原方程可化为 $i^2=j^2$ ，当 $i=0$ 时 $j$ 取得最小值 $0$ 。</p><p>对于 $k \neq 0$ 的情况，我们可以把原方程整理如下：</p><p>$$k=j^2-i^2$$</p><p>$$k=(j+i)(j-i)$$</p><p>令 $p=i+j$ ， $q=j-i$ ，那么 $ i=\frac{p-q}{2}$ ，$ j=\frac{p+q}{2}$ 。</p><p>我们可以从 $1$ 到 $\sqrt{|k|}$ 的范围内遍历 $k$ 的所有因数，判断此时分解出来的因数 $p,q$ 是否能化为 $k=pq=(j+i)(j-i)$ 的形式，如果可以的话就更新 $j$ 的最小值，且这个方法正负数同理。</p><p>时间复杂度 $\text{O}(\sqrt{|k|})$ 。</p><h3 id="代码">代码</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></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="meta">#<span class="keyword">include</span><span class="string">&lt;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;cmath&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="keyword">typedef</span> <span class="type">long</span> <span class="type">long</span> ll;</span><br><span class="line"><span class="type">const</span> ll inf=<span class="number">1e18</span>;</span><br><span class="line"><span class="function"><span class="keyword">inline</span> ll <span class="title">read</span><span class="params">()</span></span>&#123;</span><br><span class="line">    ll x=<span class="number">0</span>,f=<span class="number">1</span>; <span class="type">char</span> ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">while</span>(ch&lt;<span class="string">&#x27;0&#x27;</span>||ch&gt;<span class="string">&#x27;9&#x27;</span>)&#123;<span class="keyword">if</span>(ch==<span class="string">&#x27;-&#x27;</span>) f=<span class="number">-1</span>; ch=<span class="built_in">getchar</span>();&#125;</span><br><span class="line">    <span class="keyword">while</span>(ch&gt;=<span class="string">&#x27;0&#x27;</span>&amp;&amp;ch&lt;=<span class="string">&#x27;9&#x27;</span>) x=x*<span class="number">10</span>+ch-<span class="string">&#x27;0&#x27;</span>,ch=<span class="built_in">getchar</span>();</span><br><span class="line">    <span class="keyword">return</span> x*f;</span><br><span class="line">&#125;</span><br><span class="line"><span class="function"><span class="type">signed</span> <span class="title">main</span><span class="params">()</span></span>&#123;</span><br><span class="line">    ll n=<span class="built_in">read</span>(),ans=inf;</span><br><span class="line">    <span class="keyword">if</span>(n==<span class="number">0</span>)&#123;</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">&quot;0&quot;</span>);<span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(ll p=<span class="built_in">sqrt</span>(<span class="built_in">abs</span>(n));p&gt;=<span class="number">1</span>;--p)&#123;</span><br><span class="line">        ll q=n/p;</span><br><span class="line">        <span class="keyword">if</span>(p*q!=n) <span class="keyword">continue</span>;</span><br><span class="line">        <span class="keyword">if</span>(<span class="built_in">abs</span>(p+q)%<span class="number">2</span>) <span class="keyword">continue</span>;</span><br><span class="line">        ans=<span class="built_in">min</span>(ans,<span class="built_in">abs</span>(p+q)/<span class="number">2</span>);<span class="comment">//算数平方根为正 eg. p=1, q=-5 &amp; p=-1, q=5 可以一起计算</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span>(ans==inf) <span class="built_in">puts</span>(<span class="string">&quot;none&quot;</span>);</span><br><span class="line">    <span class="keyword">else</span> <span class="built_in">printf</span>(<span class="string">&quot;%lld&quot;</span>,ans);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="闲话">闲话</h3><p>想了很久怎么快速的分解因数，没想到 $\text{O}(\sqrt{|k|}) (-10^{12} \le k \le 10^{12})$ 这样就能过了……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;strong&gt;题目：&lt;a href=&quot;https://www.luogu.com.cn/problem/P11496&quot;&gt;P11496 [ROIR 2019 Day 1] 完全平方&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;题意&quot;&gt;题意&lt;/h3&gt;
&lt;p&gt;给出一个整数</summary>
      
    
    
    
    <category term="题解" scheme="http://blog.tsumugi.icu/categories/%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="洛谷" scheme="http://blog.tsumugi.icu/tags/%E6%B4%9B%E8%B0%B7/"/>
    
    <category term="算法" scheme="http://blog.tsumugi.icu/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="模拟" scheme="http://blog.tsumugi.icu/tags/%E6%A8%A1%E6%8B%9F/"/>
    
    <category term="ROIR" scheme="http://blog.tsumugi.icu/tags/ROIR/"/>
    
  </entry>
  
  <entry>
    <title>东行游记-2024</title>
    <link href="http://blog.tsumugi.icu/2024/12/31/east-trip-1/"/>
    <id>http://blog.tsumugi.icu/2024/12/31/east-trip-1/</id>
    <published>2024-12-31T15:41:57.000Z</published>
    <updated>2025-01-17T01:58:53.614Z</updated>
    
    <content type="html"><![CDATA[<h1>东行游记（上） 2024/8/16 - 2024/8/19</h1><p>暑假当头，还剩一周不到开学，决定出去闯荡一下天下，于是有了这篇文章背后的故事。</p><h2 id="引子">引子</h2><p>没记错的话是 7 月 26 日放的假。</p><p>上了两个星期的 OI 课，头昏昏，想出去玩一段时间。</p><p>上课的时候就一直摸鱼规划行程，当时差不多是这样：</p><blockquote><p>8/16 K504 成都西 - 长沙</p><p>8/18 G874 长沙南 - 武汉</p><p>8/19 MU2470 武汉天河T3 - 上海虹桥T2</p><p>8/24 上海虹桥T2 - 成都双流T2</p></blockquote><p>然后每天都在盼望着出发。</p><h2 id="2024-8-16-出发日">2024/8/16 出发日</h2><p>早上回顾了一下青猪，如果我没记错的话是红书包。</p><p><img src="/img/aobuta.jfif" alt="loading-ag-409"></p><p>匆忙的收拾了一下行囊。</p><p><img src="/img/backpack.jfif" alt="包"></p><p><img src="/img/k504.jfif" alt=""></p><p>出发的时候并没有想象中的激动，甚至有些小平静。</p><p>这大概是我有记忆以来第一次坐卧铺火车。上车之后并没有什么新鲜感，感觉挺熟悉的，和一个出去旅游的家庭换了一下铺位，就到了下铺。</p><p>一路上天气还好，广铁长段的盒饭普普通通，要价 25 CNY 。后来清库存就变成了 15 ，很伤心。</p><p>卧铺火车的旅程其实比较无聊，除了睡觉就是看风景，还是有个朋友陪着一起更有意思一点。</p><p>为了弥补自己的缺失感，在半价的时候买了两盒水果（15 CNY）。香蕉味道还说的过去，葡萄很酸，像柠檬一样，第二天早上丢了。</p><p>晚上没什么意思，全是隧道信号很差，玩了会儿《魔女的夜宴》（<em>Sabbat of the Witch</em> ）就睡了。半夜焦柳线上弯道很多，转向架加闹钟打鼾加抖音外放的多重 debuff 让人很难入睡，一整晚都是半梦半醒的状态。</p><p><img src="/img/mealt.jfif" alt="饭"></p><p><img src="/img/enshi.jfif" alt="恩施"></p><p>（湖北省，恩施土家族苗族自治州）</p><h2 id="2024-8-17">2024/8/17</h2><p>早上五点，车厢里开灯了，于是自然醒。在日出前抵达了长沙站。车站前有零零散散躺在地上睡觉的人、拖着大包小包的游客、凌晨板着脸的车站 staff 。本来想去米粉街，但是实在太饿了就随便在站前找了一家小店，味道一般，牛肉挺小块，感觉还没学校食堂的多，得到的教训是不要在火车站前找吃的。然后就堵在地铁口前等 6:20 的首班车。</p><p><img src="/img/changshasta.jfif" alt="长沙站"></p><p><img src="/img/changshametro.jfif" alt="长沙地铁"></p><p>坐上二号线，直奔橘子洲。坐着小火车，能见度有些许差但是江风很舒服，湘江很棒。去的很早所以一开始人比较少，很开心地拍下了和教员的合照，过了一会儿人就暴增了。</p><p><img src="/img/mao.jfif" alt="雕像"></p><blockquote><p>独立寒秋，湘江北去，橘子洲头。<br>看万山红遍，层林尽染；漫江碧透，百舸争流。<br>鹰击长空，鱼翔浅底，万类霜天竞自由。<br>怅寥廓，问苍茫大地，谁主沉浮?</p><p>携来百侣曾游。忆往昔峥嵘岁月稠。<br>恰同学少年，风华正茂；书生意气，挥斥方遒。<br>指点江山，激扬文字，粪土当年万户侯。<br>曾记否，到中流击水，浪遏飞舟？</p><p>——毛泽东《沁园春·长沙》</p></blockquote><p>然后坐地铁到了湖南大学站，但目标并不是湖南大学。在门口的开封菜吃了第二顿早餐，参观了岳麓书院，顺着爱晚亭登上了岳麓山。虽然根本没有做攻略，但是还是成功顺着人流成功打卡完了。</p><p><img src="/img/route.jfif" alt=""></p><p><img src="/img/mtyuelu.jfif" alt=""></p><p>爬上了山顶，然后又走了下去。</p><p>中午到了五一广场、解放区那块商圈，一不小心就打上了 maimai 。很糟心，不要学我。旅途的时间并不是用来打 mai 的，于是被朋友骂了舞萌痴。上午就暴走了两万步，下午打完 mai 却一点没有斗志，于是去酒店躺尸了很久。</p><p><img src="/img/changshaapple.jfif" alt=""></p><p><img src="/img/maimai1.jfif" alt=""></p><p><img src="/img/taiping.jfif" alt=""></p><p><img src="/img/wenheyou.jfif" alt=""></p><p><img src="/img/dufu.jfif" alt=""></p><p>解放西 → 太平老街 → 文和友 → 杜甫江阁</p><p>长沙的茶颜悦色好多，确实也很好喝www</p><p>然后晚上又去了解放西打 mai ，五台 mai 确实很难克制住自己。</p><p><img src="/img/maimai2.jfif" alt=""></p><p><img src="/img/step.jfif" alt=""></p><h2 id="2024-8-18-长沙-→-武汉">2024/8/18 长沙 → 武汉</h2><p>第二天早上起来很懒散，因为不知道去什么地方。上一天已经把我心目中的长沙逛完了，其实很想去博物馆，但是约不上。去米粉街的路上发现了一家不错的米粉，于是行路未半而中道干饭。</p><p><img src="/img/breakfast1.jfif" alt=""></p><p>然后我就真的不知道干啥了。在去长沙南站的地铁上，偶然到了天心阁这站，脑袋一热便下车了。没进去，在外面看看也不错。</p><p><img src="/img/tianxinge.jfif" alt=""></p><p>京广高铁北上，到达武汉。对比昨天的普速感觉快了很多，尽管只能跑 310 km/h 。</p><p>到了武汉，直奔黄鹤楼。很地标的景点</p><p><img src="/img/huanghelou.jfif" alt=""></p><p>下来就跑到了户部巷，吃热干面。味道很不错的说。</p><p><img src="/img/hubuxiang.jfif" alt=""></p><p>坐了长江轮渡去汉口。以前从来没坐过轮渡，发现居然能刷交通联合感觉很神奇。横渡长江只需要 1.5 CNY，这是完全没体验过的交通方式。</p><p>长江大桥，落日很美。</p><p><img src="/img/sunset.jfif" alt=""></p><p>晚上在汉口，很喜欢这些西洋建筑。</p><p><img src="/img/hankou.jfif" alt=""></p><h2 id="2024-8-19-武汉">2024/8/19 武汉</h2><p>到了武昌，很深的街区里面吃早餐。味道很好，成为了精神武汉人。</p><p><img src="/img/breakfast2.jfif" alt=""></p><p>然后逛了逛城里，具体去了什么地方忘了。</p><p>接下来去了华南海鲜市场。四年前（2024）的此地，对比今日，似乎依旧笼罩着一层灰色。</p><p><img src="/img/huanan.jfif" alt=""></p><p>去了江汉路，又开始打 maimai 。鸟加了<a href="https://www.bilibili.com/video/BV1UU4y1a7Rv/">《アマカミサマ》</a>，很开心。</p><p><img src="/img/maimai3.jfif" alt=""></p><p>去了古德寺，开始下雨。氛围超棒。</p><p><img src="/img/gudesi1.jfif" alt=""></p><p><img src="/img/gudesi2.jfif" alt=""></p><p>然后就跑去了天河国际机场，在机场被硬控的经历，且听下回分解。</p><h1>东行游记（下） 2024/8/19 - 2024/8/24</h1><p>这一部分没有什么记录诶，依靠的只有记忆、相册、朋友圈和推特了……</p><p>看看能写出什么吧。</p><p>三连休的最后一天，早起写写博客也不错吗</p><h2 id="2024-8-19-武汉天河国际机场">2024/8/19 武汉天河国际机场</h2><p>早早地就来到了机场</p><p>写不下去了，下次填坑吧（</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;东行游记（上） 2024/8/16 - 2024/8/19&lt;/h1&gt;
&lt;p&gt;暑假当头，还剩一周不到开学，决定出去闯荡一下天下，于是有了这篇文章背后的故事。&lt;/p&gt;
&lt;h2 id=&quot;引子&quot;&gt;引子&lt;/h2&gt;
&lt;p&gt;没记错的话是 7 月 26 日放的假。&lt;/p&gt;
&lt;p&gt;上了两个</summary>
      
    
    
    
    <category term="游记" scheme="http://blog.tsumugi.icu/categories/%E6%B8%B8%E8%AE%B0/"/>
    
    
    <category term="武汉" scheme="http://blog.tsumugi.icu/tags/%E6%AD%A6%E6%B1%89/"/>
    
    <category term="长沙" scheme="http://blog.tsumugi.icu/tags/%E9%95%BF%E6%B2%99/"/>
    
    <category term="旅行" scheme="http://blog.tsumugi.icu/tags/%E6%97%85%E8%A1%8C/"/>
    
    <category term="上海" scheme="http://blog.tsumugi.icu/tags/%E4%B8%8A%E6%B5%B7/"/>
    
    <category term="南京" scheme="http://blog.tsumugi.icu/tags/%E5%8D%97%E4%BA%AC/"/>
    
  </entry>
  
  <entry>
    <title>梦开始的地方</title>
    <link href="http://blog.tsumugi.icu/2024/12/31/first-article/"/>
    <id>http://blog.tsumugi.icu/2024/12/31/first-article/</id>
    <published>2024-12-31T15:41:56.000Z</published>
    <updated>2024-12-31T17:15:11.606Z</updated>
    
    <content type="html"><![CDATA[<h1>这是 Blog 的第一篇文章！</h1><p>现在是 2024/12/31 23:43 (UTC+8)，我是 co7ahang (Larry, Tsumugi)，写这篇文章很高心！</p><p>其实，这并不是我的第一个博客。大概是在 2023 年的时候，我被季节性传染病困在家里，上网课的闲来无事促使我搭建了自己的第一篇博客。说来惭愧，做的很烂，只是个半成品，<s>于是后面就删库跑路了（</s></p><p>但是还是很高兴今天能重拾这份热情，在 2024 年的最后几个小时搭建自己的博客。博客大概率会搭建到 2025 年，我居然搭了一年的博客……</p><p>总而言之，未来一片欣欣向荣！未来会在博客里写好多好多内容的！我们一起加油！</p><p>共勉</p><p>co7ahang (Larry, Tsumugi)</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h1&gt;这是 Blog 的第一篇文章！&lt;/h1&gt;
&lt;p&gt;现在是 2024/12/31 23:43 (UTC+8)，我是 co7ahang (Larry, Tsumugi)，写这篇文章很高心！&lt;/p&gt;
&lt;p&gt;其实，这并不是我的第一个博客。大概是在 2023 年的时候，我被季节性传染</summary>
      
    
    
    
    <category term="随笔" scheme="http://blog.tsumugi.icu/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="随笔" scheme="http://blog.tsumugi.icu/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>【警示自己】关于一道橙题 P1308 的心路历程</title>
    <link href="http://blog.tsumugi.icu/2023/02/27/about-p1308/"/>
    <id>http://blog.tsumugi.icu/2023/02/27/about-p1308/</id>
    <published>2023-02-27T13:45:00.000Z</published>
    <updated>2025-01-26T13:59:10.396Z</updated>
    
    <content type="html"><![CDATA[<div class="tip warning"><p>这篇文章写于初学 OI 时，转载于 <a href="https://www.luogu.com.cn/article/99llrme4">https://www.luogu.com.cn/article/99llrme4</a> 。</p><p>有错也懒得改了，只是想存下来。</p></div><h1>[NOIP2011 普及组] 统计单词数</h1><h2 id="题目描述">题目描述</h2><p>一般的文本编辑器都有查找单词的功能，该功能可以快速定位特定单词在文章中的位置，有的还能统计出特定单词在文章中出现的次数。</p><p>现在，请你编程实现这一功能，具体要求是：给定一个单词，请你输出它在给定的文章中出现的次数和第一次出现的位置。注意：匹配单词时，不区分大小写，但要求完全匹配，即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同（参见样例 1），如果给定单词仅是文章中某一单词的一部分则不算匹配（参见样例 2）。</p><h2 id="输入格式">输入格式</h2><p>共 $2$ 行。</p><p>第 $1$ 行为一个字符串，其中只含字母，表示给定单词；</p><p>第 $2$ 行为一个字符串，其中只可能包含字母和空格，表示给定的文章。</p><h2 id="输出格式">输出格式</h2><p>一行，如果在文章中找到给定单词则输出两个整数，两个整数之间用一个空格隔开，分别是单词在文章中出现的次数和第一次出现的位置（即在文章中第一次出现时，单词首字母在文章中的位置，位置从 $0$ 开始）；如果单词在文章中没有出现，则直接输出一个整数 $-1$。</p><h2 id="样例-1">样例 #1</h2><h3 id="样例输入-1">样例输入 #1</h3><figure class="highlight plaintext"><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">To</span><br><span class="line">to be or not to be is a question</span><br></pre></td></tr></table></figure><h3 id="样例输出-1">样例输出 #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">2 0</span><br></pre></td></tr></table></figure><h2 id="样例-2">样例 #2</h2><h3 id="样例输入-2">样例输入 #2</h3><figure class="highlight plaintext"><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">to</span><br><span class="line">Did the Ottoman Empire lose its power at that time</span><br></pre></td></tr></table></figure><h3 id="样例输出-2">样例输出 #2</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">-1</span><br></pre></td></tr></table></figure><h2 id="提示">提示</h2><p>数据范围</p><p>$1\leq $ 第一行单词长度 $\leq10$。</p><p>$1\leq $ 文章长度 $\leq10^6$。</p><p>noip2011 普及组第 2 题</p><hr><p><img src="https://s1.ax1x.com/2020/04/23/JwbAOA.gif" alt=""></p><hr><h1>正文开始</h1><blockquote><p>2023-02-08</p></blockquote><p>第一次理解的题意：给定一个单词和一个句子，在句子中寻找单词出现的位置和次数，大小写无区别。</p><p>思路：每次输入，每次比较，每次记录。</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></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="meta">#<span class="keyword">include</span><span class="string">&lt;string&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="meta">#<span class="keyword">define</span> str string</span></span><br><span class="line"></span><br><span class="line"><span class="function">str <span class="title">tu</span><span class="params">(str a)</span></span>&#123;<span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;a.<span class="built_in">size</span>();i++) <span class="keyword">if</span>(a[i]&gt;=<span class="string">&#x27;a&#x27;</span>&amp;&amp;a[i]&lt;=<span class="string">&#x27;z&#x27;</span>) a[i]-=<span class="number">32</span>;<span class="keyword">return</span> a;&#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">ios::<span class="built_in">sync_with_stdio</span>(<span class="number">0</span>);</span><br><span class="line">cin.<span class="built_in">tie</span>(<span class="number">0</span>);</span><br><span class="line">str nd,pre;</span><br><span class="line">cin&gt;&gt;nd;</span><br><span class="line">nd=<span class="built_in">tu</span>(nd);</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> i=<span class="number">0</span>,a1=<span class="number">0</span>,a2=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span>(cin&gt;&gt;pre)&#123;</span><br><span class="line"><span class="keyword">if</span>(<span class="built_in">tu</span>(pre)==nd) a1++,a2=i;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(!a1) cout&lt;&lt;<span class="string">&quot;-1&quot;</span>&lt;&lt;endl;</span><br><span class="line"><span class="keyword">else</span> cout&lt;&lt;a1&lt;&lt;<span class="string">&quot; &quot;</span>&lt;&lt;a2&lt;&lt;endl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>WA原因：没有考虑到位置的处理，位置的要求是第二行的位置，而不是单词位置。</p><blockquote><p>2023-02-27</p></blockquote><p>第二种思路：用<code>getline</code>，一个一个字符比较。</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></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;string&gt;</span></span></span><br><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="meta">#<span class="keyword">include</span><span class="string">&lt;cstdio&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="function">string <span class="title">ToUpper</span><span class="params">(string a)</span></span>&#123;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;a.<span class="built_in">size</span>();i++)&#123;</span><br><span class="line"><span class="keyword">if</span>(a[i]&gt;=<span class="string">&#x27;a&#x27;</span>&amp;&amp;a[i]&lt;=<span class="string">&#x27;z&#x27;</span>) a[i]+=(<span class="string">&#x27;A&#x27;</span>-<span class="string">&#x27;a&#x27;</span>); </span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">return</span> a;</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">string line,word;</span><br><span class="line">cin&gt;&gt;word;</span><br><span class="line"><span class="built_in">getline</span>(cin,line);</span><br><span class="line"><span class="built_in">getline</span>(cin,line);</span><br><span class="line">word=<span class="built_in">ToUpper</span>(word),line=<span class="built_in">ToUpper</span>(line);</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> ans1=<span class="number">0</span>,ans2=<span class="number">-1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;line.<span class="built_in">size</span>();i++)&#123;</span><br><span class="line"><span class="type">bool</span> flag=<span class="number">1</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;word.<span class="built_in">size</span>()<span class="number">-1</span>;j++)&#123;</span><br><span class="line"><span class="keyword">if</span>(line[i+j]!=word[i])&#123;</span><br><span class="line">flag=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">if</span>(flag)&#123;</span><br><span class="line">ans1++;</span><br><span class="line"><span class="keyword">if</span>(ans2==<span class="number">-1</span>) ans2=i;</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">if</span>(!ans1) cout&lt;&lt;<span class="string">&quot;-1&quot;</span>&lt;&lt;endl;</span><br><span class="line"><span class="keyword">else</span> cout&lt;&lt;ans1&lt;&lt;<span class="built_in">char</span>(<span class="number">32</span>)&lt;&lt;ans2&lt;&lt;endl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>懒得知道WA，RE的原因是啥了（数组越界？）。</p><p>早点睡了，明天用STL写。</p><blockquote><p>总结原因：写题时考虑问题全面。已经不是第一次出现这种情况了，这道题只是一个特例。有的时候写题在没有思考的情况下就看题解，然后按照题解的思路写题。希望未来的自己可以养成良好的做题习惯</p></blockquote><p><strong>First Update at</strong> <code>2023/2/27 22:02</code></p><blockquote><p>2023-3-31</p></blockquote><p>这道题在上代码不出错的情况下后面加个 空格 就完了。</p><p>懒得改了。</p><p><strong>Second Update at</strong> <code>2023/3/31 21:27</code></p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;tip warning&quot;&gt;&lt;p&gt;这篇文章写于初学 OI 时，转载于 &lt;a href=&quot;https://www.luogu.com.cn/article/99llrme4&quot;&gt;https://www.luogu.com.cn/article/99llrme4&lt;</summary>
      
    
    
    
    <category term="算法" scheme="http://blog.tsumugi.icu/categories/%E7%AE%97%E6%B3%95/"/>
    
    
    <category term="洛谷" scheme="http://blog.tsumugi.icu/tags/%E6%B4%9B%E8%B0%B7/"/>
    
    <category term="算法" scheme="http://blog.tsumugi.icu/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="模拟" scheme="http://blog.tsumugi.icu/tags/%E6%A8%A1%E6%8B%9F/"/>
    
    <category term="字符串" scheme="http://blog.tsumugi.icu/tags/%E5%AD%97%E7%AC%A6%E4%B8%B2/"/>
    
    <category term="NOIP" scheme="http://blog.tsumugi.icu/tags/NOIP/"/>
    
  </entry>
  
  <entry>
    <title>【洛谷博客】随笔一</title>
    <link href="http://blog.tsumugi.icu/2022/11/29/luogu-essay-1/"/>
    <id>http://blog.tsumugi.icu/2022/11/29/luogu-essay-1/</id>
    <published>2022-11-29T13:37:46.000Z</published>
    <updated>2025-02-08T13:39:03.136Z</updated>
    
    <content type="html"><![CDATA[<p>今天是2022年11月29日 星期二 天气：阴 温度：3~11°C</p><p>今天贼冷</p><p>中午睡午觉的时候风穿过窗子一直往我身上靠，找我贴贴（大雾）</p><p>下午考数学，题贼恶心</p><p>一道有关天干地支纪年法，右边的同学能把庚午年写成午庚年</p><p>最后压轴题更恶心，看了半个小时才看出来</p><p>临死五分钟写出来的</p><hr><p>两周前考的生物出来了，浅浅考了个班级第二（骄傲）</p><hr><p>晚自习发英语练习册，后面的马哥拿错了，就把<strong>我的练习册</strong>给写完了</p><p>就离谱</p><hr><p><s>这个博客好像真的没人看，要是有人的话，请务必留个言</s></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天是2022年11月29日 星期二 天气：阴 温度：3~11°C&lt;/p&gt;
&lt;p&gt;今天贼冷&lt;/p&gt;
&lt;p&gt;中午睡午觉的时候风穿过窗子一直往我身上靠，找我贴贴（大雾）&lt;/p&gt;
&lt;p&gt;下午考数学，题贼恶心&lt;/p&gt;
&lt;p&gt;一道有关天干地支纪年法，右边的同学能把庚午年写成午庚年&lt;/</summary>
      
    
    
    
    <category term="随笔" scheme="http://blog.tsumugi.icu/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="洛谷" scheme="http://blog.tsumugi.icu/tags/%E6%B4%9B%E8%B0%B7/"/>
    
    <category term="随笔" scheme="http://blog.tsumugi.icu/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
  <entry>
    <title>【洛谷博客】第一篇文章</title>
    <link href="http://blog.tsumugi.icu/2022/11/27/luogu-first-page/"/>
    <id>http://blog.tsumugi.icu/2022/11/27/luogu-first-page/</id>
    <published>2022-11-27T13:35:42.000Z</published>
    <updated>2025-02-08T13:38:38.413Z</updated>
    
    <content type="html"><![CDATA[<p>今天是2022年11月27日 星期日 天气：雾  温度：13~17°C</p><p>今天在学校机房上课，旁边的马*辰（@SCma）同学在一边刷入门题一边借鉴题解</p><p>那就祝他棕名罢</p><hr><p>我希望博客也许可以记录我平淡的生活罢（确信）</p><p>昨天地平线5打折，毫不犹豫就入了，花了200</p><p>昨天打CSGO，本以为可以上分，结果又白给了</p><p>今天下午还剩点作业，十篇摘抄，一堆练习册</p><p>不知道为什么我喜欢把语文作业留到最后来做</p><p>可能是因为我语文太差了罢</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天是2022年11月27日 星期日 天气：雾  温度：13~17°C&lt;/p&gt;
&lt;p&gt;今天在学校机房上课，旁边的马*辰（@SCma）同学在一边刷入门题一边借鉴题解&lt;/p&gt;
&lt;p&gt;那就祝他棕名罢&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我希望博客也许可以记录我平淡的生活罢（确信）&lt;/p&gt;
&lt;</summary>
      
    
    
    
    <category term="随笔" scheme="http://blog.tsumugi.icu/categories/%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="洛谷" scheme="http://blog.tsumugi.icu/tags/%E6%B4%9B%E8%B0%B7/"/>
    
    <category term="随笔" scheme="http://blog.tsumugi.icu/tags/%E9%9A%8F%E7%AC%94/"/>
    
  </entry>
  
</feed>
