<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh"><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://panda-ghost.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://panda-ghost.github.io/" rel="alternate" type="text/html" hreflang="zh" /><updated>2025-05-13T15:52:35+00:00</updated><id>https://panda-ghost.github.io/feed.xml</id><title type="html">PandaGhost’s Blog</title><subtitle>PandaGhost 的秘密基地</subtitle><author><name>PandaGhost</name></author><entry><title type="html">【也许你不想学】无公式复原魔方：降群法</title><link href="https://panda-ghost.github.io/2023/12/25/cube-TM.html" rel="alternate" type="text/html" title="【也许你不想学】无公式复原魔方：降群法" /><published>2023-12-25T00:00:00+00:00</published><updated>2023-12-25T00:00:00+00:00</updated><id>https://panda-ghost.github.io/2023/12/25/cube-TM</id><content type="html" xml:base="https://panda-ghost.github.io/2023/12/25/cube-TM.html"><![CDATA[<p>从小到大我们接触魔方都是从公式开始的。我们学会了魔方，却只是依靠公式的力量。要真正了解魔方，就必须抛开公式。<strong>降群法</strong>（Thistlethwaite Method）可以让你从本质上学会魔方。</p>

<!--more-->

<h2 id="群">群</h2>

<p>群是一个很好理解的数学概念，可以类比生活中的一个小团体。</p>

<p>集合 $G$ 和在集合 $G$ 上的二元运算 $\cdot$ 构成了代数结构 $(G, \cdot)$ 满足<strong>封闭性</strong>、<strong>结合律</strong>、<strong>单位元</strong>、<strong>逆元</strong>的性质称之为<strong>群</strong>。</p>

<p><strong>封闭性</strong>： $\forall x \forall y, (x, y \in G) \to (x \cdot y \in G)$</p>

<p><strong>结合律</strong>： $\forall x \forall y \forall z, (x, y, z \in G) \to ((x \cdot y) \cdot z = x \cdot (y \cdot z))$</p>

<p><strong>单位元</strong>： $\exists e, (e \in G) \wedge (\forall x, (x \in G) \to (e \cdot x = x \cdot e = x))$</p>

<p><strong>逆元</strong>： $\forall x, (x \in G) \to (\exists y, (y \in G) \wedge (x \cdot y  = y \cdot x = e))$</p>

<p>例如，整数对加法是一个群、任何一个有限集的所有置换对复合运算构成对称群。</p>

<p>群的概念很好理解，这里做初步了解即可。</p>

<h2 id="降群法初探">降群法初探</h2>

<p><strong>降群法</strong>（Thistlethwaite Method）简称 TM，最初是用于计算机解决魔方问题的。</p>

<p>它不像诸如 CFOP 和桥式一样优先复原几块或几层，这样会导致后面的步骤要求不打乱原来的部分，因而就有了公式的必要性。</p>

<p>它的总体上的思路是从整体上慢慢的恢复的有规律，看似没有一个面是复原的，而最后只需数步即可复原。</p>

<p>而使其变得有规律的方式是将魔方的状态看作群，将其慢慢的简化，直至简化成最初的状态。</p>

<p>我们来了解一下魔方的群。</p>

<h3 id="辛马斯特标记">辛马斯特标记</h3>

<p>用 <strong>U</strong>p, <strong>D</strong>own, <strong>L</strong>eft, <strong>R</strong>ight, <strong>F</strong>ront, <strong>B</strong>ack 的首字母表示表示上下左右前后六个面。</p>

<p>单独一个字母表示顺时针 $90 ^{\circ}$，加 ‘ 表示逆时针 $90 ^{\circ}$，加 2 表示转 $180 ^{\circ}$。</p>

<p>例如，U’</p>

<p><img src="https://panda-ghost.github.io/pic/cubeU_.gif" alt="U'" /></p>

<h3 id="魔方群">魔方群</h3>

<p>魔方的一次操作可以看做对于魔方的 $6\times 9=54$ 个面的置换。这样一来，我们把魔方每一个状态，看作从初始状态到这的置换。我们研究的对象从转为置换。这些置换对复合运算构成一个群。</p>

<p><strong>封闭律</strong>，显然你无论怎么转都不会出这个集合。<strong>结合率</strong>，也显然。<strong>单位元</strong>，就是什么都不转，计作 $\text{I}$。<strong>逆元</strong>，就是倒着做。</p>

<h4 id="对于魔方群-g-cdot-的描述">对于魔方群 $(G, \cdot)$ 的描述</h4>

<p>使用 $\cdot$ 表示复合运算。我们称 $S$ 为集合 $G$ 的基本元素意思是：</p>

<ol>
  <li>
    <p>$\forall x \in S, x\in G$</p>
  </li>
  <li>
    <p>$\forall x, y \in G, x\cdot y \in G$</p>
  </li>
</ol>

<p>以这种方式由 $S$ 构造 $G$。</p>

<p>用人话说，就是只使用基本元素不断组合，能转动到的状态的集合，很好理解吧。</p>

<h4 id="降群法里的群">降群法里的群</h4>

<table>
  <thead>
    <tr>
      <th> </th>
      <th>基本元素</th>
      <th>大小</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>$G0$</td>
      <td>${\text{I, U, D, L, R, F, B}}$</td>
      <td>$4.33 \times 10^{19}$</td>
    </tr>
    <tr>
      <td>$G1$</td>
      <td>${\text{I, U, D, L, R, F2, B2}}$</td>
      <td>$2.11 \times 10^{16}$</td>
    </tr>
    <tr>
      <td>$G2$</td>
      <td>${\text{I, U, D, L2, R2, F2, B2}}$</td>
      <td>$1.95 \times 10^{10}$</td>
    </tr>
    <tr>
      <td>$G3$</td>
      <td>${\text{I, U2, D2, L2, R2, F2, B2}}$</td>
      <td>$6.63 \times 10^5$</td>
    </tr>
    <tr>
      <td>$G4$</td>
      <td>${\text{I}}$</td>
      <td>$1$</td>
    </tr>
  </tbody>
</table>

<h2 id="各群的等价特征">各群的等价特征</h2>

<p>这是你在实际过程中复原的最重要的部分。我们不妨以黄面为顶，红面朝前。</p>

<h3 id="g1">G1</h3>

<p>G1 等价于<strong>棱块色相正确</strong>。什么是棱块色相正确呢？</p>

<p>因为黄白色对面，红橙色对面，蓝绿色对面。我们称上下两面的颜色为<strong>高级色</strong>，前后两面的颜色为<strong>中级色</strong>，左右两面的颜色为<strong>低级色</strong>。又称高级色比中级色高级，中级色比低级色高级，高级色比低级色高级。</p>

<p>我们称面 UR 指的是 U 面于 R 面交界的棱块上的处于 U 面的面，面 RU 指的是 U 面于 R 面交界的棱块上的处于 R 面的面。</p>

<p>面 UR:</p>

<p><img src="https://panda-ghost.github.io/pic/cube_UR.png" alt="UR" /></p>

<p>面 RU:</p>

<p><img src="https://panda-ghost.github.io/pic/cube_RU.png" alt="RU" /></p>

<p>则棱块色相正确是指 <strong>UL,UR,UF,UB,DL,DR,DF,DB,FL,FR,BL,BR 这 12 个面比对应棱块的另一个面颜色高级</strong></p>

<p>显然棱块色向正确是处于 G1 群的必要条件，因为对于初始状态，棱块色相正确。而通过 U,D,L,R,F2,B2 不会改变色相。至于充分性，留给读者作为课后思考题。</p>

<h3 id="g2">G2</h3>

<p>G2 等价于在 G1 的基础上要求<strong>上下面只有黄白色</strong>。此时由于棱块色向已经正确，可知中层的颜色只会存在对色。</p>

<p>显然其必要性也是很好理解的，因为 L,R,F,B 都只能转动 $180 ^{\circ}$，所以上下只有黄白色。</p>

<h3 id="g3">G3</h3>

<p>G3 等价于<strong>每一个面只存在原色和对色</strong>且<strong>角块相对位置正确</strong>。</p>

<p>角块相对位置正确保证角块可以恢复。</p>

<p>对于棱块，在角块复原的时候可以证明棱块只存在对色和原色与 G3 等价。对于必要性显然。至于充分性，首先可知棱块在每个中层四个棱块是一个置换。然后证明只用 U2,D2,L2,R2,F2,B2 可以实现 (1)一个中层内的三棱换 (2)两个中层各交换两个棱块。如果证明了 (1) (2) 就证明了等价性，因为不可能只存在两个棱块需要交换。</p>

<p>(1)</p>

<p>F2 R2 F2 R2 F2 R2 U2 L2 F2 U2 B2 R2 D2 B2 U2 B2 L2 U2 R2 F2 D2 R2</p>

<p><img src="https://panda-ghost.github.io/pic/cube1.gif" alt="" /></p>

<p>(2)</p>

<p>有三种情况</p>

<p>i</p>

<p>F2 R2 F2 R2 F2 R2</p>

<p><img src="https://panda-ghost.github.io/pic/cube21.gif" alt="" /></p>

<p>ii</p>

<p>U2 R2 U2 R2 U2 R2 F2 L2 D2 F2 U2 R2 F2 D2 F2 B2</p>

<p><img src="https://panda-ghost.github.io/pic/cube22.gif" alt="" /></p>

<p>iii</p>

<p>U2 L2 U2 L2 U2 L2 转化为 (1)</p>

<p><img src="https://panda-ghost.github.io/pic/cube23.gif" alt="" /></p>

<h2 id="复原方法">复原方法</h2>

<p>其实在掌握了以上的性质后，这一部分可以自己摸索。</p>

<h3 id="g0-g1">G0-&gt;G1</h3>

<p>因为 G1 等价于棱块色相正确。注意到只有 F 和 B 会改变 4 棱块的个色相。所以可以将 4 个错误的棱块放到 F 面一起解决。如果只有 2 个棱块色相不对，则将 1 个色相不对的放在 F 面，转动 F，则产生 3 个错误的色相块，与原来 1 个凑成 4 个一起解决。</p>

<h3 id="g1-g2">G1-&gt;G2</h3>

<p>要求上下面只有黄白色，可以先恢复角块，后处理棱块。</p>

<h3 id="g2-g3">G2-&gt;G3</h3>

<p>首先解决角块的相对位置。然后处理棱块。</p>

<h3 id="g3-g4">G3-&gt;G4</h3>

<p><del>乱拧一通</del>，其实这里只转 $180 ^{\circ}$ 恢复是有点困难的，可以适当使用一些非法的步骤，后面记得还原。如 U2 M U2 M’。</p>

<h2 id="思考">思考</h2>

<p>降群法最初是使用到计算机上的，现在计算机解决魔方使用的是两阶段法，也是基于降群法的。在最少步的人类方法中有一种叫 DR（多米诺降群法）的方法。</p>

<p>魔方本来是作为一个娱乐的玩意儿，但是小小的它中又有奇特的奥秘，待我们研究。这就是它的魅力。</p>]]></content><author><name>PandaGhost</name></author><category term="也许你不想学" /><category term="魔方" /><summary type="html"><![CDATA[从小到大我们接触魔方都是从公式开始的。我们学会了魔方，却只是依靠公式的力量。要真正了解魔方，就必须抛开公式。降群法（Thistlethwaite Method）可以让你从本质上学会魔方。]]></summary></entry><entry><title type="html">余杭区和临平区</title><link href="https://panda-ghost.github.io/2023/12/10/yhlp.html" rel="alternate" type="text/html" title="余杭区和临平区" /><published>2023-12-10T00:00:00+00:00</published><updated>2023-12-10T00:00:00+00:00</updated><id>https://panda-ghost.github.io/2023/12/10/yhlp</id><content type="html" xml:base="https://panda-ghost.github.io/2023/12/10/yhlp.html"><![CDATA[<!--more-->

<h2 id="地理位置">地理位置</h2>

<iframe width="850" height="600" src="https://www.amap.com/place/B023B09D38">
</iframe>

<p><img src="https://panda-ghost.github.io/pic/yh2.jpg" alt="" /></p>

<p class="info">余杭区，隶属于浙江省杭州市，地处于杭州市西、北部，东临京杭大运河，西倚天目山，南濒钱塘江，中贯东苕溪，东与拱墅区、西湖区接壤，东北与临平区相连，西与临安区为邻，西南与富阳区相接，北与德清县毗连，西北与安吉县相交，总面积940平方千米。</p>

<p class="info">临平区，浙江省杭州市下辖区，位于长三角都市群南翼、杭州市东北部，北接湖州市德清县、南濒钱塘江、西至京杭运河、东依嘉兴市海宁市，区域面积286平方千米。</p>

<h2 id="历史主要是余杭区">历史（主要是余杭区）</h2>

<ul>
  <li>
    <p><strong>马家浜文化时期</strong></p>

    <p>从余杭境内吴家埠、荀山、小古城等遗迹的发掘表明，早在7000年-6000年以前的马家浜文化时期，已有先民在此生息繁衍。</p>
  </li>
  <li>
    <p><strong>良渚文化</strong></p>

    <p>余杭区的良渚遗址，年代约为距今5300-4300年。</p>
  </li>
  <li>
    <p><strong>春秋战国</strong></p>

    <p>余杭之名，春秋时已见诸史籍，彼时先属越，后属吴，后复属越，战国中期属楚。</p>
  </li>
  <li>
    <p><strong>秦</strong></p>

    <p>秦王政二十五年（公元前222年），秦灭楚，境内置钱唐（含杭州城区）、余杭两县，属会稽郡（钱唐几经变更，到民国为杭县，余杭区系由原余杭县和杭县大部地域合并而成）</p>
  </li>
  <li>
    <p><strong>汉</strong></p>

    <p>西汉时，余杭、钱唐两县仍属会稽郡，钱唐为会稽郡西部都尉治。平帝元始四年（4年），改钱唐县为泉亭县。新王莽始建国元年（9年），改余杭县为进睦县。东汉建武元年（25年），复名余杭、钱唐</p>
  </li>
  <li>
    <p><strong>三国孙吴</strong></p>

    <p>三国时，余杭、钱唐均入孙吴版图，属吴郡，隶扬州，钱唐县并为吴郡都尉治。</p>
  </li>
  <li>
    <p><strong>隋</strong></p>

    <p>隋开皇九年（589年），废钱唐郡，改置杭州，州治初设余杭，次年移钱唐。大业三年（607年），又改杭州为余杭郡，钱唐、余杭仍为所属。</p>
  </li>
  <li>
    <p><strong>唐</strong></p>

    <p>唐武德四年（621年）复余杭郡为杭州，为避国号讳，改钱唐为钱塘。</p>
  </li>
  <li>
    <p><strong>五代十国</strong></p>

    <p>五代后梁龙德二年（922年），划钱塘、盐官两县地各半及富春县之两乡地置钱江县，与钱塘县同城设治。</p>
  </li>
  <li>
    <p><strong>宋</strong></p>

    <p>北宋太平兴国四年（979年），改钱江县为仁和县。南宋建炎三年（1129年），升杭州为临安府，属两浙西路。钱塘、仁和升赤，余杭升畿。</p>

    <p>北宋端拱元年（988年），临平建镇。</p>
  </li>
  <li>
    <p><strong>元明清</strong></p>

    <p>元至元十五年（1278年），改临安府为杭州路，钱塘、仁和、余杭属之。至正二十六年（1366年），朱元璋攻下杭州，改杭州路为杭州府。明清延之。</p>
  </li>
  <li>
    <p><strong>中华民国</strong></p>

    <p>民国元年（1912年）2月，废杭州府，以原钱塘、仁和县地并置杭县，与余杭县同属钱塘道。民国16年废道制，实行省、县二级制，划杭县城区、西湖、会堡、江干、皋塘、湖墅等地，建立杭州市。民国24年，设行政督察区。余杭属第一行政督察区，杭县属第二行政督察区。民国29年，调整行政督察区，杭县、余杭均属第一行政督察区。民国36年，杭县改为省直属县；余杭仍属第一行政督察区，7月，改属第九行政督察区。</p>
  </li>
  <li>
    <p><strong>建国以来</strong></p>

    <p>1949年5月，两县解放，余杭、杭县建制未变。</p>

    <p>1958年4月，杭县被撤销，属杭州市郊区。余杭县亦于1958年10月撤销，并入临安县。</p>

    <p>1960年1月，建立钱塘联社（县级）。</p>

    <p>1961年3月，从临安县析出原余杭县境与钱塘联社合并，4月，钱塘联社撤销，恢复县建制，定名余杭县，县治设临平镇。</p>

    <p>1994年4月，撤销余杭县，设立县级余杭市。</p>

    <p>2001年2月2日，撤销县级余杭市，设立杭州市余杭区。</p>

    <p>2021年3月11日，浙江省人民政府发布《关于调整杭州市部分行政区划的通知》。撤销杭州市余杭区，设立新的杭州市余杭区。</p>

    <p>2021年4月9日，浙江省人民政府发布《关于调整杭州市部分行政区划的通知》，设立杭州市临平区，临平区人民政府驻地临平街道西大街33号。</p>
  </li>
</ul>

<h2 id="经济">经济</h2>

<h3 id="gdp">GDP</h3>

<p><img src="https://panda-ghost.github.io/pic/yh4.png" alt="" /></p>

<p><img src="https://panda-ghost.github.io/pic/yh5.png" alt="" /></p>

<h3 id="经济综述">经济综述</h3>

<h4 id="余杭区">余杭区</h4>

<p>历史上的余杭是著名的鱼米之乡、丝绸之府，以农业发达著称。改革开放以来，余杭区经济出现重大调整，工业经济已成为国民经济的主体、财政收入的主体、劳动就业的主体。近年来，余杭区依托杭州未来科技城、余杭经济技术开发区、临平新城、良渚新城、钱江经济开发区（仁和基地）等重点产业平台，打造梦想小镇、梦栖小镇、艺尚小镇、人工智能小镇等一大批特色小镇，经济水平迅猛发展。</p>

<blockquote>
  <p><strong>未来科技城</strong></p>

  <p><strong>知名企业</strong> 阿里巴巴、字节跳动、菜鸟网络、OPPO、VIVO、同花顺、抖音</p>

  <p><strong>高等学府</strong> 杭州师范大学、中国美术学院良渚校区、中法航空大学</p>

  <p><strong>产业</strong> 电子信息产业、生物医药研发、新能源新材料研发、装备制造研发、软件等</p>

  <p><strong>发展定位</strong> 杭州城市“第三中心”</p>
</blockquote>

<h4 id="临平区">临平区</h4>

<p><img src="https://panda-ghost.github.io/pic/yh3.jpg" alt="" /></p>

<h2 id="教育">教育</h2>

<p>就高中而言，原本的余杭区有一所余杭高级中学</p>

<p><img src="https://panda-ghost.github.io/pic/yh6.webp" alt="" /></p>

<p>然后分区以后，新余杭区就没有一所好的学校，余杭高级中学改名为临平中学<del>（简称临终）</del></p>

<p>今年以后所有余杭的学生就不能考临平区的学校，所以会有很多的的学生来考西少</p>

<p>天元公学</p>

<p><img src="https://panda-ghost.github.io/pic/yh10.webp" alt="" /></p>

<h2 id="交通">交通</h2>

<p><img src="https://panda-ghost.github.io/pic/yh7.jpg" alt="" /></p>

<p>余杭穿境而过的两条高速铁路（杭宁高铁、湖杭高铁）及城市轨道交通杭州地铁2号线、杭州地铁3号线、杭州地铁5号线、杭州地铁10号线、杭州地铁16号线、杭州地铁19号线、一条铁路（宣杭铁路）、三条国道（G320、G329、G104）、五条高速公路（杭宁高速公路、杭长（宜）高速公路、杭徽高速公路、申嘉杭高速公路、杭州绕城高速公路、杭州第二绕城高速公路）、两条主要河流（东苕溪、京杭大运河）和四条省道（S101、S201、S304、S205）</p>

<p>临平区形成以“一弧三射”高速公路网为骨架（“一弧”是指杭州市绕城高速公路；“三射”是指沪杭高速公路、杭浦高速公路、申嘉湖杭高速公路），以G104、G320两条普通国道和S304、S101两条普通省道为主干，以县乡公路为补充的公路网络。沪杭高速铁路、沪杭铁路、宣杭铁路途经临平区，干线铁路网总里程达47千米，干线铁路网密度达16.4千米/百平方千米，设有临平南站。截至2021年12月，临平区有货运码头36个、客运码头1个，锚地9处、泊位103个、专用码头2个。杭州地铁3号线途经临平区，设黄鹤山站、星桥站等2座车站；杭州地铁9号线途经临平区，设乔司南站、乔司站、翁梅站、临平南高铁站、南苑站、临平站、邱山大街站、荷禹路站、五洲路站、龙安站等10座车站。</p>

<h2 id="分区小趣事">分区小趣事</h2>

<p>“临平吸血”</p>

<p>老余杭变成了新余杭</p>

<p><img src="https://panda-ghost.github.io/pic/yh19.jpeg" alt="" /></p>

<p><img src="https://panda-ghost.github.io/pic/yh20.jpeg" alt="" /></p>

<h2 id="风景名胜">风景名胜</h2>

<h3 id="良渚遗址">良渚遗址</h3>

<p><img src="https://panda-ghost.github.io/pic/yh8.webp" alt="" /></p>

<h3 id="径山">径山</h3>

<p><img src="https://panda-ghost.github.io/pic/yh9.jpg" alt="" /></p>

<h3 id="西溪湿地">西溪湿地</h3>

<p><img src="https://panda-ghost.github.io/pic/yh11.webp" alt="" /></p>

<h3 id="超山风景名胜区">超山风景名胜区</h3>

<p><img src="https://panda-ghost.github.io/pic/yh12.jpg" alt="" /></p>

<h3 id="塘栖古镇景区">塘栖古镇景区</h3>

<p><img src="https://panda-ghost.github.io/pic/yh13.webp" alt="" /></p>

<h3 id="杭州国家版本馆">杭州国家版本馆</h3>

<p><img src="https://panda-ghost.github.io/pic/yh18.jpg" alt="" /></p>

<h2 id="地方特产">地方特产</h2>

<h3 id="中泰竹笛">中泰竹笛</h3>

<p><img src="https://panda-ghost.github.io/pic/yh14.webp" alt="" /></p>

<h3 id="径山茶">径山茶</h3>

<p><img src="https://panda-ghost.github.io/pic/yh15.jpg" alt="" /></p>

<h3 id="塘栖枇杷">塘栖枇杷</h3>

<p><img src="https://panda-ghost.github.io/pic/yh16.webp" alt="" /></p>

<h3 id="鸬鸟蜜梨">鸬鸟蜜梨</h3>

<p><img src="https://panda-ghost.github.io/pic/yh17.jpg" alt="" /></p>

<h2 id="视频">视频</h2>

<div><div class="extensions extensions--video">
  <iframe src="//player.bilibili.com/player.html?bvid=1BM411V7nj&amp;page=1" frameborder="no" scrolling="no" allowfullscreen="true">
  </iframe>
</div>
</div>]]></content><author><name>PandaGhost</name></author><category term="地理" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">NOIP 退役寄</title><link href="https://panda-ghost.github.io/2023/11/20/noipafo.html" rel="alternate" type="text/html" title="NOIP 退役寄" /><published>2023-11-20T00:00:00+00:00</published><updated>2023-11-20T00:00:00+00:00</updated><id>https://panda-ghost.github.io/2023/11/20/noipafo</id><content type="html" xml:base="https://panda-ghost.github.io/2023/11/20/noipafo.html"><![CDATA[<p>退役了捏</p>

<!--more-->

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

<p>T1 一眼出，想到对每个字符串处理出了最大的排列和最小的排列，然后一个字符串是否合法就可以等价于它的最小的排列严格小于其他字符串的最大的排列的最小值，一看嘛，区间最小值嘛，就 ST 表，然后</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">string</span> <span class="nf">Min</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="p">){</span>
    <span class="kt">int</span> <span class="n">d</span><span class="o">=</span><span class="n">log2</span><span class="p">(</span><span class="n">r</span><span class="o">-</span><span class="n">l</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">max</span><span class="p">(</span><span class="n">st</span><span class="p">[</span><span class="n">d</span><span class="p">][</span><span class="n">l</span><span class="p">],</span> <span class="n">st</span><span class="p">[</span><span class="n">d</span><span class="p">][</span><span class="n">r</span><span class="o">-</span><span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">d</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">]);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Min 里面写 max，寄</p>

<p>T2 想了很久，用并查集调了很长的时间，因为一些原因对拍始终对不出来，而大样例挂掉了。</p>

<p>焦急的等待中……</p>

<p>终于在最后调出来了，最不放心的一题，竟然 A 了</p>

<p>T3 $O(n^2)$ 的 DP 当 $x_i$ 与 $y_j$ 满足关系时 $f_{i,j}=f_{i-1,j-1}\  \text{or}\  f_{i, j-1}  \  \text{or}\  f_{i-1, j}$ 否则 $f_{i, j}=0$</p>

<p>结果我 $f_{1, 1}=1$ 而不是 $x_1 \ne y_1$， 又寄</p>

<p>T4 $O(nk)$ 暴力，没什么悬念</p>

<p>大概率 1= 没了</p>

<p>小图灵 20+100+35+36=191</p>

<p>洛谷 70+100+30+36=236</p>

<p>云斗 60+100+35+36=231</p>

<p>反正是最后一年了，再也回不去从前了</p>

<p>AFO</p>

<p>PS. 实际 50+100+30+36=216</p>]]></content><author><name>PandaGhost</name></author><category term="随笔" /><summary type="html"><![CDATA[退役了捏]]></summary></entry><entry><title type="html">CSP-S 2023复赛游记</title><link href="https://panda-ghost.github.io/2023/10/28/csps2023.html" rel="alternate" type="text/html" title="CSP-S 2023复赛游记" /><published>2023-10-28T00:00:00+00:00</published><updated>2023-10-28T00:00:00+00:00</updated><id>https://panda-ghost.github.io/2023/10/28/csps2023</id><content type="html" xml:base="https://panda-ghost.github.io/2023/10/28/csps2023.html"><![CDATA[<h1 id="csp-s-2023复赛游记">CSP-S 2023复赛游记</h1>

<!--more-->

<h2 id="距离csp-s还剩2天">距离CSP-S还剩2天</h2>

<p>早上打了套题，T3 使用 int 的返回值返回了 LLONG_MAX，爆了挂了 100pts, 这为我的复赛埋下了伏笔</p>

<p>晚上口胡了一个类型 <code class="language-plaintext highlighter-rouge">ud&lt;UInt&gt;</code> 可以将无符号整数类型扩大两倍，即类似 <code class="language-plaintext highlighter-rouge">unsigned int -&gt; unsigned long long</code> 或 <code class="language-plaintext highlighter-rouge">unsigned long long -&gt; unsigned __int128</code> 从而无痛高精度，由 <a href="https://www.luogu.com.cn/user/491204">@ShwStone</a> 实现</p>

<h2 id="距离csp-s还剩1天">距离CSP-S还剩1天</h2>

<p>这天我没干什么，打了个 FHQ-Treap，挂了</p>

<h2 id="距离csp-s还剩0天">距离CSP-S还剩0天</h2>

<p>早上我又打了个 FHQ-Treap 过了文艺平衡树</p>

<p>中午早早的来到考场门口</p>

<p>下午考试，我碰到了初中同学</p>

<p>T1 看到数据范围 $n\le 8$ 直接思考暴力，仔细一想就很容易想到对于每个输入的密码最多产生81种可能，放到 <code class="language-plaintext highlighter-rouge">map</code> 里存下来即可，过了两个样例就跳了</p>

<p>T2 第一反应 $O(n^3)$ 的区间DP，第二反应是用 stack 模拟可以优化到 $O(n^2)$ ，仔细一想可以 hash 维护 stack 里的情况，写了一发单 hash 被大样例卡了，然后改成双 hash，过了所有的大样例</p>

<p>出去上了个厕所</p>

<p>回来的时候开了 T3，T3 大模拟写了很长的时间，我感觉到头昏目眩，有点重心不稳，最后还是过了大样例，感觉稳了</p>

<p>只剩半个小时，看了眼 T4 没什么思路写了个骗分</p>

<p>期望得分 100 + 100 + 100 + 0 = 300 pts</p>

<p>晚上看到小图灵上的 T1 A了</p>

<h2 id="距离csp-s还剩-1天">距离CSP-S还剩-1天</h2>

<p>早上登了 Luogu 自测了自己的代码 100 + 100 + 100 + 0 = 300 pts 符合预期</p>

<p>看到大佬 <a href="https://www.luogu.com.cn/user/491204">@ShwStone</a> AK 了</p>

<p>晚上回寝室知道自己小图灵上的分数是 100 + 90 + 65 + 0 = 255 pts 我一度以为是双哈希被卡了，因为自己用的是常见的模数</p>

<h2 id="距离csp-s还剩-2天">距离CSP-S还剩-2天</h2>

<p>重新上 Luogu 发现 T2 更新了数据把我卡到了 60 pts，我调了参数也过不了，甚至使用了三哈希</p>

<p>结果终于发现一个中间变量没有开 long long（寄）</p>

<p>然后调 T3 的 RE 发现是数组开小了（复寄） qwq~55555~</p>

<h2 id="自测分数">自测分数</h2>

<p>Luogu: 100 + 60 + 100 + 0 = 260 pts</p>

<p>云斗：100 + 85 + 80 + 5 = 270 pts</p>

<p>小图灵：100 + 90 + 65 + 0 = 255 pts</p>

<p>梦熊: 100 + 100 + 75 + 0 = 275 pts</p>

<p>最低: 100 + 60 + 65 + 0 = 225 pts</p>

<p><del>可以感受到我一开始是300pts结果挂到225pts的心情麻</del></p>

<p>考场见两次祖宗的我还有救吗</p>]]></content><author><name>PandaGhost</name></author><category term="随笔" /><summary type="html"><![CDATA[CSP-S 2023复赛游记]]></summary></entry><entry><title type="html">20230721 题组题解报告</title><link href="https://panda-ghost.github.io/2023/07/22/20230721-solution.html" rel="alternate" type="text/html" title="20230721 题组题解报告" /><published>2023-07-22T00:00:00+00:00</published><updated>2023-07-22T00:00:00+00:00</updated><id>https://panda-ghost.github.io/2023/07/22/20230721-solution</id><content type="html" xml:base="https://panda-ghost.github.io/2023/07/22/20230721-solution.html"><![CDATA[<h1 id="20230721-题组题解报告">20230721 题组题解报告</h1>

<!--more-->

<p><a href="https://github.com/Panda-Ghost/Panda-Ghost.GitHub.io"><img src="https://img.shields.io/github/stars/Panda-Ghost/Panda-Ghost.GitHub.io.svg?style=social&amp;label=My Blog Stars" alt="Github stars" /></a></p>

<h2 id="前言">前言</h2>

<p>做了此题，<del>受教练逼迫</del>特来写一篇题解</p>

<blockquote>
  <p><strong>Warning</strong></p>

  <p>为表诚意，一下题目的代码皆为完整的正确的代码，您可以拿走<a href="https://oi-wiki.org/contest/common-tricks/#%E5%AF%B9%E6%8B%8D">对拍</a>，但请不要抄袭，如果您抄袭了，我也没有办法。</p>
</blockquote>

<h2 id="t1-游戏-game">T1 游戏 (game)</h2>

<p><del>我妹有找到链接</del></p>

<h3 id="题意简述">题意简述</h3>

<p>Alice 每次有 $\frac{1}{2^p}$ 的概率 $+2^{p-1}$（$p$ 可任取），Bob 每次有 $\frac12$ 的概率 $+1$</p>

<p>Alice 先手，初值均为 $0$ ，先 $\ge n \space (1\le n \le 500)$ 者获胜，求 Alice 最优策略下获胜的概率</p>

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

<p>概率 DP，反正我考场上没有想出来。</p>

<p>以 $f_{i,j}$ 表示 Alice 先手时，Alice 剩 $i$ 分，Bob 剩 $j$ 分，Alice 先手时获胜的概率。</p>

<h4 id="状态转移方程">状态转移方程</h4>

<p>设上一轮 Alice $p$ 取值是 $k$</p>

<ol>
  <li>Alice 成功 Bob 成功 $\frac{1}{2^k} \times \frac12 \times f_{i-2^{k-1},j-1}$</li>
  <li>Alice 成功 Bob 失败 $\frac{1}{2^k} \times \frac12 \times f_{i-2^{k-1}, j}$</li>
  <li>Alice 失败 Bob 成功 $(1-\frac1{2^k})\times \frac12 \times f_{i, j-1}$</li>
  <li>Alice 失败 Bob 失败 $(1-\frac1{2^k})\times \frac12 \times f_{i, j}$</li>
</ol>

<p>所以，对于 Alice 取 $k$ 的情况</p>

\[\begin{gather}
f_{i, j}=\frac1{2^{k+1}}(f_{i-2^{k-1},j-1}+f_{i-2^{k-1},j})
+(1-\frac1{2^k})\frac12 f_{i, j-1} + 
(1-\frac1{2^k})\frac12f_{i, j} \\
\Leftrightarrow 
f_{i, j}=\frac{
    \frac1{2^k} (f_{i-2^{k-1}, j-1}+f_{i-2^{k-1}, j})+(1-\frac1{2^k})f_{i, j-1}
}
{
    1+\frac1{2^k}
}
\end{gather}\]

<p>对于所有情况</p>

\[f_{i, j}=\min_{k \in N_+} \{ \frac{
    \frac1{2^k} (f_{i-2^{k-1}, j-1}+f_{i-2^{k-1}, j})+(1-\frac1{2^k})f_{i, j-1}
}
{
    1+\frac1{2^k}
} \}\]

<h4 id="边界条件">边界条件</h4>

\[\begin{gather}f_{a, i} =1 \space (i \in [0, n], a \le 0)\\
f_{i, a} =0 \space (i \in [1, n], a \le 0)

\end{gather}\]

<p>注意 $k$ 的范围好像要枚举到 $\log_2(4n)$</p>

<p>$O(n^2\log n)$</p>

<h3 id="代码">代码</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="cp">#define FILE(x) freopen(#x".in", "r", stdin);\
                freopen(#x".out", "w", stdout)
#define REP(i, a, b) for(int i=(a); i&lt;=(b); ++i)
#define REPd(i, a, b) for(int i=(a); i&gt;=(b); --i)
</span><span class="kr">inline</span> <span class="n">ll</span> <span class="nf">rd</span><span class="p">(){</span>
    <span class="n">ll</span> <span class="n">r</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="kt">char</span> <span class="n">c</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">()))</span> <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="o">==</span><span class="sc">'-'</span><span class="p">)</span> <span class="n">k</span><span class="o">=-</span><span class="n">k</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="o">*</span><span class="mi">10</span><span class="o">+</span><span class="n">c</span><span class="o">-</span><span class="sc">'0'</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">();</span> <span class="k">return</span> <span class="n">r</span><span class="o">*</span><span class="n">k</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">N</span><span class="o">=</span><span class="mi">550</span><span class="p">;</span>
<span class="kt">long</span> <span class="kt">double</span> <span class="n">f</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="n">N</span><span class="p">],</span> <span class="n">ans</span><span class="p">;</span> <span class="c1">// long double 更精确</span>
<span class="kt">int</span> <span class="n">n</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="kt">FILE</span><span class="p">(</span><span class="n">game</span><span class="p">);</span>
    <span class="n">n</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">f</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">REP</span><span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">){</span>
        <span class="n">REP</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">15</span><span class="p">){</span>
            <span class="kt">int</span> <span class="n">tmp</span><span class="o">=</span><span class="n">i</span><span class="o">-</span><span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="p">(</span><span class="n">k</span><span class="o">-</span><span class="mi">1</span><span class="p">));</span>
            <span class="k">if</span><span class="p">(</span><span class="n">tmp</span><span class="o">&lt;</span><span class="mi">0</span><span class="p">)</span> <span class="n">tmp</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="c1">// 注意判负</span>
            <span class="kt">long</span> <span class="kt">double</span> <span class="n">t1</span><span class="o">=</span><span class="n">f</span><span class="p">[</span><span class="n">tmp</span><span class="p">][</span><span class="n">j</span><span class="p">],</span>
            <span class="n">t2</span><span class="o">=</span><span class="n">f</span><span class="p">[</span><span class="n">tmp</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span>
            <span class="n">t3</span><span class="o">=</span><span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
            <span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span><span class="o">=</span><span class="n">max</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">],</span> <span class="p">((</span><span class="mf">1.0</span><span class="o">/</span><span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">k</span><span class="p">))</span><span class="o">*</span><span class="p">(</span><span class="n">t1</span><span class="o">+</span><span class="n">t2</span><span class="p">)</span><span class="o">+</span><span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="p">(</span><span class="mf">1.0</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">k</span><span class="p">))</span><span class="o">*</span><span class="n">t3</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="mi">1</span><span class="o">+</span><span class="mf">1.0</span><span class="o">/</span><span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">k</span><span class="p">)));</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%.6f"</span><span class="p">,</span> <span class="p">(</span><span class="kt">double</span><span class="p">)</span><span class="n">f</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">n</span><span class="p">]);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="t2-秘密文件-cipher">T2 秘密文件 (cipher)</h2>

<p><a href="https://www.luogu.com.cn/problem/P2400">P2400 秘密文件 - 洛谷 计算机科学教育新生态 (luogu.com.cn)</a></p>

<h3 id="题意简述-1">题意简述</h3>

<p>将字符串进行压缩到最短，如 <code class="language-plaintext highlighter-rouge">AAAAAAAAAABABABCCD =&gt; 9(A)3(AB)CCD</code></p>

<h3 id="分析-1">分析</h3>

<p>有点 DP 的感觉</p>

<p>$f_{i, j}$ 表示 $S[i, j]$ 这段压缩到最短的长度，$Ans_{i,j}$ 表示 $S[i, j]$ 这段压缩到最短的结果</p>

\[f_{i, j}= \min_{i \le k \lt j} \{ f_{i, k} +f_{k+1, j}\}\]

<p>或者自己段重复部分压缩</p>

<p>还是看代码吧</p>

<p>$O(玄学\times n^3)$</p>

<h3 id="代码-1">代码</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="cp">#define FILE(x) freopen(#x".in", "r", stdin);\
                freopen(#x".out", "w", stdout)
#define REP(i, a, b) for(int i=(a); i&lt;=(b); ++i)
#define REPd(i, a, b) for(int i=(a); i&gt;=(b); --i)
</span><span class="kr">inline</span> <span class="n">ll</span> <span class="nf">rd</span><span class="p">(){</span>
    <span class="n">ll</span> <span class="n">r</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="kt">char</span> <span class="n">c</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">()))</span> <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="o">==</span><span class="sc">'-'</span><span class="p">)</span> <span class="n">k</span><span class="o">=-</span><span class="n">k</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="o">*</span><span class="mi">10</span><span class="o">+</span><span class="n">c</span><span class="o">-</span><span class="sc">'0'</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">();</span> <span class="k">return</span> <span class="n">r</span><span class="o">*</span><span class="n">k</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">char</span> <span class="n">ch</span><span class="p">[</span><span class="mi">110</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">f</span><span class="p">[</span><span class="mi">110</span><span class="p">][</span><span class="mi">110</span><span class="p">],</span> <span class="n">len</span><span class="p">;</span>
<span class="n">string</span> <span class="n">ans</span><span class="p">[</span><span class="mi">110</span><span class="p">][</span><span class="mi">110</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">l</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">r</span><span class="o">=</span><span class="n">len</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="n">l</span><span class="o">==</span><span class="n">r</span><span class="p">)</span> <span class="k">return</span> <span class="n">ans</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">=</span><span class="n">ch</span><span class="p">[</span><span class="n">l</span><span class="p">],</span> <span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
    <span class="k">if</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">!=</span><span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">];</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">r</span><span class="o">-</span><span class="mi">1</span><span class="p">){</span> <span class="c1">// 由 [l,k] [k+1,j] 更新</span>
        <span class="n">dfs</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">k</span><span class="p">);</span> <span class="n">dfs</span><span class="p">(</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">r</span><span class="p">);</span>
        <span class="k">if</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">==</span><span class="mi">0</span><span class="o">||</span><span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">k</span><span class="p">]</span><span class="o">+</span><span class="n">f</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">&lt;</span><span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]){</span>
            <span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">=</span><span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">k</span><span class="p">]</span><span class="o">+</span><span class="n">f</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">r</span><span class="p">];</span>
            <span class="n">ans</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">=</span><span class="n">ans</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">k</span><span class="p">]</span><span class="o">+</span><span class="n">ans</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">r</span><span class="p">];</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="p">(</span><span class="n">r</span><span class="o">-</span><span class="n">l</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="mi">2</span><span class="p">){</span> <span class="c1">// 自己有重复段, i为段长, b为段数</span>
        <span class="k">if</span><span class="p">((</span><span class="n">r</span><span class="o">-</span><span class="n">l</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">%</span><span class="n">i</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">b</span><span class="o">=</span><span class="p">(</span><span class="n">r</span><span class="o">-</span><span class="n">l</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">/</span><span class="n">i</span><span class="p">;</span>
        <span class="n">stringstream</span> <span class="n">tmp</span><span class="p">;</span>
        <span class="n">string</span> <span class="n">tmp2</span><span class="p">;</span>
        <span class="n">tmp</span><span class="o">&lt;&lt;</span><span class="n">b</span><span class="o">&lt;&lt;</span><span class="sc">'('</span><span class="p">;</span>
        <span class="n">REP</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">l</span><span class="p">,</span> <span class="n">l</span><span class="o">+</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">){</span> <span class="c1">// 暴力比较</span>
            <span class="n">REP</span><span class="p">(</span><span class="n">j</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">b</span><span class="o">-</span><span class="mi">1</span><span class="p">){</span>
                <span class="k">if</span><span class="p">(</span><span class="n">ch</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="n">j</span><span class="o">*</span><span class="n">i</span><span class="p">]</span><span class="o">!=</span><span class="n">ch</span><span class="p">[</span><span class="n">k</span><span class="o">+</span><span class="p">(</span><span class="n">j</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span><span class="o">*</span><span class="n">i</span><span class="p">]){</span>
                    <span class="k">goto</span> <span class="n">out</span><span class="p">;</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
        <span class="n">dfs</span><span class="p">(</span><span class="n">l</span><span class="p">,</span> <span class="n">l</span><span class="o">+</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
        <span class="n">tmp</span><span class="o">&lt;&lt;</span><span class="n">ans</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">l</span><span class="o">+</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">&lt;&lt;</span><span class="sc">')'</span><span class="p">;</span>
        <span class="n">tmp</span><span class="o">&gt;&gt;</span><span class="n">tmp2</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">==</span><span class="mi">0</span><span class="o">||</span><span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">&gt;</span><span class="n">tmp2</span><span class="p">.</span><span class="n">length</span><span class="p">()){</span>
            <span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">=</span><span class="n">tmp2</span><span class="p">.</span><span class="n">length</span><span class="p">();</span>
            <span class="n">ans</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">]</span><span class="o">=</span><span class="n">tmp2</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="nl">out:</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">f</span><span class="p">[</span><span class="n">l</span><span class="p">][</span><span class="n">r</span><span class="p">];</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="kt">FILE</span><span class="p">(</span><span class="n">cipher</span><span class="p">);</span>
    <span class="n">scanf</span><span class="p">(</span><span class="s">"%s"</span><span class="p">,</span> <span class="n">ch</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
    <span class="n">ch</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="sc">'!'</span><span class="p">;</span>
    <span class="n">len</span><span class="o">=</span><span class="n">strlen</span><span class="p">(</span><span class="n">ch</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="n">dfs</span><span class="p">();</span>
    <span class="n">puts</span><span class="p">(</span><span class="n">ans</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">len</span><span class="p">].</span><span class="n">c_str</span><span class="p">());</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="t3-牛的杂技-cow-acrobats">T3 牛的杂技 (Cow Acrobats)</h2>

<p><a href="http://poj.org/problem?id=3045">3045 – Cow Acrobats (poj.org)</a></p>

<h3 id="题意简述-2">题意简述</h3>

<p>序列 ${ a_i }$ 的每一项 $a_i$ 有两个属性 $a_i.w$ 和 $a_i.s$</p>

<p>求 ${a_i}$ 的一个排列使</p>

\[\max_{1\le i\le n} \{ \sum_{j=1}^{i-1} a_j.w -a_i.s\}\]

<p>最小，输出最小值即可</p>

<h3 id="分析-2">分析</h3>

<p>贪心</p>

<p>这道题我是机缘巧合做出来的</p>

<p>考场上我是先假设最大值会在 $i=n$ 时取到推出要最大化 $a_n.w+a_n.s$</p>

<p>然后又发现如果最大值在 $i=k\space (k&lt;n)$ 取到时可以推出 $\forall j&gt;i, a_i.w+a_i.s&lt;a_j.w+a_j.s$</p>

<p>然后，我<del>就没有理由的</del>大胆假设最优情况是按照 $w+s$ 升序排序</p>

<p>嗯，就 A 了</p>

<h4 id="严谨证明">严谨证明</h4>

<p>假设相邻两项分别为 $a_i$ 和 $a_{i+1}$</p>

<p>若 $a_i$ 在 $a_{i+1}$ 前更优</p>

<p>则考虑交换两项前后</p>

\[\begin{gather}
\max(\sum_{j=1}^{i-1} a_j.w-a_i.s, \sum_{j=1}^{i} a_j.w-a_{i+1}.s)
\\&lt;
\max(\sum_{j=1}^{i-1} a_j.w-a_{i+1}.s,
 \sum_{j=1}^{i-1} a_j.w+a_{i+1}.w-a_{i}.s)
\\
\Leftrightarrow
\max(-a_i.s, a_i.w-a_{i+1}.s) &lt; \max(-a_{i+1}.s, a_{i+1}.w-a_i.s)
\\
\Leftrightarrow
\max(a_{i+1}.s, a_i.w+a_i.s) &lt;\max(a_i.s, a_{i+1}.w+a_{i+1}.s)\space _{(1)}
\\

a_i.s &lt; a_i.w+a_i.s \le \max(a_{i+1}.s, a_i.w+a_i.s)\space _{(2)}
\\
(1)(2)\Rightarrow
a_i.s&lt;a_i.w+a_i.s&lt;\max(a_i.s, a_{i+1}.w+a_{i+1}.s)

\\
\Rightarrow
a_i.w+a_i.s&lt;a_{i+1}.w+a_{i+1}.s

\end{gather}\]

<p>$O(n\log n)$</p>

<h3 id="代码-2">代码</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="cp">#define FILE(x) freopen(#x".in", "r", stdin);\
                freopen(#x".out", "w", stdout)
#define REP(i, a, b) for(int i=(a); i&lt;=(b); ++i)
#define REPd(i, a, b) for(int i=(a); i&gt;=(b); --i)
</span><span class="kr">inline</span> <span class="n">ll</span> <span class="nf">rd</span><span class="p">(){</span>
    <span class="n">ll</span> <span class="n">r</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="kt">char</span> <span class="n">c</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">()))</span> <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="o">==</span><span class="sc">'-'</span><span class="p">)</span> <span class="n">k</span><span class="o">=-</span><span class="n">k</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="o">*</span><span class="mi">10</span><span class="o">+</span><span class="n">c</span><span class="o">-</span><span class="sc">'0'</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">();</span> <span class="k">return</span> <span class="n">r</span><span class="o">*</span><span class="n">k</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">N</span><span class="o">=</span><span class="mi">50050</span><span class="p">;</span>
<span class="n">ll</span> <span class="n">n</span><span class="p">,</span> <span class="n">sum</span><span class="p">,</span> <span class="n">ans</span><span class="p">;</span>
<span class="k">struct</span> <span class="nc">cow</span><span class="p">{</span>
    <span class="n">ll</span> <span class="n">w</span><span class="p">,</span> <span class="n">s</span><span class="p">;</span>
    <span class="kt">bool</span> <span class="k">operator</span><span class="o">&lt;</span><span class="p">(</span><span class="k">const</span> <span class="n">cow</span> <span class="o">&amp;</span><span class="n">y</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span> <span class="c1">// 代码多简单，我不用详述了吧</span>
        <span class="k">return</span> <span class="n">w</span><span class="o">+</span><span class="n">s</span><span class="o">&lt;</span><span class="n">y</span><span class="p">.</span><span class="n">w</span><span class="o">+</span><span class="n">y</span><span class="p">.</span><span class="n">s</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span><span class="n">c</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="kt">FILE</span><span class="p">(</span><span class="n">acrobat</span><span class="p">);</span>
    <span class="n">n</span><span class="o">=</span><span class="n">rd</span><span class="p">();</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">){</span>
        <span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">s</span><span class="o">=</span><span class="n">rd</span><span class="p">();</span>
    <span class="p">}</span>
    <span class="n">sort</span><span class="p">(</span><span class="n">c</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">c</span><span class="o">+</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
    <span class="n">ans</span><span class="o">=-</span><span class="n">c</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">s</span><span class="p">;</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">){</span>
        <span class="n">ans</span><span class="o">=</span><span class="n">max</span><span class="p">(</span><span class="n">ans</span><span class="p">,</span> <span class="n">sum</span><span class="o">-</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">s</span><span class="p">);</span>
        <span class="n">sum</span><span class="o">+=</span><span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"%lld"</span><span class="p">,</span> <span class="n">ans</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="t4-过路费-cost">T4 过路费 (cost)</h2>

<p>CodeVS 1519 <del>我妹有打开就不贴链接了</del></p>

<h3 id="题意简述-3">题意简述</h3>

<p>给定一个无向图，和 $q$ 个询问包含 $S, T$ 最小化 $S$ 到 $T$ 路径上的最大边权，每个询问输出这个值</p>

<h3 id="分析-3">分析</h3>

<p>最小生成树+LCA</p>

<p>这题还算明显…吧</p>

<p>首先是答案路径一定在最小生成树上</p>

<h4 id="简证">简证</h4>

<p>考虑两点间有多条路径</p>

<p><img src="https://panda-ghost.github.io/pic/20230721solgraph1.png" alt="一个环" /></p>

<p>如图中 4, 2 两点有 &lt;4, 5, 1, 2&gt; 和 &lt;4, 3, 2&gt; 两条路径</p>

<p>而考虑最小生成树的过程</p>

<p><img src="https://panda-ghost.github.io/pic/20230721solgraph2.png" alt="环的最小生成树" /></p>

<p>删去的边的端点一定由比它小的边连通</p>

<p>所以走树边的路径的最大边权一定小于其他路径的最大边权</p>

<p>（因为小于其中被删的边的边权）</p>

<p>证必</p>

<p>至于树上路径最大边权可以类似 LCA 的倍增方法，在维护一个 $mx[i][j]$</p>

<p>表示从 $i$ 点向上 $2^j$ 所经过的路径的边权最大值</p>

<p>更新方法</p>

<p><code class="language-plaintext highlighter-rouge">mx[i][0]=(i, fa[i]).v</code></p>

<p><code class="language-plaintext highlighter-rouge">mx[i][j]=max(mx[i][j-1], mx[pa[i][j-1]][j-1]);</code></p>

<p>$O(m\log m+q\log n)$</p>

<h3 id="代码-3">代码</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="cp">#define FILE(x) freopen(#x".in", "r", stdin);\
                freopen(#x".out", "w", stdout)
#define REP(i, a, b) for(int i=(a); i&lt;=(b); ++i)
#define REPd(i, a, b) for(int i=(a); i&gt;=(b); --i)
</span><span class="kr">inline</span> <span class="n">ll</span> <span class="nf">rd</span><span class="p">(){</span>
    <span class="n">ll</span> <span class="n">r</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="kt">char</span> <span class="n">c</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">()))</span> <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="o">==</span><span class="sc">'-'</span><span class="p">)</span> <span class="n">k</span><span class="o">=-</span><span class="n">k</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="o">*</span><span class="mi">10</span><span class="o">+</span><span class="n">c</span><span class="o">-</span><span class="sc">'0'</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">();</span> <span class="k">return</span> <span class="n">r</span><span class="o">*</span><span class="n">k</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">N</span><span class="o">=</span><span class="mi">10010</span><span class="p">,</span> <span class="n">M</span><span class="o">=</span><span class="mi">100010</span><span class="p">;</span>
<span class="n">ll</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">mx</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">30</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">fat</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">dep</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">pa</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">30</span><span class="p">];</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">ll</span><span class="o">&gt;</span> <span class="n">pil</span><span class="p">;</span> 
<span class="n">vector</span><span class="o">&lt;</span><span class="n">pil</span><span class="o">&gt;</span> <span class="n">g</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>
<span class="k">struct</span> <span class="nc">edge</span><span class="p">{</span>
    <span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">;</span> <span class="n">ll</span> <span class="n">w</span><span class="p">;</span>
    <span class="kt">bool</span> <span class="k">operator</span><span class="o">&lt;</span><span class="p">(</span><span class="k">const</span> <span class="n">edge</span> <span class="o">&amp;</span><span class="n">x</span><span class="p">)</span> <span class="k">const</span> <span class="p">{</span>
        <span class="k">return</span> <span class="n">w</span><span class="o">&lt;</span><span class="n">x</span><span class="p">.</span><span class="n">w</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span><span class="n">e</span><span class="p">[</span><span class="n">M</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">find</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">){</span>
    <span class="k">return</span> <span class="n">x</span><span class="o">==</span><span class="n">fat</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">?</span><span class="n">x</span><span class="o">:</span><span class="n">fat</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">=</span><span class="n">find</span><span class="p">(</span><span class="n">fat</span><span class="p">[</span><span class="n">x</span><span class="p">]);</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">kruskal</span><span class="p">(){</span>
    <span class="n">sort</span><span class="p">(</span><span class="n">e</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">e</span><span class="o">+</span><span class="n">m</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">m</span><span class="p">){</span>
        <span class="kt">int</span> <span class="n">a</span><span class="o">=</span><span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">=</span><span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">b</span><span class="p">,</span> <span class="n">w</span><span class="o">=</span><span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="p">;</span>
        <span class="k">if</span><span class="p">(</span><span class="n">find</span><span class="p">(</span><span class="n">a</span><span class="p">)</span><span class="o">!=</span><span class="n">find</span><span class="p">(</span><span class="n">b</span><span class="p">)){</span>
            <span class="n">g</span><span class="p">[</span><span class="n">a</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">make_pair</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">w</span><span class="p">));</span>
            <span class="n">g</span><span class="p">[</span><span class="n">b</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">make_pair</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">w</span><span class="p">));</span>
            <span class="n">fat</span><span class="p">[</span><span class="n">find</span><span class="p">(</span><span class="n">a</span><span class="p">)]</span><span class="o">=</span><span class="n">find</span><span class="p">(</span><span class="n">b</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="kt">int</span> <span class="n">fa</span><span class="o">=</span><span class="mi">0</span><span class="p">){</span>
    <span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">=</span><span class="n">dep</span><span class="p">[</span><span class="n">fa</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="n">fa</span><span class="p">;</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span> <span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="n">pa</span><span class="p">[</span><span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">mx</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="n">max</span><span class="p">(</span><span class="n">mx</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">mx</span><span class="p">[</span><span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]);</span>
    <span class="k">for</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">pil</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">i</span><span class="o">=</span><span class="n">g</span><span class="p">[</span><span class="n">x</span><span class="p">].</span><span class="n">begin</span><span class="p">();</span> <span class="n">i</span><span class="o">!=</span><span class="n">g</span><span class="p">[</span><span class="n">x</span><span class="p">].</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span>
        <span class="k">if</span><span class="p">(</span><span class="n">i</span><span class="o">-&gt;</span><span class="n">first</span><span class="o">!=</span><span class="n">fa</span><span class="p">){</span>
            <span class="n">mx</span><span class="p">[</span><span class="n">i</span><span class="o">-&gt;</span><span class="n">first</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="n">i</span><span class="o">-&gt;</span><span class="n">second</span><span class="p">;</span>
            <span class="n">dfs</span><span class="p">(</span><span class="n">i</span><span class="o">-&gt;</span><span class="n">first</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
        <span class="p">}</span>
<span class="p">}</span>
<span class="n">ll</span> <span class="n">lca_max</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">){</span>
    <span class="k">if</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">y</span><span class="p">]</span><span class="o">&gt;</span><span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="n">swap</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
    <span class="kt">int</span> <span class="n">tmp</span><span class="o">=</span><span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">-</span><span class="n">dep</span><span class="p">[</span><span class="n">y</span><span class="p">];</span> <span class="n">ll</span> <span class="n">res</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span> <span class="k">if</span><span class="p">(</span><span class="n">tmp</span><span class="o">&amp;</span><span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">i</span><span class="p">))</span> <span class="n">res</span><span class="o">=</span><span class="n">max</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">mx</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]),</span> <span class="n">x</span><span class="o">=</span><span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">];</span>
    <span class="n">REPd</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">0</span><span class="p">){</span>
        <span class="kt">int</span> <span class="n">xx</span><span class="o">=</span><span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">],</span> <span class="n">yy</span><span class="o">=</span><span class="n">pa</span><span class="p">[</span><span class="n">y</span><span class="p">][</span><span class="n">i</span><span class="p">];</span>
        <span class="k">if</span><span class="p">(</span><span class="n">xx</span><span class="o">!=</span><span class="n">yy</span><span class="p">){</span>
            <span class="n">res</span><span class="o">=</span><span class="n">max</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">mx</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]),</span> <span class="n">res</span><span class="o">=</span><span class="n">max</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">mx</span><span class="p">[</span><span class="n">y</span><span class="p">][</span><span class="n">i</span><span class="p">]);</span>
            <span class="n">x</span><span class="o">=</span><span class="n">xx</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">yy</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">x</span><span class="o">==</span><span class="n">y</span><span class="o">?</span><span class="n">res</span><span class="o">:</span><span class="n">max</span><span class="p">(</span><span class="n">res</span><span class="p">,</span> <span class="n">max</span><span class="p">(</span><span class="n">mx</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">],</span> <span class="n">mx</span><span class="p">[</span><span class="n">y</span><span class="p">][</span><span class="mi">0</span><span class="p">]));</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="kt">FILE</span><span class="p">(</span><span class="n">cost</span><span class="p">);</span>
    <span class="n">n</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">m</span><span class="o">=</span><span class="n">rd</span><span class="p">();</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">fat</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="n">i</span><span class="p">;</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span> <span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">a</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">b</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">e</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">w</span><span class="o">=</span><span class="n">rd</span><span class="p">();</span>
    <span class="n">kruskal</span><span class="p">();</span>
    <span class="n">dfs</span><span class="p">();</span>
    <span class="n">q</span><span class="o">=</span><span class="n">rd</span><span class="p">();</span>
    <span class="k">while</span><span class="p">(</span><span class="n">q</span><span class="o">--</span><span class="p">){</span>
        <span class="kt">int</span> <span class="n">s</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">t</span><span class="o">=</span><span class="n">rd</span><span class="p">();</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"%lld</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">lca_max</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="n">t</span><span class="p">));</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="t5-加工零件-work">T5 加工零件 (work)</h2>

<p><a href="https://www.luogu.com.cn/problem/P5663">P5663 [CSP-J2019] 加工零件 - 洛谷 计算机科学教育新生态 (luogu.com.cn)</a></p>

<h3 id="题意简述-4">题意简述</h3>

<p>太长了，简述不了，自己看上面的链接</p>

<h3 id="分析-4">分析</h3>

<p>分层图最短路</p>

<p>对于 $a$ 到 $1$ 号节点，如果有一条路径是偶数</p>

<p>如图，$5$ 到 $1$，上面那条路径长度是偶数</p>

<p><img src="https://panda-ghost.github.io/pic/20230721solgraph3.png" alt="5 到 1上面那条路径" /></p>

<p>所以只要 $L-4, L-6, L-8, …$  中有一个为 $0$ 即需要提供原材料</p>

<p>等价于</p>

\[L\in \{x:x=2k,x\ge E,k\in Z\}\]

<p>其中 $E$ 表示这条路径边数</p>

<p>若路径长为奇数</p>

<p><img src="https://panda-ghost.github.io/pic/20230721solgraph4.png" alt="5到1路径长为奇数" /></p>

<p>等价于</p>

\[L\in \{x:x=2k+1,x\ge E,k\in Z\}\]

<p>其中 $E$ 表示这条路径边数</p>

<p>要尽可能满足 $x \ge E$ 的条件，取最短路即可</p>

<p>所以只需找出 $1$ 到 $a$ 的奇数最短路和偶数最短路</p>

<p>考虑分层图</p>

<p><img src="https://panda-ghost.github.io/pic/20230721solgraph5.png" alt="分层图" /></p>

<p>将原来的点 $i$ 拆成 $i,0$ 和 $i,1$ 分别代表到 $i$ 时路径为偶数和奇数</p>

<p>将原来的边 $i-j$ 改成 $i,0-j,1$ 和 $i, 1-j,0$</p>

<p>然后以 $1, 0$ 为原点跑单源最短路，这里边权唯一所以跑 BFS 即可</p>

<p>当然你跑 Dijkstra 或 SPFA 也行</p>

<p>这里其实可以建图时按原图建，跑 BFS 时当作分层图跑</p>

<p>BFS：$O(n+m+q)$</p>

<h3 id="代码-4">代码</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="cp">#define FILE(x) freopen(#x".in", "r", stdin);\
                freopen(#x".out", "w", stdout)
#define REP(i, a, b) for(int i=(a); i&lt;=(b); ++i)
#define REPd(i, a, b) for(int i=(a); i&gt;=(b); --i)
</span><span class="kr">inline</span> <span class="n">ll</span> <span class="nf">rd</span><span class="p">(){</span>
    <span class="n">ll</span> <span class="n">r</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="kt">char</span> <span class="n">c</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">()))</span> <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="o">==</span><span class="sc">'-'</span><span class="p">)</span> <span class="n">k</span><span class="o">=-</span><span class="n">k</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="o">*</span><span class="mi">10</span><span class="o">+</span><span class="n">c</span><span class="o">-</span><span class="sc">'0'</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">();</span> <span class="k">return</span> <span class="n">r</span><span class="o">*</span><span class="n">k</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">N</span><span class="o">=</span><span class="mf">1e5</span><span class="o">+</span><span class="mi">10</span><span class="p">;</span>
<span class="n">ll</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">q</span><span class="p">,</span> <span class="n">d</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">2</span><span class="p">],</span> <span class="n">l</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">v</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">2</span><span class="p">];</span>
<span class="kt">char</span> <span class="n">ans</span><span class="p">[</span><span class="mi">2</span><span class="p">][</span><span class="mi">10</span><span class="p">]</span><span class="o">=</span><span class="p">{</span><span class="s">"No"</span><span class="p">,</span> <span class="s">"Yes"</span><span class="p">};</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">g</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>
<span class="cp">#define pb push_back
</span><span class="k">struct</span> <span class="nc">node</span><span class="p">{</span>
    <span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="n">f</span><span class="p">;</span>
    <span class="n">node</span><span class="p">(</span><span class="kt">int</span> <span class="n">u</span><span class="p">,</span> <span class="kt">int</span> <span class="n">f</span><span class="p">)</span><span class="o">:</span><span class="n">u</span><span class="p">(</span><span class="n">u</span><span class="p">),</span> <span class="n">f</span><span class="p">(</span><span class="n">f</span><span class="p">){}</span> 
<span class="p">};</span>
<span class="kt">void</span> <span class="n">bfs</span><span class="p">(){</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="mh">0x7f</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">d</span><span class="p">));</span>
    <span class="n">memset</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">v</span><span class="p">));</span>
    <span class="n">queue</span><span class="o">&lt;</span><span class="n">node</span><span class="o">&gt;</span> <span class="n">p</span><span class="p">;</span>
    <span class="n">d</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">v</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
    <span class="n">p</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">node</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">));</span>
    <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">p</span><span class="p">.</span><span class="n">empty</span><span class="p">()){</span>
        <span class="n">node</span> <span class="n">u</span><span class="o">=</span><span class="n">p</span><span class="p">.</span><span class="n">front</span><span class="p">();</span> <span class="n">p</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
        <span class="k">for</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">i</span><span class="o">=</span><span class="n">g</span><span class="p">[</span><span class="n">u</span><span class="p">.</span><span class="n">u</span><span class="p">].</span><span class="n">begin</span><span class="p">();</span> <span class="n">i</span><span class="o">!=</span><span class="n">g</span><span class="p">[</span><span class="n">u</span><span class="p">.</span><span class="n">u</span><span class="p">].</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">){</span>
            <span class="n">node</span> <span class="n">y</span><span class="o">=</span><span class="n">node</span><span class="p">(</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="o">-</span><span class="n">u</span><span class="p">.</span><span class="n">f</span><span class="p">);</span> <span class="c1">// 按照分层图转移</span>
            <span class="k">if</span><span class="p">(</span><span class="n">v</span><span class="p">[</span><span class="n">y</span><span class="p">.</span><span class="n">u</span><span class="p">][</span><span class="n">y</span><span class="p">.</span><span class="n">f</span><span class="p">])</span> <span class="k">continue</span><span class="p">;</span>
            <span class="n">d</span><span class="p">[</span><span class="n">y</span><span class="p">.</span><span class="n">u</span><span class="p">][</span><span class="n">y</span><span class="p">.</span><span class="n">f</span><span class="p">]</span><span class="o">=</span><span class="n">d</span><span class="p">[</span><span class="n">u</span><span class="p">.</span><span class="n">u</span><span class="p">][</span><span class="n">u</span><span class="p">.</span><span class="n">f</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
            <span class="n">v</span><span class="p">[</span><span class="n">y</span><span class="p">.</span><span class="n">u</span><span class="p">][</span><span class="n">y</span><span class="p">.</span><span class="n">f</span><span class="p">]</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
            <span class="n">p</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">y</span><span class="p">);</span>
        <span class="p">}</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="kt">FILE</span><span class="p">(</span><span class="n">work</span><span class="p">);</span>
    <span class="n">n</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">m</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">q</span><span class="o">=</span><span class="n">rd</span><span class="p">();</span>
    <span class="k">while</span><span class="p">(</span><span class="n">m</span><span class="o">--</span><span class="p">)</span> <span class="n">a</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">b</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">g</span><span class="p">[</span><span class="n">a</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">b</span><span class="p">),</span> <span class="n">g</span><span class="p">[</span><span class="n">b</span><span class="p">].</span><span class="n">pb</span><span class="p">(</span><span class="n">a</span><span class="p">);</span> <span class="c1">// 建原图</span>
    <span class="n">bfs</span><span class="p">();</span>
    <span class="k">while</span><span class="p">(</span><span class="n">q</span><span class="o">--</span><span class="p">){</span>
        <span class="n">a</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">l</span><span class="o">=</span><span class="n">rd</span><span class="p">();</span>
        <span class="c1">// 条件判断</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ans</span><span class="p">[((</span><span class="n">l</span><span class="o">&amp;</span><span class="mi">1</span><span class="p">)</span><span class="o">&amp;&amp;</span><span class="n">l</span><span class="o">&gt;=</span><span class="n">d</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span><span class="o">||</span><span class="p">((</span><span class="n">l</span><span class="o">%</span><span class="mi">2</span><span class="o">==</span><span class="mi">0</span><span class="p">)</span><span class="o">&amp;&amp;</span><span class="n">l</span><span class="o">&gt;=</span><span class="n">d</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="mi">0</span><span class="p">])]);</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="t6-奶牛政坛-cow-politics">T6 奶牛政坛 (Cow Politics)</h2>

<p><a href="https://www.luogu.com.cn/problem/P2971">P2971 [USACO10HOL] Cow Politics G - 洛谷 计算机科学教育新生态 (luogu.com.cn)</a></p>

<h3 id="题意简述-5">题意简述</h3>

<p>给定一颗树，每个节点都属于某一个集团，而且每个集团至少包括两个节点。求每个集团离得最远的两个节点（沿着双向道路行走）的距离。</p>

<h3 id="分析-5">分析</h3>

<p>直径+LCA</p>

<p>这题考场时觉得毫无头绪</p>

<p>看了题解发现这么简单</p>

<p>根据直径的性质，可以类似知道以一个根结点到每个集团内深度最深的点一定是每个集团内的“直径”中的端点</p>

<p>将其作为其集团的代表</p>

<p>求集团内每个点到他的距离取最大值即可</p>

<p>求距离可用 LCA 求</p>

<p>$O(n\log n)$</p>

<h3 id="代码-5">代码</h3>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;bits/stdc++.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="cp">#define FILE(x) freopen(#x".in", "r", stdin);\
                freopen(#x".out", "w", stdout)
#define REP(i, a, b) for(int i=(a); i&lt;=(b); ++i)
#define REPd(i, a, b) for(int i=(a); i&gt;=(b); --i)
</span><span class="kr">inline</span> <span class="n">ll</span> <span class="nf">rd</span><span class="p">(){</span>
    <span class="n">ll</span> <span class="n">r</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">k</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="kt">char</span> <span class="n">c</span><span class="p">;</span> <span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">()))</span> <span class="k">if</span><span class="p">(</span><span class="n">c</span><span class="o">==</span><span class="sc">'-'</span><span class="p">)</span> <span class="n">k</span><span class="o">=-</span><span class="n">k</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">isdigit</span><span class="p">(</span><span class="n">c</span><span class="p">))</span> <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="o">*</span><span class="mi">10</span><span class="o">+</span><span class="n">c</span><span class="o">-</span><span class="sc">'0'</span><span class="p">,</span> <span class="n">c</span><span class="o">=</span><span class="n">getchar</span><span class="p">();</span> <span class="k">return</span> <span class="n">r</span><span class="o">*</span><span class="n">k</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">N</span><span class="o">=</span><span class="mi">200010</span><span class="p">;</span>
<span class="n">ll</span> <span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">ans</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">f</span><span class="p">[</span><span class="n">N</span><span class="p">],</span> <span class="n">p</span><span class="p">,</span> <span class="n">rt</span><span class="p">,</span> <span class="n">pa</span><span class="p">[</span><span class="n">N</span><span class="p">][</span><span class="mi">30</span><span class="p">],</span> <span class="n">dep</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">g</span><span class="p">[</span><span class="n">N</span><span class="p">];</span>
<span class="kt">void</span> <span class="n">dfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="o">=</span><span class="n">rt</span><span class="p">,</span> <span class="kt">int</span> <span class="n">fa</span><span class="o">=</span><span class="mi">0</span><span class="p">){</span> <span class="c1">// 普通的 DFS</span>
    <span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">=</span><span class="n">dep</span><span class="p">[</span><span class="n">fa</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="o">=</span><span class="n">fa</span><span class="p">;</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span> <span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="n">pa</span><span class="p">[</span><span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]][</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
    <span class="k">for</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;::</span><span class="n">iterator</span> <span class="n">i</span><span class="o">=</span><span class="n">g</span><span class="p">[</span><span class="n">x</span><span class="p">].</span><span class="n">begin</span><span class="p">();</span> <span class="n">i</span><span class="o">!=</span><span class="n">g</span><span class="p">[</span><span class="n">x</span><span class="p">].</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">){</span>
        <span class="n">dfs</span><span class="p">(</span><span class="o">*</span><span class="n">i</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">lca</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">){</span> <span class="c1">// 普通的 LCA</span>
    <span class="k">if</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">&lt;</span><span class="n">dep</span><span class="p">[</span><span class="n">y</span><span class="p">])</span> <span class="n">swap</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">);</span>
    <span class="kt">int</span> <span class="n">t</span><span class="o">=</span><span class="n">dep</span><span class="p">[</span><span class="n">x</span><span class="p">]</span><span class="o">-</span><span class="n">dep</span><span class="p">[</span><span class="n">y</span><span class="p">];</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">20</span><span class="p">)</span> <span class="k">if</span><span class="p">(</span><span class="n">t</span><span class="o">&amp;</span><span class="p">(</span><span class="mi">1</span><span class="o">&lt;&lt;</span><span class="n">i</span><span class="p">))</span> <span class="n">x</span><span class="o">=</span><span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">];</span>
    <span class="n">REPd</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">0</span><span class="p">){</span>
        <span class="kt">int</span> <span class="n">xx</span><span class="o">=</span><span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="n">i</span><span class="p">],</span> <span class="n">yy</span><span class="o">=</span><span class="n">pa</span><span class="p">[</span><span class="n">y</span><span class="p">][</span><span class="n">i</span><span class="p">];</span>
        <span class="k">if</span><span class="p">(</span><span class="n">xx</span><span class="o">!=</span><span class="n">yy</span><span class="p">)</span> <span class="n">x</span><span class="o">=</span><span class="n">xx</span><span class="p">,</span> <span class="n">y</span><span class="o">=</span><span class="n">yy</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">x</span><span class="o">==</span><span class="n">y</span><span class="o">?</span><span class="n">x</span><span class="o">:</span><span class="n">pa</span><span class="p">[</span><span class="n">x</span><span class="p">][</span><span class="mi">0</span><span class="p">];</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">main</span><span class="p">(){</span>
    <span class="kt">FILE</span><span class="p">(</span><span class="n">cowpol</span><span class="p">);</span>
    <span class="n">n</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">k</span><span class="o">=</span><span class="n">rd</span><span class="p">();</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">p</span><span class="o">=</span><span class="n">rd</span><span class="p">(),</span> <span class="n">g</span><span class="p">[</span><span class="n">p</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">i</span><span class="p">),</span> <span class="n">rt</span><span class="o">=</span><span class="n">p</span><span class="o">==</span><span class="mi">0</span><span class="o">?</span><span class="n">i</span><span class="o">:</span><span class="n">rt</span><span class="p">;</span>
    <span class="n">dfs</span><span class="p">();</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="k">if</span><span class="p">(</span><span class="n">dep</span><span class="p">[</span><span class="n">f</span><span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]]]</span><span class="o">&lt;</span><span class="n">dep</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="n">f</span><span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span><span class="o">=</span><span class="n">i</span><span class="p">;</span> <span class="c1">// 每个集团的最远点</span>
    <span class="c1">// 集团距离更新</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">)</span> <span class="n">ans</span><span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span><span class="o">=</span><span class="n">max</span><span class="p">(</span><span class="n">ans</span><span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]],</span> <span class="n">dep</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">+</span><span class="n">dep</span><span class="p">[</span><span class="n">f</span><span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]]]</span><span class="o">-</span><span class="mi">2</span><span class="o">*</span><span class="n">dep</span><span class="p">[</span><span class="n">lca</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="n">f</span><span class="p">[</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]])]);</span>
    <span class="n">REP</span><span class="p">(</span><span class="n">i</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">k</span><span class="p">)</span> <span class="n">printf</span><span class="p">(</span><span class="s">"%lld</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">ans</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="t7-先咕着">T7 先咕着</h2>]]></content><author><name>PandaGhost</name></author><category term="题解" /><summary type="html"><![CDATA[20230721 题组题解报告]]></summary></entry><entry><title type="html">你好</title><link href="https://panda-ghost.github.io/2023/07/17/welcome.html" rel="alternate" type="text/html" title="你好" /><published>2023-07-17T00:00:00+00:00</published><updated>2023-07-17T00:00:00+00:00</updated><id>https://panda-ghost.github.io/2023/07/17/welcome</id><content type="html" xml:base="https://panda-ghost.github.io/2023/07/17/welcome.html"><![CDATA[<h1 id="你好">你好</h1>]]></content><author><name>PandaGhost</name></author><category term="其他" /><summary type="html"><![CDATA[你好]]></summary></entry></feed>