<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>淼畔</title><description>淼畔</description><link>https://xn--24wq0n.top/</link><language>zh_CN</language><item><title>解决 MCSM 面板不能直接使用 run 启动 run.bat 作为启动命令的问题</title><link>https://xn--24wq0n.top/posts/2026-04-05-%E8%A7%A3%E5%86%B3_mcsm_%E9%9D%A2%E6%9D%BF%E4%B8%8D%E8%83%BD%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8_run_%E4%BD%9C%E4%B8%BA%E5%90%AF%E5%8A%A8%E5%91%BD%E4%BB%A4%E5%90%AF%E5%8A%A8_runbat_%E7%9A%84%E9%97%AE%E9%A2%98/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2026-04-05-%E8%A7%A3%E5%86%B3_mcsm_%E9%9D%A2%E6%9D%BF%E4%B8%8D%E8%83%BD%E7%9B%B4%E6%8E%A5%E4%BD%BF%E7%94%A8_run_%E4%BD%9C%E4%B8%BA%E5%90%AF%E5%8A%A8%E5%91%BD%E4%BB%A4%E5%90%AF%E5%8A%A8_runbat_%E7%9A%84%E9%97%AE%E9%A2%98/</guid><pubDate>Sun, 05 Apr 2026 19:25:00 GMT</pubDate><content:encoded>&lt;p&gt;在 Windows Server 中使用 MCSM 面板时，某次版本更新后遇到不能直接使用 run 启动 run.bat 作为启动命令的问题。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;.%5Cimages%5C11d51ad88ed23fc4de04feb547c0ff8c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;↑错误截图示例&lt;/p&gt;
&lt;p&gt;仔细分析后发现，是由于7491d7e7提交（或者说v10.11.0）开始，实例默认不开启仿真终端导致的。只要在终端设置里开启仿真终端即可正常启动。&lt;/p&gt;
</content:encoded></item><item><title>禁用 Firefox 全屏提示和动画</title><link>https://xn--24wq0n.top/posts/2026-03-03-%E7%A6%81%E7%94%A8_firefox_%E5%85%A8%E5%B1%8F%E6%8F%90%E7%A4%BA%E5%92%8C%E5%8A%A8%E7%94%BB/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2026-03-03-%E7%A6%81%E7%94%A8_firefox_%E5%85%A8%E5%B1%8F%E6%8F%90%E7%A4%BA%E5%92%8C%E5%8A%A8%E7%94%BB/</guid><pubDate>Tue, 03 Mar 2026 22:50:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;code&gt;about:config&lt;/code&gt; 里面，&lt;br /&gt;
&lt;code&gt;full-screen-api.warning.timeout&lt;/code&gt; 设为 $0$，&lt;br /&gt;
&lt;code&gt;full-screen-api.transition-duration.enter&lt;/code&gt; 和 &lt;code&gt;full-screen-api.transition-duration.leave&lt;/code&gt; 设为 &lt;code&gt;0 0&lt;/code&gt;。&lt;/p&gt;
</content:encoded></item><item><title>把 GitHub 网站上显示的提交消息全部替换成“修复了一些已知问题”</title><link>https://xn--24wq0n.top/posts/2026-02-10-%E6%8A%8A_github_%E7%BD%91%E7%AB%99%E4%B8%8A%E6%98%BE%E7%A4%BA%E7%9A%84%E6%8F%90%E4%BA%A4%E6%B6%88%E6%81%AF%E5%85%A8%E9%83%A8%E6%9B%BF%E6%8D%A2%E6%88%90%E4%BF%AE%E5%A4%8D%E4%BA%86%E4%B8%80%E4%BA%9B%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2026-02-10-%E6%8A%8A_github_%E7%BD%91%E7%AB%99%E4%B8%8A%E6%98%BE%E7%A4%BA%E7%9A%84%E6%8F%90%E4%BA%A4%E6%B6%88%E6%81%AF%E5%85%A8%E9%83%A8%E6%9B%BF%E6%8D%A2%E6%88%90%E4%BF%AE%E5%A4%8D%E4%BA%86%E4%B8%80%E4%BA%9B%E5%B7%B2%E7%9F%A5%E9%97%AE%E9%A2%98/</guid><pubDate>Tue, 10 Feb 2026 17:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;安装方法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;安装浏览器插件 &lt;a href=&quot;https://www.tampermonkey.net/&quot;&gt;Tampermonkey&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;打开 &lt;a href=&quot;https://greasyfork.org/zh-CN/scripts/565802&quot;&gt;Greasy Fork 发布页&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;点击安装按钮，确认安装。&lt;/li&gt;
&lt;li&gt;刷新 GitHub 页面，享受清爽的阅读体验。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;效果演示&lt;/h2&gt;
&lt;h3&gt;安装前&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./images/2026-02-10-2.png&quot; alt=&quot;安装前&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;安装后&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./images/2026-02-10-1.png&quot; alt=&quot;安装后&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;仓库地址&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/miaopan607/fixed-some-known-issues&quot;&gt;GitHub 仓库&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;免责声明&lt;/h2&gt;
&lt;p&gt;本脚本仅供娱乐，请勿在需要认真审查代码变更的生产环境中使用（笑）。&lt;/p&gt;
</content:encoded></item><item><title>当你发现 TRAE 对 Java 环境变量改变无动于衷</title><link>https://xn--24wq0n.top/posts/2026-02-03-%E5%BD%93%E4%BD%A0%E5%8F%91%E7%8E%B0_trae_%E5%AF%B9_java_%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E6%94%B9%E5%8F%98%E6%97%A0%E5%8A%A8%E4%BA%8E%E8%A1%B7/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2026-02-03-%E5%BD%93%E4%BD%A0%E5%8F%91%E7%8E%B0_trae_%E5%AF%B9_java_%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E6%94%B9%E5%8F%98%E6%97%A0%E5%8A%A8%E4%BA%8E%E8%A1%B7/</guid><description>气死我嘞！</description><pubDate>Tue, 03 Feb 2026 20:40:00 GMT</pubDate><content:encoded>&lt;p&gt;如果你们使用TRAE的时候发现改了Java的环境变量结果死都不能应用到终端，可能是这个干的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2026-02-03-1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;直接禁用就好了。不要问我怎么知道的。&lt;/p&gt;
</content:encoded></item><item><title>闲得没事还是别折腾 Astro 了</title><link>https://xn--24wq0n.top/posts/2026-01-31-%E9%97%B2%E5%BE%97%E6%B2%A1%E4%BA%8B%E8%BF%98%E6%98%AF%E5%88%AB%E6%8A%98%E8%85%BE_astro_%E4%BA%86/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2026-01-31-%E9%97%B2%E5%BE%97%E6%B2%A1%E4%BA%8B%E8%BF%98%E6%98%AF%E5%88%AB%E6%8A%98%E8%85%BE_astro_%E4%BA%86/</guid><description>就挺折腾的。（</description><pubDate>Sat, 31 Jan 2026 21:20:00 GMT</pubDate><content:encoded>&lt;p&gt;就挺折腾的。（&lt;/p&gt;
</content:encoded></item><item><title>AI Studio GPU 占用过高导致卡顿的解决办法</title><link>https://xn--24wq0n.top/posts/2025-12-07-ai_studio_gpu_%E5%8D%A0%E7%94%A8%E8%BF%87%E9%AB%98%E5%AF%BC%E8%87%B4%E5%8D%A1%E9%A1%BF%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2025-12-07-ai_studio_gpu_%E5%8D%A0%E7%94%A8%E8%BF%87%E9%AB%98%E5%AF%BC%E8%87%B4%E5%8D%A1%E9%A1%BF%E7%9A%84%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95/</guid><description>loading-indicator { display: none !important; } .turn-footer.ng-star-inserted { display: none; }</description><pubDate>Sun, 07 Dec 2025 18:20:00 GMT</pubDate><content:encoded>&lt;pre&gt;&lt;code&gt;loading-indicator {
    display: none !important;
}

.turn-footer.ng-star-inserted {
    display: none;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Firefox 禁用按下 Alt 显示菜单</title><link>https://xn--24wq0n.top/posts/2025-12-03-firefox_%E7%A6%81%E7%94%A8%E6%8C%89%E4%B8%8B_alt_%E6%98%BE%E7%A4%BA%E8%8F%9C%E5%8D%95/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2025-12-03-firefox_%E7%A6%81%E7%94%A8%E6%8C%89%E4%B8%8B_alt_%E6%98%BE%E7%A4%BA%E8%8F%9C%E5%8D%95/</guid><description>进入 about:config，将 ui.key.menuAccessKey 默认的 18 改成 0，重启浏览器。</description><pubDate>Wed, 03 Dec 2025 20:15:00 GMT</pubDate><content:encoded>&lt;p&gt;进入 &lt;code&gt;about:config&lt;/code&gt;，将 &lt;code&gt;ui.key.menuAccessKey&lt;/code&gt; 默认的 &lt;code&gt;18&lt;/code&gt; 改成 &lt;code&gt;0&lt;/code&gt;，重启浏览器。&lt;/p&gt;
</content:encoded></item><item><title>题解：Kuangyeye&apos;s Random Number</title><link>https://xn--24wq0n.top/posts/2025-12-03-%E9%A2%98%E8%A7%A3_kuangyeye_39_s_random_number/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2025-12-03-%E9%A2%98%E8%A7%A3_kuangyeye_39_s_random_number/</guid><description>这是一道 Hunan University Judge Online 的题目。题目链接：Kuangyeye&apos;s Random Number Problem Description Kuangy</description><pubDate>Wed, 03 Dec 2025 13:30:00 GMT</pubDate><content:encoded>&lt;p&gt;这是一道 Hunan University Judge Online 的题目。题目链接：&lt;a href=&quot;http://115.157.200.87/front/problem?problemId=1006&quot;&gt;Kuangyeye&apos;s Random Number&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Problem Description&lt;/h2&gt;
&lt;p&gt;Kuangyeye has a random number in range [0,1023],now he wants to you guess it.&lt;/p&gt;
&lt;h2&gt;Input&lt;/h2&gt;
&lt;p&gt;No input&lt;/p&gt;
&lt;h2&gt;Output&lt;/h2&gt;
&lt;p&gt;output contains one integer,representing Kuangyeye’s random number&lt;/p&gt;
&lt;h2&gt;Sample Input&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;no input&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Sample Output&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;100&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Note&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Sample output may not be the answer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;print(276)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Windows 的一些设置</title><link>https://xn--24wq0n.top/posts/2025-12-02-windows_%E7%9A%84%E4%B8%80%E4%BA%9B%E8%AE%BE%E7%BD%AE/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2025-12-02-windows_%E7%9A%84%E4%B8%80%E4%BA%9B%E8%AE%BE%E7%BD%AE/</guid><description>使用 S3 睡眠模式 reg add HKLM\System\CurrentControlSet\Control\Power /v PlatformAoAcOverride /t REG_DWORD </description><pubDate>Tue, 02 Dec 2025 15:31:00 GMT</pubDate><content:encoded>&lt;h2&gt;使用 S3 睡眠模式&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;reg add HKLM\System\CurrentControlSet\Control\Power /v PlatformAoAcOverride /t REG_DWORD /d 0
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;开机默认启用 NumLock&lt;/h2&gt;
&lt;p&gt;注册表 &lt;code&gt;HKEY_USERS\.DEFAULT\Control Panel\Keyboard&lt;/code&gt; 键 &lt;code&gt;InitialKeyboardIndicators&lt;/code&gt; 值改为 &lt;code&gt;2&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;开启和关闭临时 IPv6 地址&lt;/h2&gt;
&lt;p&gt;关闭&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;netsh interface ipv6 set privacy state=disabled
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;开启&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;netsh interface ipv6 set privacy state=enabled
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;禁止鼠标唤醒&lt;/h2&gt;
&lt;p&gt;到设备管理器里，除了鼠标要禁用唤醒，还要把一个叫键盘的也禁用唤醒。&lt;/p&gt;
</content:encoded></item><item><title>薄荷输入法配置</title><link>https://xn--24wq0n.top/posts/2025-12-02-%E8%96%84%E8%8D%B7%E8%BE%93%E5%85%A5%E6%B3%95%E9%85%8D%E7%BD%AE/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2025-12-02-%E8%96%84%E8%8D%B7%E8%BE%93%E5%85%A5%E6%B3%95%E9%85%8D%E7%BD%AE/</guid><description>右键输入法，选择“用户文件夹”。 启用微软双拼 打开 default.yaml，把微软双拼取消注释，其他不用的可以注释掉，提高部署速度。 右键输入法，部署。可通过 Ctrl + ` 切换方案。 更改候</description><pubDate>Tue, 02 Dec 2025 11:32:00 GMT</pubDate><content:encoded>&lt;p&gt;右键输入法，选择“用户文件夹”。&lt;/p&gt;
&lt;h2&gt;启用微软双拼&lt;/h2&gt;
&lt;p&gt;打开 &lt;code&gt;default.yaml&lt;/code&gt;，把微软双拼取消注释，其他不用的可以注释掉，提高部署速度。
右键输入法，部署。可通过 &lt;code&gt;Ctrl + ` &lt;/code&gt; 切换方案。&lt;/p&gt;
&lt;h2&gt;更改候选词个数、最大输入长度&lt;/h2&gt;
&lt;p&gt;创建 &lt;code&gt;double_pinyin_mspy.custom.yaml&lt;/code&gt;，填入以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;patch:
  &quot;menu/page_size&quot;: 7
  codeLengthLimit_processor: 100
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;候选词水平排列&lt;/h2&gt;
&lt;p&gt;打开 &lt;code&gt;weasel.custom.yaml&lt;/code&gt;，填入以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;patch:
  # stacked | linear | tabled 候选项排列方向(如果希望水平，设置linear)
  style/candidate_list_layout: linear
  style/horizontal: true
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装万象拼音模型&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/amzxyz/RIME-LMDG&quot;&gt;在这里下载模型&lt;/a&gt;，格式为.gram，移动到用户文件夹，创建 &lt;code&gt;double_pinyin_mspy.custom.yaml&lt;/code&gt;，填入以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;patch:
  # 语言模型
  &quot;grammar/language&quot;: wanxiang-lts-zh-hans
  &quot;grammar/collocation_max_length&quot;: 5
  &quot;grammar/collocation_min_length&quot;: 2

  # translator 内加载
  &quot;translator/contextual_suggestions&quot;: true
  &quot;translator/max_homophones&quot;: 7
  &quot;translator/max_homographs&quot;: 7
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;关闭一些快捷键&lt;/h2&gt;
&lt;p&gt;打开 &lt;code&gt;default.yaml&lt;/code&gt;，在 &lt;code&gt;key_binder&lt;/code&gt; 和 &lt;code&gt;ascii_composer&lt;/code&gt; 那里自己注释掉一些。&lt;/p&gt;
&lt;h2&gt;关闭双拼编码转义&lt;/h2&gt;
&lt;p&gt;打开或创建 &lt;code&gt;double_pinyin_mspy.custom.yaml&lt;/code&gt;，添加：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;patch:
  &quot;translator/preedit_format&quot;: []
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;输入首字母被吞等奇怪问题&lt;/h2&gt;
&lt;p&gt;打开 &lt;code&gt;weasel.custom.yaml&lt;/code&gt;，填入以下内容：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;patch:
  style/inline_preedit: true
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;导入词库&lt;/h2&gt;
&lt;p&gt;不会！（即答）&lt;/p&gt;
</content:encoded></item><item><title>小白被 Linux 玩随便记录点东西</title><link>https://xn--24wq0n.top/posts/2025-11-28-%E5%B0%8F%E7%99%BD%E8%A2%AB_linux_%E7%8E%A9%E9%9A%8F%E4%BE%BF%E8%AE%B0%E5%BD%95%E7%82%B9%E4%B8%9C%E8%A5%BF/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2025-11-28-%E5%B0%8F%E7%99%BD%E8%A2%AB_linux_%E7%8E%A9%E9%9A%8F%E4%BE%BF%E8%AE%B0%E5%BD%95%E7%82%B9%E4%B8%9C%E8%A5%BF/</guid><description>声明：本文有大量内容由 AI 生成，但是这些内容均经过验证（特殊标注除外）。 关闭动画 第一步：关闭 KDE 桌面本身的动画（窗口、菜单等） 这一步会让你的开始菜单、窗口最大化/最小化变得瞬间完成。 </description><pubDate>Fri, 28 Nov 2025 16:30:00 GMT</pubDate><content:encoded>&lt;p&gt;声明：本文有大量内容由 AI 生成，但是这些内容均经过验证（特殊标注除外）。&lt;/p&gt;
&lt;h2&gt;关闭动画&lt;/h2&gt;
&lt;h3&gt;第一步：关闭 KDE 桌面本身的动画（窗口、菜单等）&lt;/h3&gt;
&lt;p&gt;这一步会让你的开始菜单、窗口最大化/最小化变得瞬间完成。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;strong&gt;系统设置 (System Settings)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;进入 &lt;strong&gt;工作区行为 (Workspace Behavior)&lt;/strong&gt; -&amp;gt; &lt;strong&gt;常规行为 (General Behavior)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;找到 &lt;strong&gt;动画速度 (Animation speed)&lt;/strong&gt; 选项。&lt;/li&gt;
&lt;li&gt;将滑块一直拉到最右侧的 &lt;strong&gt;“即时 (Instant)”&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;点击应用。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 此时，KDE 的所有原生窗口、菜单弹出将不再有过渡动画。但这一步通常&lt;strong&gt;不会&lt;/strong&gt;影响 QQ 或 Chrome 内部的网页滚动效果。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;第二步：强制第三方应用（QQ、浏览器等）关闭动画&lt;/h3&gt;
&lt;p&gt;大多数现代 Linux 应用（包括 Linux 版 QQ、Chrome、Firefox）都是基于 GTK 或 Electron 开发的。它们并不直接读取 KDE 的动画设置，而是读取一个标准的 GTK 配置文件。我们需要手动创建这个配置来告诉它们“请勿播放动画”。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开你的终端（Konsole）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;复制并运行以下命令（这是一条命令，直接复制粘贴回车即可）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mkdir -p ~/.config/gtk-3.0 ~/.config/gtk-4.0 &amp;amp;&amp;amp; \
echo -e &quot;[Settings]\ngtk-enable-animations=0\ngtk-primary-button-warps-slider=0&quot; | tee ~/.config/gtk-3.0/settings.ini ~/.config/gtk-4.0/settings.ini
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;如果命令执行后没有报错，就是成功了。&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;原理说明：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gtk-enable-animations=0&lt;/code&gt;：这是核心。它告诉所有读取 GTK 配置的应用（包括 QQ、Chrome、Firefox）&lt;strong&gt;全局禁用动画&lt;/strong&gt;。这通常会自动触发网页和应用内的“减少运动 (prefers-reduced-motion)”模式，从而关闭平滑滚动。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gtk-primary-button-warps-slider=0&lt;/code&gt;（可选）：这会让滚动条点击行为变回“点击哪里跳到哪里”，而不是一页页翻，符合关闭动画后的干脆手感。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h3&gt;第三步：验证与后续&lt;/h3&gt;
&lt;p&gt;做完上述两步后，建议&lt;strong&gt;注销并重新登录&lt;/strong&gt;（或者重启电脑）以确保所有后台进程（如 QQ 的后台服务）重新读取配置。&lt;/p&gt;
&lt;p&gt;重启后：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;QQ / 微信 / 钉钉&lt;/strong&gt;：聊天列表滚动应该会变得生硬（瞬间跳转），不再平滑滚动。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;浏览器 (Chrome/Firefox)&lt;/strong&gt;：你可以访问 &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion&quot;&gt;prefers-reduced-motion 测试页面&lt;/a&gt; 来测试。如果显示 &quot;Reduced motion preference is detected&quot;，说明你的浏览器已经成功识别到了系统的“无动画”指令。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;补充：如果某些应用依然有平滑滚动&lt;/h3&gt;
&lt;p&gt;如果极少数应用（例如纯 Qt 应用或特定版本的浏览器）依然有平滑滚动，你可以手动进行微调：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Firefox&lt;/strong&gt;：在地址栏输入 &lt;code&gt;about:config&lt;/code&gt;，搜索 &lt;code&gt;general.smoothScroll&lt;/code&gt; 并双击设置为 &lt;code&gt;false&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chrome/Edge&lt;/strong&gt;：在地址栏输入 &lt;code&gt;chrome://flags&lt;/code&gt;，搜索 &lt;code&gt;Smooth Scrolling&lt;/code&gt; 并设置为 &lt;code&gt;Disabled&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大多数情况下，执行&lt;strong&gt;前两步&lt;/strong&gt;就已经能达到你想要的效果了。&lt;/p&gt;
&lt;h2&gt;禁用 USB 鼠标唤醒&lt;/h2&gt;
&lt;h4&gt;找到鼠标的 ID&lt;/h4&gt;
&lt;p&gt;我们需要知道你鼠标独一无二的“身份证号”（Vendor ID 和 Product ID）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开终端，输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;lsusb
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在输出列表中找到你的鼠标。它通常包含 &quot;Mouse&quot;、&quot;Optical&quot; 或品牌名（如 Logitech, Razer 等）。
你会看到类似这样的一行：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bus 001 Device 003: ID &lt;strong&gt;046d:c077&lt;/strong&gt; Logitech, Inc. M105 Optical Mouse&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;记下 &lt;code&gt;ID&lt;/code&gt; 后面那两组字符。在这个例子中，Vendor ID 是 &lt;code&gt;046d&lt;/code&gt;，Product ID 是 &lt;code&gt;c077&lt;/code&gt;。&lt;strong&gt;请记下你自己鼠标的这两个号码。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h4&gt;创建 Udev 规则&lt;/h4&gt;
&lt;p&gt;我们需要告诉 Linux 系统：“每当插入这个 ID 的设备时，自动把它的唤醒功能关掉。”&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;创建规则文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/udev/rules.d/50-disable-mouse-wake.rules
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;粘贴以下内容（&lt;strong&gt;注意修改为你自己的 ID&lt;/strong&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 禁止特定鼠标唤醒电脑
ACTION==&quot;add&quot;, SUBSYSTEM==&quot;usb&quot;, DRIVERS==&quot;usb&quot;, ATTRS{idVendor}==&quot;你的厂商ID&quot;, ATTRS{idProduct}==&quot;你的产品ID&quot;, ATTR{power/wakeup}=&quot;disabled&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;举例&lt;/strong&gt;：如果你的 ID 是 &lt;code&gt;046d:c077&lt;/code&gt;，那么那一行应该是：
&lt;code&gt;ACTION==&quot;add&quot;, SUBSYSTEM==&quot;usb&quot;, DRIVERS==&quot;usb&quot;, ATTRS{idVendor}==&quot;046d&quot;, ATTRS{idProduct}==&quot;c077&quot;, ATTR{power/wakeup}=&quot;disabled&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;保存并退出（Ctrl+O, Enter, Ctrl+X）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h4&gt;生效与测试&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;重载规则&lt;/strong&gt;：&lt;pre&gt;&lt;code&gt;sudo udevadm control --reload
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;拔掉鼠标，重新插上&lt;/strong&gt;（这一步必须做，为了触发规则）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h4&gt;特殊情况说明&lt;/h4&gt;
&lt;p&gt;如果你的键盘和鼠标共用一个接收器，那可能分不开。&lt;/p&gt;
&lt;h2&gt;Shebang&lt;/h2&gt;
&lt;p&gt;Shebang (&lt;code&gt;#!&lt;/code&gt;) 是写在脚本文件&lt;strong&gt;第一行&lt;/strong&gt;的一个特殊指令，用来告诉操作系统**“请用这个程序来运行我”**。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;详细解释&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 它长什么样？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shebang 由井号（&lt;code&gt;#&lt;/code&gt;）和感叹号（&lt;code&gt;!&lt;/code&gt;）组成，后面紧跟着一个程序（解释器）的&lt;strong&gt;绝对路径&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bash 脚本:&lt;/strong&gt; &lt;code&gt;#!/bin/bash&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python 脚本:&lt;/strong&gt; &lt;code&gt;#!/usr/bin/python3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Node.js 脚本:&lt;/strong&gt; &lt;code&gt;#!/usr/bin/env node&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 它是如何工作的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当你尝试像运行一个普通程序那样执行一个脚本文件时（例如，在终端里输入 &lt;code&gt;./myscript.sh&lt;/code&gt;），操作系统会做以下事情：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;它会检查文件的最开头。&lt;/li&gt;
&lt;li&gt;如果它看到了 &lt;code&gt;#!&lt;/code&gt; 这个标记，它就不会把这个文件当成普通的二进制程序来运行。&lt;/li&gt;
&lt;li&gt;相反，它会读取 &lt;code&gt;#!&lt;/code&gt; 后面的路径（比如 &lt;code&gt;/bin/bash&lt;/code&gt;），然后启动这个程序。&lt;/li&gt;
&lt;li&gt;最后，它会把你的脚本文件路径作为参数传递给那个程序去执行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，运行一个第一行写着 &lt;code&gt;#!/bin/bash&lt;/code&gt; 的脚本，就等同于在命令行手动输入 &lt;code&gt;bash ./myscript.sh&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 为什么它很重要？&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;指定正确的“语言”&lt;/strong&gt;： 脚本可以用很多种语言来写（Bash, Python, Perl 等）。Shebang 可以确保无论用户当前的环境是什么，你的脚本都会被正确的解释器执行，避免因语法不兼容而出错。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;让脚本能直接运行&lt;/strong&gt;： 有了 Shebang，你只需要给文件加上执行权限 (&lt;code&gt;chmod +x script.sh&lt;/code&gt;)，就可以像运行一个内置命令一样直接通过 &lt;code&gt;./script.sh&lt;/code&gt; 来执行它，非常方便。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提高可移植性&lt;/strong&gt;： 尤其当使用 &lt;code&gt;#!/usr/bin/env python3&lt;/code&gt; 这种形式时，它会自动在系统的环境变量 &lt;code&gt;PATH&lt;/code&gt; 中寻找 &lt;code&gt;python3&lt;/code&gt; 解释器，而不是写死一个固定的路径（比如 &lt;code&gt;/usr/bin/python3&lt;/code&gt;）。这使得脚本在不同系统（这些系统中 python3 可能安装在不同位置）之间有更好的兼容性。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shebang 就像是给脚本文件贴上了一个“使用说明”，这个说明非常简洁，就是告诉操作系统该找谁（哪个解释器）来读懂并执行这个文件的内容。 它虽然看起来像一行注释，但对于操作系统来说，它是一条有特殊意义的指令。&lt;/p&gt;
&lt;h2&gt;ssh 卡死&lt;/h2&gt;
&lt;p&gt;修改 &lt;code&gt;/etc/ssh/ssh_config&lt;/code&gt; 添加以下参数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ServerAliveInterval 10  # 每隔 10 秒发送一个请求
ServerAliveCountMax 3  # 允许超时的次数
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;睡眠模式改为 &lt;code&gt;deep&lt;/code&gt;&lt;/h2&gt;
&lt;h4&gt;临时切换&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;sudo sh -c &apos;echo deep &amp;gt; /sys/power/mem_sleep&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;永久切换&lt;/h4&gt;
&lt;p&gt;编辑 &lt;code&gt;/etc/default/grub&lt;/code&gt;，找到 &lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT&lt;/code&gt; 这一行，在引号内部，添加 &lt;code&gt;mem_sleep_default=deep&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;修改前可能长这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet splash&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改后应该长这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;GRUB_CMDLINE_LINUX_DEFAULT=&quot;quiet splash mem_sleep_default=deep&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo update-grub
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;开机自动打开 NumLock&lt;/h2&gt;
&lt;p&gt;（可能仅适用于 Kubuntu）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;strong&gt;系统设置 (System Settings)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;在左侧菜单找到 &lt;strong&gt;输入设备 (Input Devices)&lt;/strong&gt; -&amp;gt; &lt;strong&gt;键盘 (Keyboard)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;在右侧点击 &lt;strong&gt;硬件 (Hardware)&lt;/strong&gt; 选项卡。&lt;/li&gt;
&lt;li&gt;找到 &lt;strong&gt;Plasma 启动时的 NumLock 状态 (NumLock on Plasma Startup)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;将其设置为 &lt;strong&gt;开启 (Turn On)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;点击右下角的 &lt;strong&gt;应用 (Apply)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;开机自动登录时提示 &lt;code&gt;Unlock Login Keyring&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;具体来讲，提示：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Authentication required
The login keyring did not get unlocked when you logged into your computer.
Password:
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;解决方法&lt;/h3&gt;
&lt;p&gt;因为之前折腾过 &lt;code&gt;lightdm&lt;/code&gt;，系统里现在混用了 GNOME 的密钥环服务（所以提示语是 Login Keyring）。需要把这个密钥环的密码改成&lt;strong&gt;空（Blank）&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;请按以下步骤操作，只需做一次：&lt;/p&gt;
&lt;h4&gt;第一步：安装管理工具&lt;/h4&gt;
&lt;p&gt;Kubuntu 默认可能没有带 GNOME 的密钥管理工具，我们需要装一个叫 &lt;code&gt;seahorse&lt;/code&gt; 的软件。
打开终端（Konsole），输入并回车：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install seahorse
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;第二步：修改密钥环密码为空&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;按 &lt;code&gt;Win&lt;/code&gt; 键打开应用程序菜单，搜索 &lt;strong&gt;&quot;Passwords and Keys&quot;&lt;/strong&gt; 或者 &lt;strong&gt;&quot;seahorse&quot;&lt;/strong&gt; 并打开它。&lt;/li&gt;
&lt;li&gt;在左侧栏，你应该能看到 &lt;strong&gt;&quot;Login&quot;&lt;/strong&gt;（或者叫“登录”）这一项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右键点击 &quot;Login&quot;&lt;/strong&gt;，选择 &lt;strong&gt;&quot;Change Password&quot;（更改密码）&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;旧密码：&lt;/strong&gt; 输入你现在的&lt;strong&gt;用户登录密码&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新密码：&lt;/strong&gt; &lt;strong&gt;什么都不要输，直接留空！&lt;/strong&gt; 然后点继续。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;确认新密码：&lt;/strong&gt; &lt;strong&gt;再次留空&lt;/strong&gt;，直接点继续。&lt;/li&gt;
&lt;li&gt;系统会弹出一个警告说这样“不安全（Unsafe storage）”，点击 &lt;strong&gt;&quot;Continue&quot;（继续）&lt;/strong&gt; 即可。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;第三步：重启电脑&lt;/h4&gt;
&lt;p&gt;重启之后，系统会自动登录，并且因为密钥环没有密码，它会自动解锁，就不会再弹窗烦你了。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;
这样做唯一的副作用是：如果你电脑借给别人用，他们打开你的浏览器就能看到保存的网站密码（因为不再需要密码解锁了）。既然你选择了自动登录，说明你在这台电脑上更看重方便而非极致的安全，所以这是标准解决方案。&lt;/p&gt;
&lt;h2&gt;双系统隐藏 grub&lt;/h2&gt;
&lt;p&gt;编辑 &lt;code&gt;/etc/default/grub&lt;/code&gt;，将 &lt;code&gt;GRUB_DISABLE_OS_PROBER&lt;/code&gt; 取消注释并改成 true。
然后执行&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo update-grub
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;临时需要 grub时，开机长按 Shift 即可。&lt;/p&gt;
&lt;h2&gt;把登录界面改回 SDDM&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo dpkg-reconfigure sddm
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;NVIDIA GPU 突破 55W 功耗墙&lt;/h2&gt;
&lt;p&gt;启用 &lt;code&gt;nvidia-powerd.service&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;关闭临时 IPv6 地址&lt;/h2&gt;
&lt;p&gt;编辑 &lt;code&gt;/etc/sysctl.d/10-ipv6-privacy.conf&lt;/code&gt;，将文件中的 &lt;code&gt;net.ipv6.conf.default.use_tempaddr = 2&lt;/code&gt; 改为 &lt;code&gt;0&lt;/code&gt;，然后执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo sysctl --system
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;关闭独显&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo prime-select intel
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;NVIDIA GPU 周期性卡顿&lt;/h2&gt;
&lt;p&gt;可能是轮询 &lt;code&gt;nvidia-smi&lt;/code&gt; 干的。&lt;/p&gt;
&lt;h2&gt;利用 scp 传输文件&lt;/h2&gt;
&lt;p&gt;1、从服务器上下载文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scp username@servername:/path/filename /var/www/local_dir（本地目录）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如scp root@192.168.0.101:/var/www/test.txt  把192.168.0.101上的/var/www/test.txt 的文件下载到/var/www/local_dir（本地目录）&lt;/p&gt;
&lt;p&gt;2、上传本地文件到服务器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scp /path/filename username@servername:/path
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如scp /var/www/test.php  root@192.168.0.101:/var/www/  把本机/var/www/目录下的test.php文件上传到192.168.0.101这台服务器上的/var/www/目录中&lt;/p&gt;
&lt;p&gt;3、从服务器下载整个目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scp -r username@servername:/var/www/remote_dir/（远程目录） /var/www/local_dir（本地目录）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如:scp -r root@192.168.0.101:/var/www/test  /var/www/&lt;/p&gt;
&lt;p&gt;4、上传目录到服务器&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;scp -r local_dir username@servername:remote_dir
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：scp -r test  root@192.168.0.101:/var/www/   把当前目录下的test目录上传到服务器的/var/www/ 目录&lt;/p&gt;
&lt;p&gt;参考资料：https://www.cnblogs.com/jiangyao/archive/2011/01/26/1945570.html&lt;/p&gt;
&lt;h2&gt;微软大战代码 怎么不能鼠标中键选择矩形区域&lt;/h2&gt;
&lt;p&gt;在 Linux 系统下的 VS Code 中，鼠标中键无法直接进行矩形选择（列选择），通常是因为 &lt;strong&gt;Linux 系统默认将“鼠标中键”定义为“粘贴选定内容”（Primary Selection Paste）&lt;/strong&gt;。这导致当你尝试用中键拖拽时，VS Code 可能会优先识别为粘贴操作，或者与系统的剪贴板功能发生冲突。&lt;/p&gt;
&lt;p&gt;以下是几种解决方法，按推荐程度排序：&lt;/p&gt;
&lt;h3&gt;方法一：修改 VS Code 设置（最推荐）&lt;/h3&gt;
&lt;p&gt;你可以禁用 VS Code 中“中键点击粘贴”的功能，从而恢复中键用于矩形选择的功能。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 VS Code 设置：按下 &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;,&lt;/code&gt; 或者点击左下角齿轮图标 -&amp;gt; &lt;strong&gt;Settings&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;在搜索框中输入：&lt;code&gt;selectionClipboard&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;找到 &lt;strong&gt;Editor: Selection Clipboard&lt;/strong&gt; 选项。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;取消勾选&lt;/strong&gt;该选项。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 禁用后，在 VS Code 内点击鼠标中键不再执行粘贴操作，此时按住鼠标中键并拖动，即可实现矩形区域选择。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;方法二：使用键盘+左键组合（通用替代方案）（未经验证）&lt;/h3&gt;
&lt;p&gt;如果你不想禁用中键粘贴功能，可以使用组合键来实现矩形选择。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;标准快捷键：&lt;/strong&gt; &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;Alt&lt;/code&gt; + &lt;strong&gt;鼠标左键拖拽&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意（关于 Alt 键冲突）：&lt;/strong&gt;
在 Windows 上通常只按 &lt;code&gt;Alt&lt;/code&gt; + 左键即可，但在 Linux（尤其是 GNOME 或 KDE 桌面环境）中，&lt;code&gt;Alt&lt;/code&gt; + 鼠标左键通常被系统占用为“拖动窗口位置”。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;所以，在 Linux 上必须多加一个 &lt;code&gt;Shift&lt;/code&gt; 键（即 &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;Alt&lt;/code&gt; + 鼠标左键）。&lt;/li&gt;
&lt;li&gt;或者，你也可以去系统设置里把“移动窗口”的快捷键从 &lt;code&gt;Alt&lt;/code&gt; 改为 &lt;code&gt;Super&lt;/code&gt; (Windows键)，这样在 VS Code 里就可以直接用 &lt;code&gt;Alt&lt;/code&gt; + 左键了。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;方法三：切换“列选择模式”&lt;/h3&gt;
&lt;p&gt;如果你需要进行大量的矩形选择操作，可以将编辑器暂时切换为列选择模式。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在顶部菜单栏选择 &lt;strong&gt;Selection&lt;/strong&gt; (选择)。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;Column Selection Mode&lt;/strong&gt; (列选择模式)。&lt;/li&gt;
&lt;li&gt;此时，你直接使用&lt;strong&gt;鼠标左键&lt;/strong&gt;拖拽，画出来的就是矩形选区。&lt;/li&gt;
&lt;li&gt;操作完成后，再次点击该菜单项取消模式。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;快捷键切换：&lt;/strong&gt; 通常并未绑定默认快捷键，但你可以去键盘快捷方式设置里搜索 &lt;code&gt;toggleColumnSelection&lt;/code&gt; 自行绑定。&lt;/p&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;想恢复鼠标中键拖拽：&lt;/strong&gt; 请去设置里关闭 &lt;code&gt;Editor: Selection Clipboard&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;想保留中键粘贴习惯：&lt;/strong&gt; 请使用 &lt;code&gt;Shift&lt;/code&gt; + &lt;code&gt;Alt&lt;/code&gt; + &lt;strong&gt;鼠标左键&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;华硕笔记本的一些其他东西&lt;/h2&gt;
&lt;p&gt;安装 asusctl 和 supergfxctl。（官网https://asus-linux.org/）&lt;/p&gt;
&lt;p&gt;由于 &lt;code&gt;asusctl&lt;/code&gt; (现更名为 &lt;code&gt;asus-linux&lt;/code&gt; 项目的一部分) 和 &lt;code&gt;supergfxctl&lt;/code&gt; 官方主要支持 Fedora 和 Arch Linux，Kubuntu/Ubuntu 上没有官方维护的 PPA 源。因此，最稳妥且能用上最新功能的方法是&lt;strong&gt;从源码编译安装&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这个过程听起来复杂，但只要按顺序复制粘贴下面的命令即可完成。&lt;/p&gt;
&lt;h3&gt;准备工作&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;更新系统并安装基础依赖&lt;/strong&gt;
打开终端，运行以下命令安装编译所需的工具库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install -y build-essential git cmake pkg-config libclang-dev libudev-dev libpci-dev libseat-dev libsystemd-dev libglib2.0-dev libgtk-3-dev curl
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;安装 Rust 编程语言环境 (关键步骤)&lt;/strong&gt;
Ubuntu 仓库里的 Rust 版本通常太旧，编译会报错，所以我们要用官方脚本安装最新版：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl --proto &apos;=https&apos; --tlsv1.2 -sSf https://sh.rustup.rs | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;出现提示时，按 &lt;strong&gt;&lt;code&gt;1&lt;/code&gt;&lt;/strong&gt; (默认安装) 并回车。&lt;/li&gt;
&lt;li&gt;安装完成后，运行以下命令让环境变量立即生效：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;source &quot;$HOME/.cargo/env&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;第一步：安装 supergfxctl (显卡切换工具)&lt;/h3&gt;
&lt;p&gt;这是管理显卡切换的核心工具（必须先装它）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;克隆代码仓库&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~
git clone https://gitlab.com/asus-linux/supergfxctl.git
cd supergfxctl
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编译并安装&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make
sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;启动服务&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo systemctl enable --now supergfxd.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;如果这一步报错，通常是因为没重启，暂时忽略，继续往下走。&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;第二步：安装 asusctl (整机控制工具)&lt;/h3&gt;
&lt;p&gt;这是控制风扇、键盘灯、充电限制等功能的工具。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;克隆代码仓库&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~
git clone https://gitlab.com/asus-linux/asusctl.git
cd asusctl
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编译并安装&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make
sudo make install
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设置 udev 规则 (非常重要)&lt;/strong&gt;
为了让普通用户也能控制硬件，需要刷新一下规则：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo udevadm control --reload-rules &amp;amp;&amp;amp; sudo udevadm trigger
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;第三步：安装图形界面 (可选但推荐)&lt;/h3&gt;
&lt;p&gt;如果你不想每次都敲命令，可以安装 &lt;code&gt;rog-control-center&lt;/code&gt;，这是一个图形化界面。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;回到 asusctl 目录（如果你刚才退出了的话）&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/asusctl
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;注意：rog-control-center 就在 asusctl 的源码包里，不需要单独下载。&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编译安装图形界面&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;make -C rog-control-center
sudo make -C rog-control-center install
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;第四步：重启与验证&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;现在，请重启你的电脑！&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reboot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启回来后，进行以下测试：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;检查服务状态&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;systemctl status supergfxd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;应该显示绿色的 &lt;code&gt;active (running)&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用命令行切换显卡模式&lt;/strong&gt;：
查看当前模式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;supergfxctl -g
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;切换到混合模式（推荐日常使用）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;supergfxctl -m Hybrid
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;切换到独显直连/高性能模式（玩游戏用）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;supergfxctl -m AsusMuxDgpu
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(注：切换模式后通常需要注销或重启用户会话)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;打开图形界面&lt;/strong&gt;：
在程序菜单里搜索 &lt;strong&gt;&quot;ROG Control Center&quot;&lt;/strong&gt; 并打开。你应该能在里面看到风扇曲线调整、键盘灯光设置以及充电限制（比如设为 80% 保护电池）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;常见问题解决&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;报错 &quot;Permission denied&quot;&lt;/strong&gt;：如果你运行 &lt;code&gt;asusctl&lt;/code&gt; 命令时提示权限不足，请确保你的用户在 &lt;code&gt;adm&lt;/code&gt; 或 &lt;code&gt;users&lt;/code&gt; 组里，或者直接使用 &lt;code&gt;sudo&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;显卡模式切不过去&lt;/strong&gt;：确保你已经按照我之前的建议，将 Kubuntu 的电源模式设为 &lt;strong&gt;Performance&lt;/strong&gt;，并且闭源的 NVIDIA 驱动已正确安装。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;自动挂载非系统分区&lt;/h2&gt;
&lt;p&gt;在 Kubuntu (使用 KDE Plasma 桌面) 中，默认情况下确实不会自动挂载非系统分区。要解决这个问题，最简单的方法是使用 KDE 自带的设置，或者使用图形化工具来配置。&lt;/p&gt;
&lt;p&gt;以下是三种方法，按推荐程度从高到低排列：&lt;/p&gt;
&lt;h3&gt;方法一：使用 KDE 系统设置 (最简单，无需修改系统文件)&lt;/h3&gt;
&lt;p&gt;如果你只是希望&lt;strong&gt;登录后&lt;/strong&gt;自动挂载（不需要在开机未登录时就挂载），这是最安全的方法。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;strong&gt;系统设置 (System Settings)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;找到 &lt;strong&gt;硬件 (Hardware)&lt;/strong&gt; -&amp;gt; &lt;strong&gt;可移动存储 (Removable Storage)&lt;/strong&gt; -&amp;gt; &lt;strong&gt;可移动设备 (Removable Devices)&lt;/strong&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;注意：虽然名字叫“可移动设备”，但通常也能管理内部的其他分区。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;勾选 &lt;strong&gt;“启用可移动介质的自动挂载” (Enable automatic mounting of removable media)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;在下方的列表中，找到你想要自动挂载的分区。&lt;/li&gt;
&lt;li&gt;勾选该分区右侧的 &lt;strong&gt;“登录时自动挂载” (On Login)&lt;/strong&gt; 和 &lt;strong&gt;“插入时自动挂载” (On Attach)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;应用 (Apply)&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下次登录时，系统就会自动帮你“点”那一下，分区就挂载好了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;方法二：使用 KDE 分区管理器 (图形化配置，系统级挂载)（未经验证）&lt;/h3&gt;
&lt;p&gt;如果你希望它是&lt;strong&gt;系统级挂载&lt;/strong&gt;（即开机后无论谁登录，分区都已经挂载好，且挂载路径固定），可以使用自带的工具。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开应用菜单，搜索并打开 &lt;strong&gt;KDE 分区管理器 (KDE Partition Manager)&lt;/strong&gt; (需要输入密码)。&lt;/li&gt;
&lt;li&gt;在左侧选择包含该分区的硬盘。&lt;/li&gt;
&lt;li&gt;在右侧列表中，&lt;strong&gt;右键点击&lt;/strong&gt;你要自动挂载的分区，选择 &lt;strong&gt;编辑挂载点 (Edit Mount Point)&lt;/strong&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;注意：如果分区处于挂载状态，可能需要先卸载（右键 Unmount）。&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;在弹出的窗口中：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;路径 (Path)&lt;/strong&gt;：选择或输入一个固定的文件夹路径（例如 &lt;code&gt;/mnt/Data&lt;/code&gt; 或 &lt;code&gt;/media/你的用户名/Data&lt;/code&gt;）。如果不确定，可以保持默认或新建一个。&lt;/li&gt;
&lt;li&gt;勾选 &lt;strong&gt;“如果无法挂载则不阻止系统启动” (Don&apos;t prevent system from booting if not mountable)&lt;/strong&gt; (这很重要，防止硬盘出问题时导致无法开机)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;确定 (OK)&lt;/strong&gt;，然后点击工具栏左上角的 &lt;strong&gt;应用 (Apply)&lt;/strong&gt; 按钮使更改生效。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;方法三：使用 GNOME Disks (界面直观，适合新手)（未经验证）&lt;/h3&gt;
&lt;p&gt;很多 Kubuntu 用户觉得 KDE 自带的分区管理器设置不够直观，更喜欢用 GNOME 的磁盘工具。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开终端 (Konsole)，安装它：&lt;pre&gt;&lt;code&gt;sudo apt update
sudo apt install gnome-disk-utility
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;打开应用菜单，搜索 &lt;strong&gt;Disks (磁盘)&lt;/strong&gt; 并打开。&lt;/li&gt;
&lt;li&gt;在左侧选中你的硬盘，在右侧点击你要挂载的分区。&lt;/li&gt;
&lt;li&gt;点击分区条下方的 &lt;strong&gt;齿轮图标&lt;/strong&gt;，选择 &lt;strong&gt;编辑挂载选项 (Edit Mount Options)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;关闭 &lt;strong&gt;“用户会话默认” (User Session Defaults)&lt;/strong&gt; 的开关。&lt;/li&gt;
&lt;li&gt;勾选 &lt;strong&gt;“系统启动时挂载” (Mount at system startup)&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;点击 &lt;strong&gt;确定&lt;/strong&gt; 并输入密码。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;strong&gt;小提示：&lt;/strong&gt;
如果不小心配置错误导致开机无法进入桌面（进入了紧急模式），不要惊慌。只需要输入 &lt;code&gt;root&lt;/code&gt; 密码，编辑 &lt;code&gt;/etc/fstab&lt;/code&gt; 文件，把最后添加的那一行错误的挂载信息删除或注释掉（在行首加 &lt;code&gt;#&lt;/code&gt;），保存重启即可。&lt;/p&gt;
&lt;h2&gt;CPU 锁定 4.7 GHz&lt;/h2&gt;
&lt;p&gt;使用 TLP 将 CPU 频率锁定在特定数值（例如 4.7GHz），本质上是强制 CPU 始终运行在最高性能状态，不进行降频。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 警告：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;散热风险&lt;/strong&gt;：锁定 4.7GHz 会导致 CPU 即使在空闲时也会产生大量热量，风扇可能会狂转。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;物理限制&lt;/strong&gt;：4.7GHz 通常是&lt;strong&gt;睿频 (Turbo Boost)&lt;/strong&gt; 频率。如果散热跟不上，或者达到功耗墙，硬件机制会强制降频（Thermal Throttling），无论软件怎么设置都无法抗拒。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果确定要这么做，请按照以下步骤操作：&lt;/p&gt;
&lt;h3&gt;第一步：确认你的 CPU 支持的频率&lt;/h3&gt;
&lt;p&gt;在配置之前，需要确认 4.7GHz 是有效的频率，并且知道具体的数值单位（通常是 kHz）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开终端，输入以下命令查看 TLP 检测到的 CPU 数据：&lt;pre&gt;&lt;code&gt;sudo tlp-stat -p
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;查看输出中的 &lt;strong&gt;&lt;code&gt;/sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies&lt;/code&gt;&lt;/strong&gt;（如果存在）或 &lt;strong&gt;&lt;code&gt;scaling_max_freq&lt;/code&gt;&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;确认 4700000 (kHz) 是否在支持范围内。如果你的 CPU 最大只能到 4.5GHz，强行设 4.7GHz 是无效的。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第二步：修改 TLP 配置文件&lt;/h3&gt;
&lt;p&gt;我们需要修改 &lt;code&gt;/etc/tlp.conf&lt;/code&gt; 文件。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;使用文本编辑器打开配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/tlp.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;找到以下几项设置，&lt;strong&gt;去掉前面的 &lt;code&gt;#&lt;/code&gt; 号（取消注释）&lt;/strong&gt;，并修改数值。
&lt;em&gt;注意：TLP 分为 AC（接电源）和 BAT（用电池）。通常你只会在&lt;strong&gt;接电源 (AC)&lt;/strong&gt; 时锁定高频。&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A. 设置调度器为性能模式 (Performance)&lt;/strong&gt;
这是最关键的一步，告诉内核不要省电。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU_SCALING_GOVERNOR_ON_AC=performance
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;B. 锁定最小和最大频率&lt;/strong&gt;
将最小值和最大值都设为 4.7GHz（单位是 kHz，所以是 4700000）。
&lt;em&gt;注意：如果你的 CPU 实际上达不到 4.7G，请填入你查到的最大物理频率。&lt;/em&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU_SCALING_MIN_FREQ_ON_AC=4700000
CPU_SCALING_MAX_FREQ_ON_AC=4700000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;C. 设置能量性能偏好 (EPP)&lt;/strong&gt;
对于现代 Intel/AMD CPU，这项设置比 Governor 更重要。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU_ENERGY_PERF_POLICY_ON_AC=performance
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;D. 确保睿频开启&lt;/strong&gt;
如果 4.7GHz 属于睿频范围，必须确保 Boost 是开启的。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;CPU_BOOST_ON_AC=1
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;按下 &lt;code&gt;Ctrl + O&lt;/code&gt; 保存，按下 &lt;code&gt;Enter&lt;/code&gt; 确认，然后 &lt;code&gt;Ctrl + X&lt;/code&gt; 退出编辑器。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第三步：应用更改并验证&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;应用更改&lt;/strong&gt;（无需重启电脑）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo tlp start
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;验证是否生效&lt;/strong&gt;：
你可以使用 &lt;code&gt;watch&lt;/code&gt; 命令实时查看当前 CPU 频率：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;watch -n 1 &quot;grep \&quot;^[c]pu MHz\&quot; /proc/cpuinfo&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者使用更直观的工具（如果你安装了 &lt;code&gt;s-tui&lt;/code&gt;）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;s-tui
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;常见问题与排错&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如果频率依然在跳动&lt;/strong&gt;：
现代 CPU（特别是 Intel 10代以后）使用 &lt;code&gt;intel_pstate&lt;/code&gt; 驱动，它对频率的控制权很大。如果设置了 &lt;code&gt;performance&lt;/code&gt; 偏好，它会自动尽可能维持高频，但如果&lt;strong&gt;没有任何负载&lt;/strong&gt;，它可能依然会稍微降频以保护电路。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如果频率卡在基准频率（例如 2.8GHz）上不去&lt;/strong&gt;：
检查散热。如果 CPU 温度过高，BIOS 会强制锁频。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如何恢复默认？&lt;/strong&gt;
再次编辑配置文件，把上述修改的行前面加回 &lt;code&gt;#&lt;/code&gt;，或者将值改回 &lt;code&gt;balance_performance&lt;/code&gt;，然后运行 &lt;code&gt;sudo tlp start&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;建议：&lt;/strong&gt;
比起硬锁 &lt;code&gt;MIN_FREQ=4700000&lt;/code&gt;，更好的做法通常是只设置 &lt;code&gt;GOVERNOR=performance&lt;/code&gt; 和 &lt;code&gt;EPP=performance&lt;/code&gt;。这样 CPU 会极快地响应负载升到 4.7GHz，但在完全无事可做时稍微休息一下，这对硬件寿命更好。&lt;/p&gt;
&lt;h2&gt;电源模式不见了&lt;/h2&gt;
&lt;p&gt;省流：装了 TLP 是这样的。&lt;/p&gt;
&lt;p&gt;在 Kubuntu (KDE Plasma) 中，电源模式（省电、平衡、性能）的切换选项通常依赖于一个名为 &lt;strong&gt;&lt;code&gt;power-profiles-daemon&lt;/code&gt;&lt;/strong&gt; 的后台服务。&lt;/p&gt;
&lt;p&gt;Linux 上有一个非常流行的电源管理工具叫 &lt;strong&gt;TLP&lt;/strong&gt;。如果你手动安装了它，或者系统默认包含了它，&lt;strong&gt;TLP 会自动禁用 &lt;code&gt;power-profiles-daemon&lt;/code&gt;&lt;/strong&gt;，以此避免两个电源管理程序互相打架。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;现象&lt;/strong&gt;：KDE 电源图标里的滑块不见了，因为 TLP 接管了所有设置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;解决方法&lt;/strong&gt;：你需要在一个“有界面滑块但控制较少”和“无界面但自动化程度高（TLP）”之间做选择。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;如果你想要回 KDE 的电源模式滑块，你需要卸载或禁用 TLP：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开终端 (Konsole)。&lt;/li&gt;
&lt;li&gt;输入以下命令卸载 TLP：&lt;pre&gt;&lt;code&gt;sudo apt remove tlp tlp-rdw
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;重新启用 &lt;code&gt;power-profiles-daemon&lt;/code&gt;（见方法二）。&lt;/li&gt;
&lt;li&gt;重启电脑。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;QQ 9 更改存储位置&lt;/h2&gt;
&lt;p&gt;好像改不了，只能把原来的聊天记录复制过来。
具体来说，把原来 Windows 上以 QQ 号命名的文件夹里的 &lt;code&gt;nt_qq&lt;/code&gt; 文件夹里的东西，复制到 &lt;code&gt;~/.config/QQ/nt_qq_一坨你的UUID&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;微信 4 打不开&lt;/h2&gt;
&lt;p&gt;我记得是缺一个依赖，具体是啥我也忘了（&lt;/p&gt;
&lt;h2&gt;键盘的 F 键指向功能键&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;临时修改（重启后失效）:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 设置为 Mac 模式（媒体键优先）
echo 1 &amp;gt; /sys/module/hid_apple/parameters/fnmode

# 设置为 PC 模式（F键优先）
echo 2 &amp;gt; /sys/module/hid_apple/parameters/fnmode
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;永久修改:&lt;/strong&gt;
你需要创建一个 modprobe 配置文件。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;新建文件: &lt;code&gt;nano /etc/modprobe.d/hid_apple.conf&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;添加以下内容:&lt;pre&gt;&lt;code&gt;options hid_apple fnmode=1
&lt;/code&gt;&lt;/pre&gt;
&lt;em&gt;(将 1 改为 2 即为强制 F 键优先)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;保存并重启，或者重新加载内核模块:&lt;pre&gt;&lt;code&gt;update-initramfs -u
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;启动 HMCL 时应用缩放&lt;/h2&gt;
&lt;p&gt;在启动命令中加入 &lt;code&gt;-Dglass.gtk.uiScale=1.5&lt;/code&gt; 参数。
参考资料：https://github.com/HMCL-dev/HMCL/discussions/3151&lt;/p&gt;
&lt;h2&gt;使用 NVIDIA 显卡启动 Minecraft&lt;/h2&gt;
&lt;p&gt;这是一个非常经典的需求。在 Linux 笔记本（混合显卡）上，为了省电，默认情况下应用程序（包括 Java/Minecraft）都会使用核显（Intel/AMD iGPU）运行。&lt;/p&gt;
&lt;p&gt;我们需要显式地告诉系统：“喂，启动这个游戏的时候，把渲染任务交给 NVIDIA 独显去做！”&lt;/p&gt;
&lt;p&gt;这主要通过 &lt;strong&gt;NVIDIA Prime Render Offload&lt;/strong&gt; 技术来实现。既然你已经安装了 &lt;code&gt;nvidia-driver-535&lt;/code&gt;，这个功能是开箱即用的。&lt;/p&gt;
&lt;p&gt;请按照以下步骤操作，最稳妥且方便：&lt;/p&gt;
&lt;h3&gt;第一步：验证显卡是否准备就绪&lt;/h3&gt;
&lt;p&gt;先确认 N 卡已经正常工作。在终端输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvidia-smi
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果能看到显卡列表，说明驱动没问题。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;第二步：创建一个“独显启动脚本” (prime-run)&lt;/h3&gt;
&lt;p&gt;为了方便以后任何软件（不只是 HMCL）都能一键调用独显，我们先创建一个通用的命令 &lt;code&gt;prime-run&lt;/code&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;打开终端，创建脚本文件：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /usr/bin/prime-run
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在里面粘贴以下内容：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/bash
export __NV_PRIME_RENDER_OFFLOAD=1
export __GLX_VENDOR_LIBRARY_NAME=nvidia
exec &quot;$@&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;(这段代码的意思是：设置好 NVIDIA 相关的环境变量，然后执行后面跟着的命令)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;保存并退出：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;按 &lt;code&gt;Ctrl + O&lt;/code&gt; 回车保存。&lt;/li&gt;
&lt;li&gt;按 &lt;code&gt;Ctrl + X&lt;/code&gt; 退出。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;赋予执行权限：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo chmod +x /usr/bin/prime-run
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;测试一下：&lt;/strong&gt;
输入 &lt;code&gt;prime-run glxinfo | grep &quot;OpenGL renderer&quot;&lt;/code&gt;。
如果输出里有 &lt;strong&gt;NVIDIA&lt;/strong&gt; 字样，说明这个命令成功了！&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;第三步：在 HMCL 中设置&lt;/h3&gt;
&lt;p&gt;现在我们只需要告诉 HMCL，启动 Java 的时候要在前面加个 &lt;code&gt;prime-run&lt;/code&gt;。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;strong&gt;HMCL 启动器&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;进入 &lt;strong&gt;“设置” (Settings)&lt;/strong&gt; -&amp;gt; &lt;strong&gt;“全局游戏设置” (Global Game Settings)&lt;/strong&gt;（或者你可以针对某个特定整合包单独设置）。&lt;/li&gt;
&lt;li&gt;找到 &lt;strong&gt;“命令包装” (Wrapper Command)&lt;/strong&gt; 这一栏（有些版本叫“启动器包装”或类似的）。&lt;/li&gt;
&lt;li&gt;在输入框里填入：&lt;pre&gt;&lt;code&gt;prime-run
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关闭设置&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;第四步：进游戏验证&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;通过 HMCL 启动 Minecraft。&lt;/li&gt;
&lt;li&gt;进入游戏世界后，按下 &lt;strong&gt;&lt;code&gt;F3&lt;/code&gt;&lt;/strong&gt; 键打开调试界面。&lt;/li&gt;
&lt;li&gt;看屏幕 &lt;strong&gt;右侧&lt;/strong&gt; 的信息栏，找到 &lt;strong&gt;Display&lt;/strong&gt; 这一行。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如果成功&lt;/strong&gt;：你应该能看到类似 &lt;code&gt;NVIDIA GeForce RTX 3060...&lt;/code&gt; 的字样。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如果失败&lt;/strong&gt;：它显示的依然是 &lt;code&gt;Intel UHD Graphics&lt;/code&gt; 或 &lt;code&gt;AMD Radeon&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>LibreOffice Impress 播放不出视频的解决方法</title><link>https://xn--24wq0n.top/posts/2025-10-14-libreoffice_impress_%E6%92%AD%E6%94%BE%E4%B8%8D%E5%87%BA%E8%A7%86%E9%A2%91%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2025-10-14-libreoffice_impress_%E6%92%AD%E6%94%BE%E4%B8%8D%E5%87%BA%E8%A7%86%E9%A2%91%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95/</guid><description>https://codecguide.com/download_k-lite_codec_pack_basic.htm 下载安装这里的 K-Lite Codec Pack Basic 就可以了。 参考</description><pubDate>Tue, 14 Oct 2025 08:06:00 GMT</pubDate><content:encoded>&lt;p&gt;https://codecguide.com/download_k-lite_codec_pack_basic.htm&lt;/p&gt;
&lt;p&gt;下载安装这里的 &lt;code&gt;K-Lite Codec Pack Basic&lt;/code&gt; 就可以了。&lt;/p&gt;
&lt;p&gt;参考资料：
https://wiki.documentfoundation.org/Media_Support/Windows&lt;/p&gt;
</content:encoded></item><item><title>常量指针和指针常量的区别</title><link>https://xn--24wq0n.top/posts/2024-11-13-%E5%B8%B8%E9%87%8F%E6%8C%87%E9%92%88%E5%92%8C%E6%8C%87%E9%92%88%E5%B8%B8%E9%87%8F%E7%9A%84%E5%8C%BA%E5%88%AB/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2024-11-13-%E5%B8%B8%E9%87%8F%E6%8C%87%E9%92%88%E5%92%8C%E6%8C%87%E9%92%88%E5%B8%B8%E9%87%8F%E7%9A%84%E5%8C%BA%E5%88%AB/</guid><description>指针常量：指针的值是一个常量，不可改变，始终指向同一个地址。 常量指针：指针指向常量，指向的常量不能修改，但指针本身不是一个常量，可以把指针指向别一个常量。 如果const位于*的右侧，则const就</description><pubDate>Wed, 13 Nov 2024 21:50:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;指针常量：指针的值是一个常量，不可改变，始终指向同一个地址。&lt;/li&gt;
&lt;li&gt;常量指针：指针指向常量，指向的常量不能修改，但指针本身不是一个常量，可以把指针指向别一个常量。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果&lt;code&gt;const&lt;/code&gt;位于&lt;code&gt;*&lt;/code&gt;的右侧，则&lt;code&gt;const&lt;/code&gt;就是修饰指针本身，即指针本身是常量（指针常量）。
如果&lt;code&gt;const&lt;/code&gt;位于&lt;code&gt;*&lt;/code&gt;的左侧，则&lt;code&gt;const&lt;/code&gt;就是修饰指针所指向的变量，即指针指向常量（常量指针）。&lt;/p&gt;
&lt;p&gt;可以将常量指针指向非 const 数据，只是不能用常量指针修改该数据的内容。&lt;/p&gt;
</content:encoded></item><item><title>C++ STL 数据结构模板的运用</title><link>https://xn--24wq0n.top/posts/2021-08-11-c_stl_%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E6%A8%A1%E6%9D%BF%E7%9A%84%E8%BF%90%E7%94%A8/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-08-11-c_stl_%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E6%A8%A1%E6%9D%BF%E7%9A%84%E8%BF%90%E7%94%A8/</guid><description>本文根据CCF NOI 竞赛大纲 的顺序编写。 栈（stack） 栈是一种先进后出的数据结构。使用 STL 的 stack 数据结构需要以下头文件： #include &amp;lt;stack&amp;gt; 以下</description><pubDate>Wed, 11 Aug 2021 19:27:00 GMT</pubDate><content:encoded>&lt;p&gt;本文根据CCF &lt;a href=&quot;https://www.noi.cn/upload/resources/file/2021/04/06/152179.pdf&quot;&gt;NOI 竞赛大纲&lt;/a&gt; 的顺序编写。&lt;/p&gt;
&lt;h1&gt;栈（stack）&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;栈&lt;/strong&gt;是一种先进后出的数据结构。使用 STL 的 stack 数据结构需要以下头文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;stack&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下是 stack 常用函数（用例中栈名为 $s$）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;函数&lt;/th&gt;
&lt;th&gt;语法&lt;/th&gt;
&lt;th&gt;用例&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;push()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;栈名.push(元素)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.push(a)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在栈顶插入新元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pop()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;栈名.pop()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;s.pop()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;弹出栈顶元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;top()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;栈名.top()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a = s.top()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;访问栈顶元素&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;size()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;栈名.size()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;len = s.size()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查询栈中元素数量&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;栈名.empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f = s.empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查询栈是否为空&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;队列（queue）&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;队列&lt;/strong&gt;是一种先进出的数据结构。使用 STL 的 queue 数据结构需要以下头文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;queue&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下是 queue 常用函数（用例中队列名为 $q$​）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;函数&lt;/th&gt;
&lt;th&gt;语法&lt;/th&gt;
&lt;th&gt;用例&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;push()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;队列名.push(元素)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;q.push(a)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在队列末端插入新元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pop()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;队列名.pop()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;q.pop()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;弹出队列头端元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;队列名.front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a = q.front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;访问队头元素&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;队列名.back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a = q.back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;访问队尾元素&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;size()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;队列名.size()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;len = q.size()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查询队列中元素数量&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;队列名.empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f = q.empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查询队列是否为空&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1&gt;链表（list）&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;链表&lt;/strong&gt;是一种数据结构。使用 STL 的 list 数据结构需要以下头文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;list&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;链表的函数有点多啊，不是我说……&lt;/p&gt;
&lt;p&gt;以下是 list 常用函数（用例中链表名为 $l$​）（参考了&lt;a href=&quot;https://www.cnblogs.com/linuxAndMcu/p/10260627.html&quot;&gt;这篇博客&lt;/a&gt;）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;函数&lt;/th&gt;
&lt;th&gt;语法&lt;/th&gt;
&lt;th&gt;用例&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;th&gt;类型&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;push_front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.push_front(元素)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.push_front(a)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在链表头端插入新元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;push_back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.push_back(元素)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.push_back(a)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在链表尾端插入新元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insert()&lt;/code&gt;（1）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.insert(要插入元素的位置, 元素)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.insert(l.begin(), a)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在任意位置插入新元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insert()&lt;/code&gt;（2）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.insert(要插入元素的位置, 要插入的数量, 元素)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.insert(l.begin(), 3, a)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在任意位置插入多个新元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;insert()&lt;/code&gt;（3）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.insert(要插入元素的位置, 要插入数据的起始位置, 要插入数据的结束位置)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.insert(l.begin(), v.begin(), v.end())&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;插入另一个向量两点之间的数据&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pop_front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.pop_front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.pop_front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;弹出链表头端元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pop_back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.pop_back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.pop_back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;弹出链表尾端元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;erase()&lt;/code&gt;（1）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.erase(要删除元素的位置)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.erase(l.end())&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除任意位置的元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;erase()&lt;/code&gt;（2）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.erase(要删除元素的起始位置, 要删除元素的结束位置)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.erase(l.begin(), l.end())&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除连续多个任意位置的元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;clear()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.clear()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.clear()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;清空所有元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;assign()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.assign(赋值的数量, 要赋的值)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.assign(4, 5)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;为链表赋多个初值&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;swap()&lt;/code&gt;（1）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名1.swap(链表名2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l1.swap(l2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;交换两个链表的值&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;swap()&lt;/code&gt;（2）&lt;/td&gt;
&lt;td&gt;&lt;code&gt;swap(链表名1, 链表名2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;swap(l1, l2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;交换两个链表的值&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;merge()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名1.merge(链表名2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l1.merge(l2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;将一个链表合并入另一个链表，并按照链表的升序排列**（注意不是链表中元素的升序）**；并将这个链表清空&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;splice()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名1.splice(插入的位置，链表名2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l1.splice(l1.begin(), l2)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;在一个链表的任意位置插入另一个链表；并将这个链表清空&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;unique()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.unique()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.unique()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;删除链表中相邻的重复元素&lt;/td&gt;
&lt;td&gt;操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;begin()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.begin()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.begin()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;链表开始迭代器指针&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;end()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.end()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.end()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;链表末尾迭代器指针&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cbegin()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.cbegin()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.cbegin()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指向常量的开始迭代器指针&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;cend()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.cend()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.cend()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;指向常量的末尾迭代器指针&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rbegin()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.rbegin()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.rbegin()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;反向迭代器指针，指向最后一个元素&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;rend()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.rend()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;l.rend()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;反向迭代器指针，指向第一个元素的前一个元素&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a = l.front()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;访问链表头元素&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;a = l.back()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;访问链表尾元素&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;size()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.size()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;len = l.size()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查询链表中元素数量&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;链表名.empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;f = l.empty()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查询链表是否为空&lt;/td&gt;
&lt;td&gt;查询&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;以下是 list 常用函数（用例中链表名为 $l$​）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;遍历元素&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;list&amp;lt;int&amp;gt;::iterator it;
for (it = lst.begin(); it != lst.end(); it++)
    cout &amp;lt;&amp;lt; *it &amp;lt;&amp;lt; endl;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;元素翻转&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;algorithm&amp;gt;
reverse(lst.begin(), lst.end());
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;元素排序&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;algorithm&amp;gt;
sort(lst.begin(), lst.end()); // 采用的是从小到大的排序

// 如果想从大到小排序，可以采用先排序后反转的方式，也可以采用下面方法:
// 自定义从大到小的比较器，用来改变排序方式
bool Comp(const int&amp;amp; a, const int&amp;amp; b) 
{
    return a &amp;gt; b;
}

sort(lst.begin(), lst.end(), Comp);
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;向量（vector）&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;向量&lt;/strong&gt;是一种数据结构。使用 STL 的 vector 数据结构需要以下头文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;vector&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以下是 vector 常用函数（用例中向量名为 $l$）：&lt;/p&gt;
&lt;p&gt;未完待更……&lt;/p&gt;
&lt;p&gt;完了。退役了，更不完了，有人接上这个坑就接上吧，我这给个源码链接，如果有人接上这坑的话回复个链接，我给挂上，就算填了坑了。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://paste.ubuntu.com/p/G2HwFwC8yd/&quot;&gt;源码链接&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>【题解】P3388 【模板】割点（割顶）</title><link>https://xn--24wq0n.top/posts/2021-04-20-%E9%A2%98%E8%A7%A3_p3388_%E6%A8%A1%E6%9D%BF_%E5%89%B2%E7%82%B9_%E5%89%B2%E9%A1%B6/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-04-20-%E9%A2%98%E8%A7%A3_p3388_%E6%A8%A1%E6%9D%BF_%E5%89%B2%E7%82%B9_%E5%89%B2%E9%A1%B6/</guid><description>这题搞了我半天…… 题意 这题给我们一个图，求这一个图的割点。 首先我们需要了解割点是什么，简单来说就是删除了这个点之后整个图不是连通图。 比如下图中的 \(②\) 就是割点*（图片来自OI Wiki</description><pubDate>Tue, 20 Apr 2021 22:02:00 GMT</pubDate><content:encoded>&lt;p&gt;:::note
之前作图的时候没考虑到深色模式，如果您觉得看不清，可以考虑切换到浅色模式，抱歉。
:::&lt;/p&gt;
&lt;p&gt;这题搞了我半天……&lt;/p&gt;
&lt;h1&gt;题意&lt;/h1&gt;
&lt;p&gt;这题给我们一个图，求这一个图的割点。&lt;/p&gt;
&lt;p&gt;首先我们需要了解割点是什么，简单来说就是删除了这个点之后整个图不是连通图。&lt;/p&gt;
&lt;p&gt;比如下图中的 $②$ 就是割点*（图片来自&lt;a href=&quot;https://oi-wiki.org/&quot;&gt;OI Wiki&lt;/a&gt;）*。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210413212227125-1534331373.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h1&gt;方法&lt;/h1&gt;
&lt;p&gt;OI Wiki上对割点的讲解：&lt;a href=&quot;https://oi-wiki.org/graph/cut/&quot;&gt;link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;首先用dfs序给每一个节点打上时间戳*（图片来自&lt;a href=&quot;https://oi-wiki.org/&quot;&gt;OI Wiki&lt;/a&gt;）*，存在&lt;code&gt;dfn[]&lt;/code&gt;数组中：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210413212641708-9048538.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我们用像求强连通分量一样的 Tarjan 算法遍历每一个节点，用&lt;code&gt;low[]&lt;/code&gt;数组存储从这个节点出发能到达的最远古的节点。&lt;/p&gt;
&lt;p&gt;我们遍历每一个节点，然后更新节点的&lt;code&gt;low[]&lt;/code&gt;值。更新方法：&lt;/p&gt;
&lt;p&gt;如果搜索到的下一个节点没有在队列中，搜索完这下一个节点之后，如果这个儿子的&lt;code&gt;low[]&lt;/code&gt;值小于自己的&lt;code&gt;low[]&lt;/code&gt;值，就将&lt;code&gt;low[]&lt;/code&gt;的值更新为它的儿子的&lt;code&gt;low[]&lt;/code&gt;值。&lt;/p&gt;
&lt;p&gt;本文中程序的&lt;code&gt;v&lt;/code&gt;为当前节点，&lt;code&gt;u&lt;/code&gt;为循环到的节点。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;      tarjan(u, v);                   //找下面这个点
      low[v] = min(low[v], low[u]);   //这个点low[v]的值就是当前low[]的值与找到的u点的low[]值的最小值
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还有可能搜到了还在队列中的节点（即自己的祖先），就取&lt;code&gt;low[v]&lt;/code&gt;与&lt;code&gt;num[u]&lt;/code&gt;的最小值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;else low[v] = min(low[v], num[u]);   //low[v]就取这个点的low值与循环到的点u的dfn[u]的最小值
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来就要考虑如何发现割点并把发现的割点的数量记录下来。&lt;/p&gt;
&lt;p&gt;当找到的点不在队列中时，先更新&lt;code&gt;low[]&lt;/code&gt;的值，再判断如果&lt;code&gt;low[u] &amp;gt;= num[v]&lt;/code&gt;，即&lt;strong&gt;这个点不能回到祖先节点&lt;/strong&gt;了，&lt;/p&gt;
&lt;p&gt;并且&lt;strong&gt;此时所在的点不是祖先节点&lt;/strong&gt;，而且&lt;strong&gt;此时所在的点没有被标记过&lt;/strong&gt;，就&lt;code&gt; flag[v] = true, res++&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;      if (father != v &amp;amp;&amp;amp; low[u] &amp;gt;= num[v] &amp;amp;&amp;amp; !flag[v]) flag[v] = true, res++; //如果满足割点的条件就标记是割点，并且让答案的个数增加。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外，如果&lt;strong&gt;此时所在的点是祖先节点&lt;/strong&gt;，并且&lt;strong&gt;它有两个及以上的儿子&lt;/strong&gt; &lt;strong&gt;（只有不在队列中的点才算儿子）&lt;/strong&gt;，而且&lt;strong&gt;没被标记过&lt;/strong&gt;，就&lt;code&gt; flag[v] = true, res++&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  if (father == v &amp;amp;&amp;amp; child &amp;gt;= 2 &amp;amp;&amp;amp; !flag[v])    //如果自己有两个儿子并且没有被访问过
                                                //只有不在队列中的点才算儿子。
    flag[v] = true, res++;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;上面的儿子可以在遍历每一个节点的时候累加。&lt;/p&gt;
&lt;h1&gt;代码&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;iostream&amp;gt;
using namespace std;

inline int read() {
  int X = 0; bool flag = 1; char ch = getchar();
  while (ch &amp;lt; &apos;0&apos; || ch &amp;gt; &apos;9&apos;) {if (ch == &apos;-&apos;) flag = 0; ch = getchar();}
  while (ch &amp;gt;= &apos;0&apos; &amp;amp;&amp;amp; ch &amp;lt;= &apos;9&apos;) {X = (X &amp;lt;&amp;lt; 1) + (X &amp;lt;&amp;lt; 3) + ch - &apos;0&apos;; ch = getchar();}
  if (flag) return X;
  return ~ (X - 1);
}

inline void write(int X) {
  if (X &amp;lt; 0) {putchar(&apos;-&apos;); X = ~ (X - 1);}
  int s[50], top = 0;
  while (X) {s[++top] = X % 10; X /= 10;}
  if (!top) s[++top] = 0;
  while (top) putchar(s[top--] + &apos;0&apos;);
  putchar(&apos; &apos;);
  return;
}

int head[20004], low[20004], num[20004];
int index, res, cnt;
bool flag[20004], vis[20004];

vector&amp;lt;int&amp;gt; edge[100001];

void tarjan(int v, int father) {      //Tarjan算法
  num[v] = low[v] = ++index;          //标记dfn[]访问顺序，还有low[]的初始值
  vis[v] = true;                      //标记这个点被访问过
  int child = 0;
  for (auto u : edge[v]) {
    if (!vis[u]) {                    //如果u没有被访问过
      child++;
      tarjan(u, v);                   //找下面这个点
      low[v] = min(low[v], low[u]);   //这个点low[v]的值就是当前low[]的值与找到的u点的low[]值的最小值
      if (father != v &amp;amp;&amp;amp; low[u] &amp;gt;= num[v] &amp;amp;&amp;amp; !flag[v]) flag[v] = true, res++; //如果满足割点的条件就标记是割点，并且让答案的个数增加。
    } else low[v] = min(low[v], num[u]);        //low[v]就取这个点的low值与循环到的点u的dfn[u]的最小值
  }
  if (father == v &amp;amp;&amp;amp; child &amp;gt;= 2 &amp;amp;&amp;amp; !flag[v])    //如果自己有两个儿子并且没有被访问过
                                                //只有不在队列中的点才算儿子。
    flag[v] = true, res++;
}

int main() {
  int n, m;
  n = read(); m = read();
  for (int i = 1; i &amp;lt;= m; i++) {
    int x, y;
    x = read(); y = read();
    edge[x].push_back(y);
    edge[y].push_back(x);
  }
  for (int i = 1; i &amp;lt;= n; i++) 
    if (!vis[i]) index = 0, tarjan(i, i);
  write(res);
  putchar(&apos;\n&apos;);
  for (int i = 1; i &amp;lt;= n; i++) if (flag[i]) write(i);
  putchar(&apos;\n&apos;);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>数据结构：邻接表</title><link>https://xn--24wq0n.top/posts/2021-04-08-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84_%E9%82%BB%E6%8E%A5%E8%A1%A8/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-04-08-%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84_%E9%82%BB%E6%8E%A5%E8%A1%A8/</guid><description>之前我看了很久都没有搞明白邻接表，现在终于差不多搞懂了，特此记录。 那么，邻接表是什么呢？邻接表嘛，就是邻接的表。 其实邻接表不好理解，主要是开的数组比较多，容易弄混，这一分钟好像弄懂了，下一分钟就不</description><pubDate>Thu, 08 Apr 2021 19:38:00 GMT</pubDate><content:encoded>&lt;p&gt;之前我看了很久都没有搞明白邻接表，现在终于差不多搞懂了，特此记录。&lt;/p&gt;
&lt;p&gt;那么，邻接表是什么呢？&lt;s&gt;邻接表嘛，就是邻接的表。&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;其实邻接表不好理解，主要是开的数组比较多，容易弄混，这一分钟好像弄懂了，下一分钟就不知如何下手了。&lt;/p&gt;
&lt;p&gt;那么接下来：&lt;/p&gt;
&lt;h1&gt;每一个数组的作用&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;head[点的序号] = 从它出发的最后一次输入的边的编号
from[边的序号] = 边的起点;
to[边的序号] = 边的终点;
nxt[边的序号] = 输入的上一个从这条边的出发点出发的边的编号;
edge[边的序号] = 边的权值
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;ATTENTION！&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;next&lt;/code&gt;是保留字！&lt;/li&gt;
&lt;li&gt;当然也可以使用结构体。&lt;/li&gt;
&lt;li&gt;其中&lt;strong&gt;除了&lt;code&gt;head[]&lt;/code&gt;，数组的下标全部都是边而不是点！&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;from[]&lt;/code&gt;和&lt;code&gt;to[]&lt;/code&gt;分别是起点和终点（经常可以不用&lt;code&gt;from[]&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;有的书上的&lt;code&gt;ver[]&lt;/code&gt;（如《算法竞赛进阶指南》）就是这里的&lt;code&gt;to[]。&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;add()函数&lt;/h1&gt;
&lt;p&gt;使用邻接表存图的时候，用到的&lt;code&gt;add()&lt;/code&gt;函数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void add(int x, int y, int z) {
    to[++tot] = y, edge[tot] = z; //edge为边的权值，可视情况而用
    nxt[tot] = head[x], head[x] = tot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;好好理解一下，反正我一开始就是卡在“每一个数组的作用”这里。&lt;/p&gt;
</content:encoded></item><item><title>【题解】P3387 【模板】缩点</title><link>https://xn--24wq0n.top/posts/2021-04-08-%E9%A2%98%E8%A7%A3_p3387_%E6%A8%A1%E6%9D%BF_%E7%BC%A9%E7%82%B9/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-04-08-%E9%A2%98%E8%A7%A3_p3387_%E6%A8%A1%E6%9D%BF_%E7%BC%A9%E7%82%B9/</guid><description>题目链接：【模板】缩点 前言 这是一道模板题。需要学习强连通分量和缩点，还有最短路径算法。 审题 给一张图，找一条路径使点权和最大。 思路 先用tarjan算法求出这张图中所有的强连通分量，将它们缩成</description><pubDate>Thu, 08 Apr 2021 15:19:00 GMT</pubDate><content:encoded>&lt;p&gt;题目链接：&lt;a href=&quot;https://www.luogu.com.cn/problem/P3387&quot;&gt;【模板】缩点&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;这是一道模板题。需要学习&lt;a href=&quot;https://www.cnblogs.com/g-mph/p/14632167.html&quot;&gt;强连通分量和缩点&lt;/a&gt;，还有&lt;a href=&quot;https://oi-wiki.org/graph/shortest-path/&quot;&gt;最短路径算法&lt;/a&gt;。&lt;/p&gt;
&lt;h1&gt;审题&lt;/h1&gt;
&lt;p&gt;给一张图，找一条路径使点权和最大。&lt;/p&gt;
&lt;h1&gt;思路&lt;/h1&gt;
&lt;p&gt;先用tarjan算法求出这张图中所有的强连通分量，将它们缩成一点，建一个缩点后的图。
这次题目让我们求这张图上的一条路径，使经过的点权之和最大。看到“最”，就会想到和最短路有关。但是这题求的是&lt;strong&gt;最大&lt;/strong&gt;的&lt;strong&gt;点权&lt;/strong&gt;之和，就需要考虑把最短路算法魔改一下。&lt;/p&gt;
&lt;p&gt;这篇题解使用的是LPFA算法~~（Longest Path Fast Algorithm，发明者：沃·兹基硕德）~~&lt;/p&gt;
&lt;p&gt;把SPFA算法的边权改为点权，松弛改为扩张：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  if (dis[v] &amp;gt; dis[u] + siz[v]) dis[v] = dis[u] + siz[v];
-&amp;gt;if (dis[v] &amp;lt; dis[u] + siz[v]) dis[v] = dis[u] + siz[v];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;整个LPFA的代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void spfa(int s) {          //LPFA开始
  queue&amp;lt;int&amp;gt; que;           //定义队列que
  que.push(s);              //将s push进队列
  dis[s] = siz[s];          //将s出发的最长路的值初始化为它所在连通块的权值之和
  used[s] = true;           //标记s在队列中
  while (!que.empty()) {    //当队列不为空（即有值）时循环
    int u = que.front();    //把u赋为que的队首元素
    que.pop();              //删除que中的第一个元素
    used[u] = false;        //标记u不在队列中
    for (int i = head[u]; ~i; i = edge[i].next) {  //循环从u出发的所有边
      int v = edge[i].to;                //定义点v并把它赋值为这条边的终点
      if (dis[v] &amp;lt; dis[u] + siz[v]) {    //如果现在的“最长路”没有先走u的长度长
	dis[v] = dis[u] + siz[v];        //就对路径进行“扩张”操作
	if (!used[v]) {                  //如果点v不在队列中
	  used[v] = true;                //标记它加入队列
	  que.push(v);                   //把它加入队列
	}
      }
    }
  }
  for (int i = 1; i &amp;lt;= sccnt; i++)       //循环每一个强连通分量，找dis（最长路）的最大值
    ans = max(ans, dis[i]);              //如果dis[i]比答案大，就让答案为dis[i]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;因为需要求出权值的最大和，所以tarjan函数里面多了这样一句：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;siz[sccnt] += val[u];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;整个&lt;code&gt;tarjan()&lt;/code&gt;函数如下&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void tarjan(int v) {       //Tarjan算法
  dfn[v] = low[v] = ++tot; //标记dfn[]访问顺序，还有low[]的初始值
  sta.push(v);             //让点v进栈
  vis[v] = true;           //标记这个点被访问过
  for (int i = head[v]; ~i; i = edge[i].next) { //一直循环这个点每一个出度，直到-1表示没有了，这也是为什么memset head数组时要赋-1
    int u = edge[i].to;               //定义u并把它赋成这条边的终点
    if (!dfn[u]) {                    //如果u没有被访问过
      tarjan(u);                      //找下面这个点
      low[v] = min(low[v], low[u]);   //这个点low[v]的值就是当前low[]的值与找到的u点的low[]值
    } else if (vis[u])                //如果u被访问过了，但是还在队列中
      low[v] = min(low[v], dfn[u]);   //low[v]就取这个点的low值与循环到的点u的dfn[u]的最小值
  }
  if (dfn[v] == low[v]) {   //如果发现v这个点的dfn[]和low[]相等，说明这个点是一个强连通分量的“根”。
    sccnt++;                //scc（Strongly Connected Component）， cnt（count），就是强连通分量的个数
    int u;                  //定义u变量，作为栈顶元素
    do { 
      u = sta.top();        //将u赋值为sta栈的栈顶元素
      vis[u] = false;       //将u弹出
      sta.pop();            //同上
      color[u] = sccnt;     //将u标记为这个强连通分量里的点
      siz[sccnt] += val[u]; //这个强连通分量的权值加上u这个点的权值
    } while (v != u);       //当v == u之后，结束循环
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了使每一个点都被访问到，&lt;code&gt;tarjan()&lt;/code&gt;的调用在循环中进行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  for (int i = 1; i &amp;lt;= n; i++) //循环每一个点
    if (!dfn[i]) tarjan(i);    //如果dfn[i]没有值，即这个点被没有访问过，需要访问；
                               //如果dfn[i]已经有一个值，说明这个点被访问过了，不用担心漏了，
                               //同时也为了节省时间，就不访问了。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;建缩点后的图时，将原来的&lt;code&gt;head[]&lt;/code&gt;和&lt;code&gt;edge[]&lt;/code&gt;数组清空，循环每一条边，如果它的起点和终点不在一个强连通分量中，则连一条边：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  for (int i = 1; i &amp;lt;= m; i++)              //循环每一条边
    if (color[from[i]] != color[to[i]])     //如果这条边的出发点和终止点不在同一个强连通分量中
      add(color[from[i]], color[to[i]]);    //就连一条边
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;代码&lt;/h1&gt;
&lt;p&gt;完整代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;   //万能头文件
using namespace std;       //名字空间，具体我也不知有啥用，但是有用到了iostream就得加这个，否则就得std::
const int maxN = 2e5 + 3;  //数组大小

struct Edge {
  int next, to;            //用结构体存邻接表
} edge[maxN];
int head[maxN], dfn[maxN], low[maxN];
int color[maxN], val[maxN], siz[maxN];
int from[maxN], to[maxN], dis[maxN];
bool vis[maxN], used[maxN];
int cnt, tot, sccnt, ans, n, m;
stack&amp;lt;int&amp;gt; sta;

//以上定义了一包变量和数组

template&amp;lt;typename Tp&amp;gt; void read(Tp &amp;amp;x) {
  char c = getchar();      //先输入一个字符
  x = 0;                   //定义x并初始化为0，用来累计输入的数
  while (!isdigit(c)) c = getchar(); //如果这个字符不是数字的话，就一直读下一个字符（本题没有负数情况）
  do {
    x = x * 10 + (c ^ 48); //先把x×10，然后与c^48相加
                           //十进制48转换为二进制为110000，而&apos;0&apos;到&apos;9&apos;都是11****，异或会使不同的位为1，相同的位为0
    c = getchar();         //读下一个字符
  } while (isdigit(c));    //循环条件为读到的为数字，则一直循环到读入的不是数字为止
}

void add(int from, int to) {
  edge[++cnt].next = head[from], edge[cnt].to = to, head[from] = cnt;
}

void tarjan(int v) {       //Tarjan算法
  dfn[v] = low[v] = ++tot; //标记dfn[]访问顺序，还有low[]的初始值
  sta.push(v);             //让点v进栈
  vis[v] = true;           //标记这个点被访问过
  for (int i = head[v]; ~i; i = edge[i].next) { //一直循环这个点每一个出度，直到-1表示没有了，这也是为什么memset head数组时要赋-1
    int u = edge[i].to;               //定义u并把它赋成这条边的终点
    if (!dfn[u]) {                    //如果u没有被访问过
      tarjan(u);                      //找下面这个点
      low[v] = min(low[v], low[u]);   //这个点low[v]的值就是当前low[]的值与找到的u点的low[]值
    } else if (vis[u])                //如果u被访问过了，但是还在队列中
      low[v] = min(low[v], dfn[u]);   //low[v]就取这个点的low值与循环到的点u的dfn[u]的最小值
  }
  if (dfn[v] == low[v]) {   //如果发现v这个点的dfn[]和low[]相等，说明这个点是一个强连通分量的“根”。
    sccnt++;                //scc（Strongly Connected Component）， cnt（count），就是强连通分量的个数
    int u;                  //定义u变量，作为栈顶元素
    do { 
      u = sta.top();        //将u赋值为sta栈的栈顶元素
      vis[u] = false;       //将u弹出
      sta.pop();            //同上
      color[u] = sccnt;     //将u标记为这个强连通分量里的点
      siz[sccnt] += val[u]; //这个强连通分量的权值加上u这个点的权值
    } while (v != u);       //当v == u之后，结束循环
  }
}
void spfa(int s) {          //LPFA开始
  queue&amp;lt;int&amp;gt; que;           //定义队列que
  que.push(s);              //将s push进队列
  dis[s] = siz[s];          //将s出发的最长路的值初始化为它所在连通块的权值之和
  used[s] = true;           //标记s在队列中
  while (!que.empty()) {    //当队列不为空（即有值）时循环
    int u = que.front();    //把u赋为que的队首元素
    que.pop();              //删除que中的第一个元素
    used[u] = false;        //标记u不在队列中
    for (int i = head[u]; ~i; i = edge[i].next) {  //循环从u出发的所有边
      int v = edge[i].to;                //定义点v并把它赋值为这条边的终点
      if (dis[v] &amp;lt; dis[u] + siz[v]) {    //如果现在的“最长路”没有先走u的长度长
	dis[v] = dis[u] + siz[v];        //就对路径进行“扩张”操作
	if (!used[v]) {                  //如果点v不在队列中
	  used[v] = true;                //标记它加入队列
	  que.push(v);                   //把它加入队列
	}
      }
    }
  }
  for (int i = 1; i &amp;lt;= sccnt; i++)       //循环每一个强连通分量，找dis（最长路）的最大值
    ans = max(ans, dis[i]);              //如果dis[i]比答案大，就让答案为dis[i]
}
int main() {
  memset(head, -1, sizeof(head));            //把head[]数组初始化为-1，具体原因见tarjan函数
  read(n), read(m);                          //输入n、m
  for (int i = 1; i &amp;lt;= n; i++) read(val[i]); //输入每一个点的权值
  for (int i = 1; i &amp;lt;= m; i++) {
    read(from[i]), read(to[i]);              //输入每一条边的起点和重点
    add(from[i], to[i]);                     //把起点和终点连一条边
  }
  for (int i = 1; i &amp;lt;= n; i++) //循环每一个点
    if (!dfn[i]) tarjan(i);    //如果dfn[i]没有值，即这个点被没有访问过，需要访问；
                               //如果dfn[i]已经有一个值，说明这个点被访问过了，不用担心漏了，
                               //同时也为了节省时间，就不访问了。
  memset(head, -1, sizeof(head));           //将原来的head[]数组清空，以便重新建图
  memset(edge, 0, sizeof(edge));            //将原来的edge[]数组清空，以便重新建图
  for (int i = 1; i &amp;lt;= m; i++)              //循环每一条边
    if (color[from[i]] != color[to[i]])     //如果这条边的出发点和终止点不在同一个强连通分量中
      add(color[from[i]], color[to[i]]);    //就连一条边
  for (int i = 1; i &amp;lt;= sccnt; i++) spfa(i); //循环每一个连通块（单独的一个点也是一个连通块），因为每一个连通块已经缩成一个点，所以就可以当作一个点来对待
  printf(&quot;%d\n&quot;, ans);                      //输出答案
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>全网最最详细！一文讲懂Tarjan算法求强连通分量 &amp; 缩点</title><link>https://xn--24wq0n.top/posts/2021-04-08-%E5%85%A8%E7%BD%91%E6%9C%80%E6%9C%80%E8%AF%A6%E7%BB%86_%E4%B8%80%E6%96%87%E8%AE%B2%E6%87%82_tarjan_%E7%AE%97%E6%B3%95%E6%B1%82%E5%BC%BA%E8%BF%9E%E9%80%9A%E5%88%86%E9%87%8F_%E7%BC%A9%E7%82%B9/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-04-08-%E5%85%A8%E7%BD%91%E6%9C%80%E6%9C%80%E8%AF%A6%E7%BB%86_%E4%B8%80%E6%96%87%E8%AE%B2%E6%87%82_tarjan_%E7%AE%97%E6%B3%95%E6%B1%82%E5%BC%BA%E8%BF%9E%E9%80%9A%E5%88%86%E9%87%8F_%E7%BC%A9%E7%82%B9/</guid><description>网上看了几篇博客，还有OI Wiki，觉得整合度不够，于是特意写了篇博客。 参考资料 全网最!详!细!Tarjan算法讲解。 强连通分量(SCC)与缩点 强连通分量 - OI Wiki 正文 在学习强</description><pubDate>Thu, 08 Apr 2021 14:46:00 GMT</pubDate><content:encoded>&lt;p&gt;网上看了几篇博客，还有OI Wiki，觉得整合度不够，于是特意写了篇博客。&lt;/p&gt;
&lt;h1&gt;参考资料&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://blog.csdn.net/hurmishine/article/details/75248876&quot;&gt;全网最!详!细!Tarjan算法讲解。&lt;/a&gt;
&lt;a href=&quot;https://hawa130.wordpress.com/2018/08/09/scc%e4%b8%8e%e7%bc%a9%e7%82%b9/&quot;&gt;强连通分量(SCC)与缩点&lt;/a&gt;
&lt;a href=&quot;https://oi-wiki.org/graph/scc/&quot;&gt;强连通分量 - OI Wiki&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;正文&lt;/h1&gt;
&lt;p&gt;在学习强连通分量和缩点之前，请务必理解邻接表。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;以下有OI Wiki的内容，有大佬博客里的内容，也有我自己的内容。&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;强连通分量&lt;/h2&gt;
&lt;h3&gt;引入&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;强连通&lt;/strong&gt;的定义是：&lt;strong&gt;有向图&lt;/strong&gt; G 强连通是指，G 中任意两个结点连通。
&lt;strong&gt;强连通分量&lt;/strong&gt;（Strongly Connected Components，简称SCC）的定义是：极大的&lt;strong&gt;强连通&lt;/strong&gt;子图。&lt;/p&gt;
&lt;p&gt;举一个简单的例子。下面是一个有向图。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210407155502931-1113229678.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在这个图中， 1和2互相有路径可以到达对方，所以这两个点&lt;strong&gt;强连通&lt;/strong&gt;；
1、2和3中任意两个点都连通，它们是这整个有向图的&lt;strong&gt;强连通分量&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;求强连通分量。&lt;/h3&gt;
&lt;p&gt;下面我们介绍使用Tarjan算法求强连通分量。&lt;/p&gt;
&lt;p&gt;我们举个例子说明这个算法是怎么运作的。图片取自《算法竞赛进阶指南》。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210407171359016-1783656070.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;从 $①$ 进入，&lt;code&gt;dfn[1] = low[1] = ++index == 1&lt;/code&gt;
入栈 $①$，此时的栈中元素为 $①$，&lt;code&gt;vis[1] = true&lt;/code&gt;，即点 $①$ 在栈中。&lt;/p&gt;
&lt;p&gt;往下找到 $②$，&lt;code&gt;dfn[2] = low[2] = ++index == 2&lt;/code&gt;
入栈 $②$，此时栈中元素为 $①②$，&lt;code&gt;vis[2] = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;继续往下找到 $③$，&lt;code&gt;dfn[3] = low[3] = ++index == 3&lt;/code&gt;
入栈 $③$，此时栈中元素为 $①②③$，&lt;code&gt;vis[3] = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;继续往下找到 $④$，&lt;code&gt;dfn[4] = low[4] = ++index == 4&lt;/code&gt;
入栈 $④$，此时栈中元素为 $①②③④$，&lt;code&gt;vis[4] = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;继续往下找到 $⑤$，&lt;code&gt;dfn[5] = low[5] = ++index == 5&lt;/code&gt;
入栈 $5$，此时栈中元素为 $①②③④⑤$，&lt;code&gt;vis[5] = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;继续往下找到 $②$ 他太爷爷，&lt;code&gt;dfn[2]&lt;/code&gt;被访问过并且还在栈中，说明这个 $②$ 还在这个强连通分量中，值得发现。&lt;code&gt;low[5] = min(low[5], dfn[2])&lt;/code&gt;
确定关系：$⑤$ 节点比 $②$ 节点出现得晚，即&lt;code&gt;low[5] &amp;gt; dfn[2]&lt;/code&gt;，所以 $⑤$ 是 $①$ 的子节点；&lt;code&gt;low[5] = 2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210408120750087-1239579580.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后发现 $⑤$ 这个点没有出边了，返回到 $④$ 这个点。
于是&lt;code&gt;low[4] = min(low[4], low[5]) = 2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;$④$ 这个点也没有出边了，返回到 $③$ 这个点。
于是&lt;code&gt;low[3] = min(low[3], low[4]) = 2&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;$③$ 这个点也没有出边了，返回到 $②$ 这个点。
于是&lt;code&gt;low[2] = min(low[2], low[2]) = 2&lt;/code&gt;，对没错，还是2&lt;/p&gt;
&lt;p&gt;$②$ 也没有出边，但是这时我们会发现&lt;code&gt;low[2] == dfn[2] == 2&lt;/code&gt;，这就是说，点 $②$ 是这个强连通分量的根，于是&lt;code&gt;sccnt++&lt;/code&gt;（&lt;code&gt;sccnt&lt;/code&gt;：强连通分量的个数），一直弹出栈顶元素，并把栈顶元素的颜色标记为&lt;code&gt;sccnt&lt;/code&gt;（&lt;code&gt;color[2] = sccnt&lt;/code&gt;），直到栈顶元素为2时最后弹出一次并标记颜色。此时栈中元素为 $①$，&lt;code&gt;vis[5] = vis[4] = vis[3] = vis[2] = false&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;返回到 $①$。因为 $①$ 比 $②$ 出现得早，即&lt;code&gt;low[1] &amp;lt; low[2]&lt;/code&gt;，所以&lt;code&gt;low[1]&lt;/code&gt;的值没变，还是1&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;点 $①$ 还有出边，继续往下找到 $⑤$。嗯？&lt;code&gt;dfn[5]&lt;/code&gt;已经有一个值&lt;code&gt;5&lt;/code&gt;了，再看&lt;code&gt;vis[5] == false&lt;/code&gt;，说明 $⑤$ 这个点已经不在栈中了，所以&lt;code&gt;low[1] = min(low[1], dfn[5]) = 1&lt;/code&gt;（因为&lt;code&gt;low[1] == 1&lt;/code&gt;，&lt;code&gt;dfn[5] == 2&lt;/code&gt;）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210408153303833-1606888411.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;s&gt;唉，现在同学都在准备省选，要不是我去年NOIP第一题用了邻接矩阵，数组开得太大了，我也去参加省选了（看出我有多蒻了吧）&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;点 $①$ 还有出边，继续往下找找到 $⑥$，&lt;code&gt;dfn[6] = low[6] = ++index == 6&lt;/code&gt;
入栈 $⑥$，此时栈中元素为 $①⑥$ ，&lt;code&gt;vis[6] = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;继续往下找到 $⑦$，&lt;code&gt;dfn[7] = low[7] = ++index = 7&lt;/code&gt;
入栈 $⑦$，此时栈中元素为 $①⑥⑦$，&lt;code&gt;vis[7] = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;继续往下找到 $④$，发现&lt;code&gt;dfn[4] == 4&lt;/code&gt;，说明 $④$ 已经被访问过了，又因为&lt;code&gt;vis[4] == false&lt;/code&gt;，也就是 $④$ 不在栈中，就不用管它。&lt;/p&gt;
&lt;p&gt;$⑦$ 没有别的出边了。判断此时&lt;code&gt;dfn[7] == low[7] == 7&lt;/code&gt;，所以 $⑦$ 是一个强连通分量的根。于是：Ⅰ：&lt;code&gt;sccnt++&lt;/code&gt;；Ⅱ：把栈顶元素（即 $⑦$ 的颜色标记为&lt;code&gt;sccnt&lt;/code&gt;），将其弹出。此时栈中元素为 $①⑥$。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210408153336297-1727278672.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;返回到 $⑥$，找到点 $⑧$，&lt;code&gt;dfn[8] = low[8] = ++index = 8&lt;/code&gt;
入栈 $⑧$，此时栈中元素为 $①⑥⑧$，&lt;code&gt;vis[8] = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;往下找到 $⑦$，发现&lt;code&gt;dfn[7] == 7&lt;/code&gt;，说明 $⑦$ 已经被访问过了，又因为&lt;code&gt;vis[7] ==false&lt;/code&gt;，$⑦$ 不在栈中，不用管。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210408134943028-1679655274.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;回到 $⑧$，它还有一条出边到 $⑨$，&lt;code&gt;dfn[9] = low[9] = ++index = 9&lt;/code&gt;
入栈 $⑨$，此时栈中元素为 $①⑥⑧⑨$，&lt;code&gt;vis[9] = true&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;再往下找到 $⑥$，找到了他爷爷（他爸是 $⑧$），&lt;code&gt;dfn[6]&lt;/code&gt;被访问过并且还在栈中，说明这个 $⑥$ 还在这个强连通分量中。&lt;code&gt;low[9] = min(low[9], dfn[6]) = 6&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;接着就是：
&lt;code&gt;low[8] = min(low[8], low[9]) = 6&lt;/code&gt;
&lt;code&gt;low[6] = min(low[6], low[8]) = 6&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;此时 $⑥$ 的出边已经找完了，又因为&lt;code&gt;low[6] == dfn[6] == 6&lt;/code&gt;，所以 $⑥$ 是强连通分量的根，&lt;code&gt;sccnt++&lt;/code&gt;，一直弹出栈顶元素，将栈顶元素颜色标记为&lt;code&gt;sccnt&lt;/code&gt;，直到栈顶元素为6，最后弹出一次，标记颜色。此时栈中元素为 $①$，&lt;code&gt;vis[9] = vis[8] = vis[6] = false&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210408135157404-1017651600.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;返回到 $①$，$①$的出边也已经找完了，因为&lt;code&gt;low[1] == dfn[1] == 1&lt;/code&gt;，所以 $①$ 是强连通分量的根，&lt;code&gt;sccnt++&lt;/code&gt;，弹出栈顶元素（1），将栈顶元素颜色标记为&lt;code&gt;sccnt&lt;/code&gt;。此时栈为空，&lt;code&gt;vis[1] = false&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210408135711354-1312300059.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这个时候就完了吗？！
你以为就完了吗？！
然而并没有完，万一只走了一遍tarjan整个图没有找完怎么办呢？！
所以。tarjan的调用要在循环里解决，以使每一个点都被访问到。&lt;/p&gt;
&lt;h3&gt;代码&lt;/h3&gt;
&lt;p&gt;下面是tarjan函数的代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void tarjan(int v) {       //Tarjan算法
  dfn[v] = low[v] = ++tot; //标记dfn[]访问顺序，还有low[]的初始值
  sta.push(v);             //让点v进栈
  vis[v] = true;           //标记这个点被访问过
  for (int i = head[v]; ~i; i = edge[i].next) { //一直循环这个点每一个出度，直到-1表示没有了，这也是为什么memset head数组时要赋-1
    int u = edge[i].to;               //定义u并把它赋成这条边的终点
    if (!dfn[u]) {                    //如果u没有被访问过
      tarjan(u);                      //找下面这个点
      low[v] = min(low[v], low[u]);   //这个点low[v]的值就是当前low[]的值与找到的u点的low[]值
    } else if (vis[u])                //如果u被访问过了，但是还在队列中
      low[v] = min(low[v], dfn[u]);   //low[v]就取这个点的low值与循环到的点u的dfn[u]的最小值
  }
  if (dfn[v] == low[v]) {   //如果发现v这个点的dfn[]和low[]相等，说明这个点是一个强连通分量的“根”。
    sccnt++;                //scc（Strongly Connected Component）， cnt（count），就是强连通分量的个数
    int u;                  //定义u变量，作为栈顶元素
    do { 
      u = sta.top();        //将u赋值为sta栈的栈顶元素
      vis[u] = false;       //将u弹出
      sta.pop();            //同上
      color[u] = sccnt;     //将u标记为这个强连通分量里的点
    } while (v != u);       //当v == u之后，结束循环
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在主函数里像这样调用tarjan函数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  for (int i = 1; i &amp;lt;= n; i++) //循环每一个点
    if (!dfn[i]) tarjan(i);    //如果dfn[i]没有值，即这个点被没有访问过，需要访问；
                               //如果dfn[i]已经有一个值，说明这个点被访问过了，不用担心漏了，
                               //同时也为了节省时间，就不访问了。
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;缩点&lt;/h2&gt;
&lt;h3&gt;引入&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;缩点&lt;/strong&gt;的定义：把&lt;strong&gt;强连通分量&lt;/strong&gt;看成是一个大点，保留那些不在强连通分量里的边，这样的图就是&lt;strong&gt;缩点&lt;/strong&gt;后的图。
缩点后的图保留了所有不在分量里的边，而且缩点后的图是一个&lt;strong&gt;有向无环图&lt;/strong&gt;（DAG），可以进行拓扑排序。&lt;/p&gt;
&lt;p&gt;那么，缩点之后的图，就成了这样：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210408142101139-1395943988.png&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;缩点的解决&lt;/h3&gt;
&lt;p&gt;现在问题来了，怎么储存缩点后的图？&lt;/p&gt;
&lt;p&gt;在一开始调用的tarjan函数中，我们已经把同一个强连通分量中的点标记成了相同的颜色。为了重新建立一个缩点后的图，我们先把&lt;code&gt;head[]&lt;/code&gt;数组和&lt;code&gt;edge[]&lt;/code&gt;数组清空，在读入边的时候，我们把边的起点和终点分别存到&lt;code&gt;from[]&lt;/code&gt;数组和&lt;code&gt;to[]&lt;/code&gt;数组中。
在建立邻接表储存缩点后的图时，判断这些输入的点是否在同一个 SCC 中，如果不在就连边。
用如下代码建立缩点后的图：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  for (int i = 1; i &amp;lt;= m; i++)              //循环每一条边
    if (color[from[i]] != color[to[i]])     //如果这条边的出发点和终止点不在同一个强连通分量中
      add(color[from[i]], color[to[i]]);    //就连一条边
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;【模板】缩点&lt;/h2&gt;
&lt;p&gt;题目链接：&lt;a href=&quot;https://www.luogu.com.cn/problem/P3387&quot;&gt;【模板】缩点&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;审题&lt;/h3&gt;
&lt;p&gt;这题不仅需要缩点，还要找出一条路径使点权和最大。
因为 强连通分量（SCC） 中点可以互相到达，所以需要缩点使图变成一个有向无环图（DAG），强连通分量 内所有点权和即为缩点后该点的点权。
这题可以使用LPFA算法~~（Longest Path Fast Algorithm，发明者：沃·兹基硕德）~~来解决。
把松弛改为扩张：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  if (dis[v] &amp;gt; dis[u] + siz[v]) dis[v] = dis[u] + siz[v];
-&amp;gt;if (dis[v] &amp;lt; dis[u] + siz[v]) dis[v] = dis[u] + siz[v];
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;代码&lt;/h3&gt;
&lt;p&gt;详情请见&lt;a href=&quot;https://www.cnblogs.com/g-mph/p/14632462.html&quot;&gt;【题解】P3387 【模板】缩点&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>【题解】LibreOJ #6279. 数列分块入门 3</title><link>https://xn--24wq0n.top/posts/2021-04-05-%E9%A2%98%E8%A7%A3_libreoj_6279_%E6%95%B0%E5%88%97%E5%88%86%E5%9D%97%E5%85%A5%E9%97%A8_3/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-04-05-%E9%A2%98%E8%A7%A3_libreoj_6279_%E6%95%B0%E5%88%97%E5%88%86%E5%9D%97%E5%85%A5%E9%97%A8_3/</guid><description>题目链接：LibreOJ #6279. 数列分块入门 3 题面 题目描述 给定一个长为 \(n\) 的数列，以及 \(n\) 个操作，操作涉及区间加法，询问区间内小于某个值 \(x\) 的前驱（比其小</description><pubDate>Mon, 05 Apr 2021 21:50:00 GMT</pubDate><content:encoded>&lt;p&gt;题目链接：&lt;a href=&quot;https://loj.ac/p/6279&quot;&gt;LibreOJ #6279. 数列分块入门 3&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;题面&lt;/h1&gt;
&lt;h2&gt;题目描述&lt;/h2&gt;
&lt;p&gt;给定一个长为 $n$ 的数列，以及 $n$ 个操作，操作涉及区间加法，询问区间内小于某个值 $x$ 的前驱（比其小的最大元素）。&lt;/p&gt;
&lt;h2&gt;输入格式&lt;/h2&gt;
&lt;p&gt;第一行输入一个数字 $n$。&lt;/p&gt;
&lt;p&gt;第二行输入 $n$ 个数字，第 $i$ 个数字为 $a_i$，以空格隔开。&lt;/p&gt;
&lt;p&gt;接下来输入 $n$ 行询问，每行输入四个数字 $\rm{opt}、l、r、c$，以空格隔开。&lt;/p&gt;
&lt;p&gt;若 $\rm opt=0$，表示将位于 $\left[l, r\right]$ 的之间的数字都加 $c$。&lt;/p&gt;
&lt;p&gt;若 $\rm opt=1$，表示询问 $\left[l, r\right]$ 中 $c$ 的前驱的值（不存在则输出 $\rm -1$）。&lt;/p&gt;
&lt;h2&gt;输出格式&lt;/h2&gt;
&lt;p&gt;对于每次询问，输出一行一个数字表示答案。&lt;/p&gt;
&lt;h2&gt;样例（很水）&lt;/h2&gt;
&lt;p&gt;Input&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;3
-1
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据范围与提示&lt;/h2&gt;
&lt;p&gt;对于 $100%$ 的数据，$1\leq n\leq 100000,-2^{31}\leq {\rm others}$、${\rm ans}\leq 2^{31}-1$。&lt;/p&gt;
&lt;h1&gt;对题目的吐槽&lt;/h1&gt;
&lt;p&gt;这个样例是真的水，从样例中根本找不出自己程序任何错误。。。。&lt;/p&gt;
&lt;p&gt;我一开始程序内层循环用的是i变量，样例居然给我过了？！&lt;/p&gt;
&lt;h1&gt;思路&lt;/h1&gt;
&lt;h2&gt;审题&lt;/h2&gt;
&lt;p&gt;这道题他说要求前驱的值。要求前驱的值如果直接暴力查找的话肯定会T飞，所以需要用到分块来优化。&lt;/p&gt;
&lt;h2&gt;解法&lt;/h2&gt;
&lt;p&gt;加c的核心代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (int j = x; j &amp;lt;= r[b[x]]; j++) a[j] += k;         //左边不完整块暴力相加
for (int j = l[b[x]]; j &amp;lt;= r[b[x]]; j++) d[j] = a[j]; //将a[]数组复制一份给d[]数组，以此来达到将数组排序而不破坏原数组顺序
sort(d + l[b[x]], d + r[b[x]] + 1);                   //将d[]数组排序
for (int j = l[b[y]]; j &amp;lt;= y; j++) a[j] += k;         //右边不完整块暴力相加
for (int j = l[b[y]]; j &amp;lt;= r[b[y]]; j++) d[j] = a[j]; //将a[]数组复制一份给d[]数组，以此来达到将数组排序而不破坏原数组顺序
sort(d + l[b[y]], d + r[b[y]] + 1);                    //将d[]数组排序
for (int j = b[x] + 1; j &amp;lt;= b[y] - 1; j++)  lazy[j] += k; //用lazyp[]数组对中间完整块做标记，减少运算量
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查询的核心代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (int j = x; j &amp;lt;= r[b[x]]; j++) //暴力查询左边不完整块
  if ((lazy[b[x]] + a[j] &amp;lt; k) &amp;amp;&amp;amp; (lazy[b[x]] + a[j] &amp;gt; maxx)/*需要保证这个比k小并且比maxx大*/)
    maxx = lazy[b[x]] + a[j]; 
for (int j = l[b[y]]; j &amp;lt;= y; j++) //暴力查询右边不完整块
  if ((lazy[b[y]] + a[j] &amp;lt; k) &amp;amp;&amp;amp; (lazy[b[y]] + a[j] &amp;gt; maxx))
    maxx = lazy[b[y]] + a[j];
for (int j = b[x] + 1; j &amp;lt;= b[y] - 1; j++) {
  if (k - lazy[j] &amp;lt;= d[(j - 1) * block + 1]) continue;
  int num = lower_bound(d + l[j], d + r[j] + 1, k - lazy[j]) - d - 1; 
  //lower_bound函数返回的是大于或等于k - lazy[j]的第一个数的地址（指针），减去d可得数组下标，再减一即可得到前驱
  maxx = maxx &amp;gt; (d[num] + lazy[j]) ? maxx : (d[num] + lazy[j]);
}
if (maxx == -1) write(-1); //如果maxx没变（即没找到），则输出-1
else write(maxx); //否则输出maxx（前驱）
&lt;/code&gt;&lt;/pre&gt;
&lt;h1&gt;代码&lt;/h1&gt;
&lt;p&gt;这次的代码是LibreOJ格式化过的，总觉得有亿点奇怪&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;algorithm&amp;gt; //sort()要用
#include &amp;lt;cstdio&amp;gt;
#include &amp;lt;cmath&amp;gt; //sqrt()y要用
#define int long long
using namespace std;

int a[1000005], d[1000005], l[1005], r[1005], b[1000005], lazy[1005];
int n, q, block, tot, x, y, k;
int c;

inline int read() { //快读
    int X = 0;
    bool flag = 1;
    char ch = getchar();

    while (ch &amp;lt; &apos;0&apos; || ch &amp;gt; &apos;9&apos;) {
        if (ch == &apos;-&apos;)
            flag = 0;

        ch = getchar();
    }

    while (ch &amp;gt;= &apos;0&apos; &amp;amp;&amp;amp; ch &amp;lt;= &apos;9&apos;) {
        X = (X &amp;lt;&amp;lt; 1) + (X &amp;lt;&amp;lt; 3) + ch - &apos;0&apos;;
        ch = getchar();
    }

    if (flag)
        return X;

    return ~(X - 1);
}

inline void write(int X) { //快写
    if (X &amp;lt; 0) {
        putchar(&apos;-&apos;);
        X = ~(X - 1);
    }

    int s[50], top = 0;

    while (X) {
        s[++top] = X % 10;
        X /= 10;
    }

    if (!top)
        s[++top] = 0;

    while (top)
        putchar(s[top--] + &apos;0&apos;);

    putchar(&apos;\n&apos;);
    return;
}


signed main() {
    n = read();

    for (int i = 1; i &amp;lt;= n; i++)
        a[i] = read();

    block = sqrt(n), tot = n / block;

    if (n % block)
        tot++; //如果数的个数不是块长的倍数的话，还要再增加一个块的个数

    for (int i = 1; i &amp;lt;= n; i++)
        b[i] = (i - 1) / block + 1, d[i] = a[i];

    for (int i = 1; i &amp;lt;= tot; i++)
        l[i] = (i - 1) * block + 1, r[i] = i * block;

    r[tot] = n;

    for (int i = 1; i &amp;lt;= tot; i++)
        sort(d + l[i], d + r[i] + 1);

    for (int i = 1; i &amp;lt;= n; i++) {
        c = read();
        x = read();
        y = read();
        k = read();

        if (c == 0) {
            if (b[x] == b[y]) { //如果x和y在同一个块内，就直接只能暴力相加
                for (int j = x; j &amp;lt;= y; j++)
                    a[j] += k;

                for (int j = l[b[x]]; j &amp;lt;= r[b[x]]; j++)
                    d[j] = a[j];

                sort(d + l[b[x]], d + r[b[x]] + 1);
            } else {
                for (int j = x; j &amp;lt;= r[b[x]]; j++) //左边不完整块暴力相加
                    a[j] += k;

                for (int j = l[b[x]]; j &amp;lt;= r[b[x]]; j++) //将a[]数组复制一份给d[]数组，以此来达到将数组排序而不破坏原数组顺序
                    d[j] = a[j];

                sort(d + l[b[x]], d + r[b[x]] + 1); //将d[]数组排序

                for (int j = l[b[y]]; j &amp;lt;= y; j++) //右边不完整块暴力相加
                    a[j] += k;

                for (int j = l[b[y]]; j &amp;lt;= r[b[y]]; j++) //将a[]数组复制一份给d[]数组，以此来达到将数组排序而不破坏原数组顺序
                    d[j] = a[j];

                sort(d + l[b[y]], d + r[b[y]] + 1); //将d[]数组排序

                for (int j = b[x] + 1; j &amp;lt;= b[y] - 1; j++) //用lazyp[]数组对中间完整块做标记，减少运算量
                    lazy[j] += k;
            }
        }

        if (c == 1) {
            int maxx = -1;

            if (b[x] == b[y]) { //如果x和y在同一个块内，就直接只能暴力求解
                for (int j = x; j &amp;lt;= y; j++)
                    if ((lazy[b[x]] + a[j] &amp;lt; k) &amp;amp;&amp;amp; (lazy[b[x]] + a[j] &amp;gt; maxx))
                        maxx = lazy[b[x]] + a[j];

                if (maxx == -1)
                    write(-1);
                else
                    write(maxx);
                continue;
            } else {
                for (int j = x; j &amp;lt;= r[b[x]]; j++) //暴力查询左边不完整块
                    if ((lazy[b[x]] + a[j] &amp;lt; k) &amp;amp;&amp;amp; (lazy[b[x]] + a[j] &amp;gt; maxx))
                        maxx = lazy[b[x]] + a[j];
                for (int j = l[b[y]]; j &amp;lt;= y; j++) //暴力查询右边不完整块
                    if ((lazy[b[y]] + a[j] &amp;lt; k) &amp;amp;&amp;amp; (lazy[b[y]] + a[j] &amp;gt; maxx))
                        maxx = lazy[b[y]] + a[j];
                for (int j = b[x] + 1; j &amp;lt;= b[y] - 1; j++) {
                    if (k - lazy[j] &amp;lt;= d[(j - 1) * block + 1])
                        continue;
                    int num = lower_bound(d + l[j], d + r[j] + 1, k - lazy[j]) - d - 1;
                    //lower_bound函数返回的是大于或等于k - lazy[j]的第一个数的地址（指针），减去d可得数组下标，再减一即可得到前驱
                    maxx = (maxx &amp;gt; (d[num] + lazy[j])) ? maxx : (d[num] + lazy[j]);
                }
                if (maxx == -1) //如果maxx没变（即没找到），则输出-1
                    write(-1);
                else
                    write(maxx); //否则输出maxx（前驱）
            }
        }
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>【题解】LibreOJ #6281. 数列分块入门 5</title><link>https://xn--24wq0n.top/posts/2021-04-05-%E9%A2%98%E8%A7%A3_libreoj_6281_%E6%95%B0%E5%88%97%E5%88%86%E5%9D%97%E5%85%A5%E9%97%A8_5/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-04-05-%E9%A2%98%E8%A7%A3_libreoj_6281_%E6%95%B0%E5%88%97%E5%88%86%E5%9D%97%E5%85%A5%E9%97%A8_5/</guid><description>题目链接：LibreOJ #6281. 数列分块入门 5 题面 题目描述 给定一个长为 \(n\) 的数列 \(a_1\dots a_n\)，以及 \(n\) 个操作，操作涉及区间开方，区间求和。 输</description><pubDate>Mon, 05 Apr 2021 11:05:00 GMT</pubDate><content:encoded>&lt;p&gt;题目链接：&lt;a href=&quot;https://loj.ac/p/6281&quot;&gt;LibreOJ #6281. 数列分块入门 5&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;题面&lt;/h1&gt;
&lt;h2&gt;题目描述&lt;/h2&gt;
&lt;p&gt;给定一个长为 $n$ 的数列 $a_1\dots a_n$，以及 $n$ 个操作，操作涉及区间开方，区间求和。&lt;/p&gt;
&lt;h2&gt;输入格式&lt;/h2&gt;
&lt;p&gt;第一行输入一个数字 $n$。&lt;/p&gt;
&lt;p&gt;第二行输入 $n$ 个数字，第 $i$ 个数字为 $a_i$，以空格隔开。&lt;/p&gt;
&lt;p&gt;接下来输入 $n$ 行询问，每行输入四个数字 $\rm{opt},l,r,c$，以空格隔开。&lt;/p&gt;
&lt;p&gt;若 $\rm opt=0$，表示将位于 $\left[l, r\right]$ 的之间的数字都开方。对于区间中每个 $a_i\left(l\leq i\leq r\right)\longleftarrow \lfloor \sqrt a_i \rfloor$&lt;/p&gt;
&lt;p&gt;若 $\rm opt=1$，表示询问位于 $\left[l, r\right]$ 的所有数字的和。&lt;/p&gt;
&lt;h2&gt;输出格式&lt;/h2&gt;
&lt;p&gt;对于每次询问，输出一行一个数字表示答案。&lt;/p&gt;
&lt;h2&gt;样例（很水）&lt;/h2&gt;
&lt;p&gt;Input&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;4
1 2 2 3
0 1 3 1
1 1 4 4
0 1 2 2
1 1 2 4
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;6
2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据范围与提示&lt;/h2&gt;
&lt;p&gt;对于 $100%$ 的数据，$1\leq n\leq 50000,-2^{31}\leq {\rm others}$、${\rm ans}\leq 2^{31}-1$。&lt;/p&gt;
&lt;h1&gt;写博客时的吐槽&lt;/h1&gt;
&lt;p&gt;$\rm \LaTeX$是真nm难打啊。。&lt;/p&gt;
&lt;h1&gt;思路&lt;/h1&gt;
&lt;h2&gt;审题&lt;/h2&gt;
&lt;p&gt;与平时最简单的数列分块入门的区别在于，这个数列分块入门五并不是加上or减去一个数，而是开方。这两者的区别在于，加上或者减去一个数与这个数本身无关，可以直接相加减，可以直接做记号表示这个块加上或减去了某个数。&lt;/p&gt;
&lt;p&gt;加上或减去某个数时，在完整块中，这一个块每一个数增加或减少的值都相同，就可以很容易地给这一整个块做标记。&lt;/p&gt;
&lt;p&gt;但是做开方运算时（其实乘方、乘除都很坑），每一个块增加或者减小的值不相等，就导致了不能把这一整个块增加或减小的值做一个标记，这就相当于把分块废掉了。&lt;/p&gt;
&lt;h2&gt;解法&lt;/h2&gt;
&lt;p&gt;这是一道题目，总不可能没有解法吧。&lt;/p&gt;
&lt;p&gt;我们用到了下面这个$\rm sol()$函数来解决这个问题。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void sol(int x) {
  if (flag[x]) return; //如果这个块被标记了，就废了，直接返回，节省时间
                       //标记原则后面会讲
  flag[x] = true;      //先把这个块标记
  sum[x] = 0;          //将sum[]数组初始化为零
  for (int i = (x - 1) * len + 1; i &amp;lt;= x * len; i++) { //循环块内每一个值
    a[i] = sqrt(a[i]), sum[x] += a[i]; //对块内每一个数都做开方运算，再把他们的和存进sum[]数组里面
    if (a[i] &amp;gt; 1) flag[x] = false;     //如果这一个值还大于1，也就是还能够进行开方，这个块就还能继续开放，把flag[]标记去除
  }
  return;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从上面的函数中可以看出，我们把已经不能再开方的块进行跳过，大大节约了程序开方的时间。这就是代码的关键。&lt;/p&gt;
&lt;p&gt;剩下的地方就和普通的数列分块差不多了。&lt;/p&gt;
&lt;h1&gt;代码&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;cstdio&amp;gt; //getchar()和putchar()要用
#include &amp;lt;cmath&amp;gt;  //取块大小和开方时需要用到sqrt()函数

int b[50005], a[50005], sum[255];
bool flag[255];
int len;

int read() {//快速读入，因为LibreOJ默认吸氧，所以没有了前面的inline
  int X = 0; bool flag = 1; char ch = getchar();
  while (ch &amp;lt; &apos;0&apos; || ch &amp;gt; &apos;9&apos;) {if (ch == &apos;-&apos;) flag = 0; ch = getchar();}
  while (ch &amp;gt;= &apos;0&apos; &amp;amp;&amp;amp; ch &amp;lt;= &apos;9&apos;) {X = (X &amp;lt;&amp;lt; 1) + (X &amp;lt;&amp;lt; 3) + ch - &apos;0&apos;; ch = getchar();}
  if (flag) return X;
  return ~ (X - 1);
}

void write(int X) {//快速输出，同上
  if (X &amp;lt; 0) {putchar(&apos;-&apos;); X = ~ (X - 1);}
  int s[50], top = 0;
  while (X) {s[++top] = X % 10; X /= 10;}
  if (!top) s[++top] = 0;
  while (top) putchar(s[top--] + &apos;0&apos;);
  putchar(&apos;\n&apos;);
  return;
}

void sol(int x) {
  if (flag[x]) return; //如果这个块被标记了，就废了，直接返回，节省时间
  flag[x] = true;      //先把这个块标记
  sum[x] = 0;          //将sum[]数组初始化为零
  for (int i = (x - 1) * len + 1; i &amp;lt;= x * len; i++) { //循环块内每一个值
    a[i] = sqrt(a[i]), sum[x] += a[i]; //对块内每一个数都做开方运算，再把他们的和存进sum[]数组里面
    if (a[i] &amp;gt; 1) flag[x] = false;     //如果这一个值还大于1，也就是还能够进行开方，这个块就还能继续开放，把flag[]标记去除
  }
  return;
}

void add(int l, int r) {
  for (int i = l; i &amp;lt;= (b[l] * len &amp;lt; r ? b[l] * len : r); i++) { //从左往右暴力循环左侧不完整块
    sum[b[l]] -= a[i];
    a[i] = sqrt(a[i]);
    sum[b[l]] += a[i];
  }
  if (b[l] != b[r]) //如果l和r不在同一块内
    for (int i = r; b[i] == b[r]; i--) { //同右往左暴力循环右侧不完整块
	//循环条件这里我原来一直写i == b[r]就错了，要注意，下面query()函数也是
      sum[b[r]] -= a[i];
      a[i] = sqrt(a[i]);
      sum[b[r]] += a[i];
    }
  for (int i = b[l] + 1; i &amp;lt;= b[r] - 1; i++) sol(i); //中间完整块使用sol()函数解决
  return;
}

int query(int l, int r) { //查询函数，与普通分块差不多
  int ans = 0;
  for (int i = l; i &amp;lt;= (b[l] * len &amp;lt; r ? b[l] * len : r); i++) ans += a[i];//左侧
  if (b[l] != b[r]) for (int i = r; b[i] == b[r]; i--) ans += a[i];//右侧
  for (int i = b[l] + 1; i &amp;lt;= b[r] - 1; i++) ans += sum[i];//中间
  return ans;
}

int main() {
  int n;
  n = read();
  len = sqrt(n);
  for (int i = 1; i &amp;lt;= n; i++) a[i] = read();
  for (int i = 1; i &amp;lt;= n; i++) {
    b[i] = (i - 1) / len + 1;
    sum[b[i]] += a[i];
  }
  for (int i = 1; i &amp;lt;= n; i++) {
    bool opt; int l, r;
    opt = read(); l = read(); r = read(); read();
    opt ? write(query(l, r)) : add(l, r);
    //三目运算符，如果opt==1就add()，else就query()
  }
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>NOI Online 2021 第一场游记</title><link>https://xn--24wq0n.top/posts/2021-03-27-noi_online_2021_%E7%AC%AC%E4%B8%80%E5%9C%BA%E6%B8%B8%E8%AE%B0/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-03-27-noi_online_2021_%E7%AC%AC%E4%B8%80%E5%9C%BA%E6%B8%B8%E8%AE%B0/</guid><description>爆零</description><pubDate>Sat, 27 Mar 2021 12:15:00 GMT</pubDate><content:encoded>&lt;p&gt;爆零&lt;/p&gt;
</content:encoded></item><item><title>我的 Emacs 配置文件</title><link>https://xn--24wq0n.top/posts/2021-03-05-%E6%88%91%E7%9A%84_emacs_%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-03-05-%E6%88%91%E7%9A%84_emacs_%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6/</guid><description>前面字体设的是 Ubuntu Mono，没有的可以去Ubuntu里拷一份，字体放大了点。剩下的是一些基本的操作，可按需取用。 开启自动全屏、修改C-x、C-f默认位置仅适用于Windows系统。 下面</description><pubDate>Fri, 05 Mar 2021 21:53:00 GMT</pubDate><content:encoded>&lt;p&gt;前面字体设的是 Ubuntu Mono，没有的可以去Ubuntu里拷一份，字体放大了点。剩下的是一些基本的操作，可按需取用。&lt;/p&gt;
&lt;p&gt;开启自动全屏、修改C-x、C-f默认位置仅适用于Windows系统。&lt;/p&gt;
&lt;p&gt;下面是代码。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(custom-set-variables
 ;; custom-set-variables was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won&apos;t work right.
 &apos;(display-time-mode t)
 &apos;(show-paren-mode t)
 &apos;(tool-bar-mode nil))
(custom-set-faces
 ;; custom-set-faces was added by Custom.
 ;; If you edit it by hand, you could mess it up, so be careful.
 ;; Your init file should contain only one such instance.
 ;; If there is more than one, they won&apos;t work right.
 &apos;(default ((t (:family &quot;Ubuntu Mono&quot; :foundry &quot;outline&quot; :slant normal :weight normal :height 143 :width normal)))))

;; 不显示工具栏
(tool-bar-mode 0)

;; 不显示菜单栏
(menu-bar-mode 0)

;光标改为竖线
(setq-default cursor-type &apos;bar)

;; 高亮匹配括号。
(show-paren-mode t)
(setq show-paren-style &apos;parenthesis)

;; 撤销记录扩大。
(setq-default kill-ring-max 65535)

;透明效果
(set-frame-parameter (selected-frame) &apos;alpha (list 85 50))
(add-to-list &apos;default-frame-alist (cons &apos;alpha (list 85 50)))

;一键Eshell
(global-set-key (kbd &quot;C-e&quot;) &apos;eshell)

;设置背景色
(add-to-list &apos;default-frame-alist &apos;(foreground-color . &quot;#E0DFDB&quot;))
(add-to-list &apos;default-frame-alist &apos;(background-color . &quot;#000000&quot;))

;取消欢迎屏幕
(setq inhibit-splash-screen t)

;窗口最大化（仅在Windows 中有效）
(run-with-idle-timer 0 nil &apos;w32-send-sys-command 61488)

;设置标题栏,我的设置为前面显示文档名，后面显示“ - Emacs”
;放久了会还原，选中窗口即可，属正常现象
(setq frame-title-format &apos;(&quot;%b - Emacs&quot;))


; 启用时间显示设置，在minibuffer上面的那个杠上
(display-time-mode t)

;显示行号
(global-linum-mode t)

;修改C-x、C-f默认位置 (仅针对Windows)
(global-set-key (kbd &quot;C-x C-f&quot;) (lambda () (interactive)
(cd &quot;d:\code&quot;)
(call-interactively &apos;find-file)))

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;考试的时候可以直接背下面这段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;(tool-bar-mode 0)
(menu-bar-mode 0)
(setq-default cursor-type &apos;bar)
(show-paren-mode t)
(setq show-paren-style &apos;parenthesis)
(setq-default kill-ring-max 65535)
(set-frame-parameter (selected-frame) &apos;alpha (list 85 50))
(add-to-list &apos;default-frame-alist (cons &apos;alpha (list 85 50)))
(global-set-key (kbd &quot;C-e&quot;) &apos;eshell)
(add-to-list &apos;default-frame-alist &apos;(foreground-color . &quot;#E0DFDB&quot;))
(add-to-list &apos;default-frame-alist &apos;(background-color . &quot;#000000&quot;))
(setq inhibit-splash-screen t)
(setq frame-title-format &apos;(&quot;%b - Emacs&quot;))
(display-time-mode t) 
(global-linum-mode t)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;附：&lt;/p&gt;
&lt;p&gt;Windows 7及以上的系统配置文件放在C:\Users\（当前用户名）\AppData\Roaming\目录下，为一个.emacs文件。&lt;/p&gt;
&lt;p&gt;Emacs 刚安装好的时候没有这个文件，又因为Windows 不能生成没有文件名的文件（.emacs的emacs是扩展名），所以可以通过先点Options-&amp;gt;Set Default Fonts...-&amp;gt;随便更改-&amp;gt;Options-&amp;gt;Save Options来生成.emacs文件。&lt;/p&gt;
&lt;p&gt;Linux直接放主目录下，记得把显示隐藏文件打开。&lt;/p&gt;
&lt;p&gt;推广：&lt;a href=&quot;https://xn--24wq0n.top/posts/2021-02-08-windows_%E4%B8%8A_emacs_%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97/&quot;&gt;Windows 上 Emacs 安装指南&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>【题解】P1283 平板涂色</title><link>https://xn--24wq0n.top/posts/2021-03-05-%E9%A2%98%E8%A7%A3_p1283_%E5%B9%B3%E6%9D%BF%E6%B6%82%E8%89%B2/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-03-05-%E9%A2%98%E8%A7%A3_p1283_%E5%B9%B3%E6%9D%BF%E6%B6%82%E8%89%B2/</guid><description>题目链接：P1283 平板涂色 题面 题目描述 CE 数码公司开发了一种名为自动涂色机（APM）的产品。它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色。 为了涂色，APM 需要使用一组</description><pubDate>Fri, 05 Mar 2021 20:31:00 GMT</pubDate><content:encoded>&lt;p&gt;题目链接：&lt;a href=&quot;https://www.luogu.com.cn/problem/P1283&quot;&gt;P1283 平板涂色&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;题面&lt;/h1&gt;
&lt;h2&gt;题目描述&lt;/h2&gt;
&lt;p&gt;CE 数码公司开发了一种名为自动涂色机（APM）的产品。它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色。&lt;/p&gt;
&lt;p&gt;为了涂色，APM 需要使用一组刷子。每个刷子涂一种不同的颜色 Ci 。APM 拿起一把有颜色 Ci 的刷子，并给所有颜色为 Ci 且符合下面限制的矩形涂色：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210309200928686-902104270.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为了避免颜料渗漏使颜色混合，一个矩形只能在所有紧靠它上方的矩形涂色后，才能涂色。例如图中矩形 F 必须在 C 和 D 涂色后才能涂色。注意，每一个矩形必须立刻涂满，不能只涂一部分。&lt;/p&gt;
&lt;p&gt;写一个程序求一个使 APM 拿起刷子次数最少的涂色方案。注意，如果一把刷子被拿起超过一次，则每一次都必须记入总数中。&lt;/p&gt;
&lt;h2&gt;输入格式&lt;/h2&gt;
&lt;p&gt;第一行为矩形的个数 N。下面有 N 行描述了 N 个矩形。每个矩形有 5 个整数描述，左上角的 y 坐标和 x 坐标，右下角的 y 坐标和 x 坐标，以及预定颜色。&lt;/p&gt;
&lt;p&gt;平板的左上角坐标总是 (0,0)。&lt;/p&gt;
&lt;h2&gt;输出格式&lt;/h2&gt;
&lt;p&gt;一个整数，表示拿起刷子的最少次数。&lt;/p&gt;
&lt;h2&gt;输入输出样例&lt;/h2&gt;
&lt;p&gt;输入 #1&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;7
0 0 2 2 1
0 2 1 6 2
2 0 4 2 1
1 2 4 4 2
1 4 3 6 1
4 0 6 4 1
3 4 6 6 2
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出 #1&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;3
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;说明/提示&lt;/h2&gt;
&lt;p&gt;$1\le C_i \le 20$，$0 \le x_i,y_i \le 99$，$1\le N \le 16$。&lt;/p&gt;
&lt;h1&gt;思路&lt;/h1&gt;
&lt;p&gt;这题数据范围很小，可以直接搜索。&lt;/p&gt;
&lt;p&gt;搜索每一个矩形有没有被涂过，如果没有涂过，&lt;/p&gt;
&lt;p&gt;先判断这个矩形能不能涂，用check函数来判断，代码内的注释已经给得非常详细了。&lt;/p&gt;
&lt;p&gt;如果能涂的话，再看是不是和刷子颜色一样，如果不是，就++。&lt;/p&gt;
&lt;h1&gt;代码&lt;/h1&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
using namespace std;
int n, ans, x1[20], _y1[20], x2[20], y2[20], color[20];
//y1是关键字，必须在前面加一个下划线
bool visit[20];

void search(int, int, int);
bool check(int);

int main()
{
  cin &amp;gt;&amp;gt; n;
  ans = n; //先把ans设为一个（在本题中）最大的值
  for (int i = 1; i &amp;lt;= n; i++) {
    cin &amp;gt;&amp;gt; _y1[i] &amp;gt;&amp;gt; x1[i] &amp;gt;&amp;gt; y2[i] &amp;gt;&amp;gt; x2[i] &amp;gt;&amp;gt; color[i]; //先输入y坐标，再输入x坐标
  }
  search(0, 0, -1);
  cout &amp;lt;&amp;lt; ans &amp;lt;&amp;lt; endl;
  return 0;
}

void search(int tot, int finish, int col)
{
  if (tot &amp;gt;= ans)
    return; // 如果总数已经大于ans的值了，就可以不用继续了
  if (finish == n)
    ans = tot; //如果已经搜索完毕了，就直接把tot的值赋给ans
  for (int i = 1; i &amp;lt;= n; i++)
    if (!visit[i] &amp;amp;&amp;amp; check(i)) {
      visit[i] = true;
      if (color[i] == col) { //如果找到了是这个矩形那就给它涂色
        search(tot, finish + 1, color[i]);
      }
      else { //如果找到的矩形颜色不一样，就finish++，继续涂色
        search(tot + 1, finish + 1, color[i]);
      }
      visit[i] = false; //回溯
    }
}
bool check(int k)
{
  for (int i = 1; i &amp;lt;= n; i++)
    if (!visit[i]         //如果循环到的矩形没涂过色
       &amp;amp;&amp;amp; _y1[i] == y2[k] //判断要涂色的矩形是否下好在循环到的矩形下方
                          //可通过判断循环到的矩形的下面那条边的纵坐标是否与
                          //要涂色的矩形上面那条边的纵坐标相等
       &amp;amp;&amp;amp; ((x1[i] &amp;gt;= x1[k] &amp;amp;&amp;amp; x1[i] &amp;lt;= x2[k])   //循环到的矩形的左边界在要涂色的矩形左右边界之间
        || (x2[i] &amp;gt;= x1[k] &amp;amp;&amp;amp; x2[i] &amp;lt;= x2[k]))) //循环到的矩形的右边界在要涂色的矩形左右边界之间
      return false;
  return true;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Windows 上 Emacs 安装指南</title><link>https://xn--24wq0n.top/posts/2021-02-08-windows_%E4%B8%8A_emacs_%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-02-08-windows_%E4%B8%8A_emacs_%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97/</guid><description>啊，最近又有人问我在Windows 上Emacs怎么安装。 嗯。Windows 上安装Emacs的确没Linux方便。 下面切入正题。 首先，打开GNU Emacs官网。这次官网没炸。 点击Windo</description><pubDate>Mon, 08 Feb 2021 22:14:00 GMT</pubDate><content:encoded>&lt;p&gt;啊，最近又有人问我在Windows 上Emacs怎么安装。&lt;/p&gt;
&lt;p&gt;嗯。Windows 上安装Emacs的确没Linux方便。&lt;/p&gt;
&lt;p&gt;下面切入正题。&lt;/p&gt;
&lt;p&gt;首先，打开&lt;a href=&quot;https://www.gnu.org/software/emacs/&quot;&gt;GNU Emacs官网&lt;/a&gt;。这次官网没炸。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153226350-1338998408.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击Windows&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153232192-1879175309.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击Windows后能打开如下界面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153240952-804617006.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击nearby GNU mirror：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153248013-1865520905.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;当然，你也可以点击main GNU FTP server。（补：我现在发现main GNU FTP server挺快的）&lt;/p&gt;
&lt;p&gt;有的时候推荐的最近的镜像站打不开，就像这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153257846-654788282.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;遇到这种情况只需要返回并重新进入即可。一次不行就多试几次&lt;/p&gt;
&lt;p&gt;点开来之后见到这样的界面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153306591-447399300.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选择最新版本的进入，我这个时候最新版本是27。点开来就像这样：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153316994-2061211786.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;这里有32位和64位两个版本。简单介绍一下如何判断自己的电脑是32位还是64位。&lt;/p&gt;
&lt;p&gt;演示系统为Windows 10 20H2&lt;/p&gt;
&lt;p&gt;在设备规格一栏中能见到以下一项：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153341741-986920414.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我的是64位操作系统。&lt;/p&gt;
&lt;p&gt;比我的系统版本低的应该能看到这样的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153347130-1936431894.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;（一看就是虚拟机）&lt;/p&gt;
&lt;p&gt;这样我们就区分开来了32位和64位的操作系统。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153356595-534597087.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;（上面的框框错了，上边界应该往下两行）&lt;/p&gt;
&lt;p&gt;上图中上面的框指的是32位的，下面的框是64位的。以64位的为例：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153411791-1665950738.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上面这两个选项中两个的区别不太好说，我用下面这个。&lt;/p&gt;
&lt;p&gt;下载下来像这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153419994-1845901629.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;选我下面给的这个选项解压，点别的话会导致解压的文件夹文件很多。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153424520-1063443858.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;建议放在C:\Program Files文件夹下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153433016-1066118982.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;有可能会报错，如果你的是管理员账户的话就直接点继续，不是的话就只好放别的地方了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153437856-1502351831.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后打开文件夹里面的bin目录，打开addpm.exe&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153443272-644823114.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;弹出如下窗口（背后有一黑的控制台），点击确定。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153448346-277536956.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后你就能在开始菜单里发现这个：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153453727-1691450832.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;要添加桌面快捷方式的话，右键点击固定在开始屏幕&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153504405-924820148.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后到开始屏幕拖动它，按住鼠标点Ctrl + D到桌面，松开鼠标创建桌面快捷方式。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153530976-2021667211.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后就可以享受你的Emacs了。&lt;/p&gt;
&lt;p&gt;附：Windows 7及以上Emacs配置文件目录：C:\Users\（当前用户名）\AppData\Roaming&lt;/p&gt;
&lt;p&gt;Windows不能直接建立.emacs文件，需要通过在Emacs里先保存配置文件再修改。下次详细说明。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.cnblogs.com/g-mph/p/14488673.html&quot;&gt;我的 Emacs 配置文件&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>C++ 快读快写模板</title><link>https://xn--24wq0n.top/posts/2021-02-08-c_%E5%BF%AB%E8%AF%BB%E5%BF%AB%E5%86%99%E6%A8%A1%E6%9D%BF/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-02-08-c_%E5%BF%AB%E8%AF%BB%E5%BF%AB%E5%86%99%E6%A8%A1%E6%9D%BF/</guid><description>UpDate 2021/7/19: 感谢 @Eason_AC 的指点，快读、快写将可以支持任意整型变量的输入与输出。 正文 由于快读和快写需要用到 &amp;lt;cstdio&amp;gt; 头文件中的 getch</description><pubDate>Mon, 08 Feb 2021 08:34:00 GMT</pubDate><content:encoded>&lt;h2&gt;UpDate 2021/7/19:&lt;/h2&gt;
&lt;p&gt;感谢 @Eason_AC 的指点，快读、快写将可以支持任意整型变量的输入与输出。&lt;/p&gt;
&lt;h2&gt;正文&lt;/h2&gt;
&lt;p&gt;由于快读和快写需要用到 &lt;code&gt;&amp;lt;cstdio&amp;gt;&lt;/code&gt; 头文件中的 &lt;code&gt;getchar()&lt;/code&gt; 和 &lt;code&gt;putchar()&lt;/code&gt; 函数，所以在代码的开头请加入如下代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;cstdio&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;函数支持变量类型多样，请在调用 &lt;code&gt;read()&lt;/code&gt; 函数时在 &lt;code&gt;read&lt;/code&gt; 与 &lt;code&gt;()&lt;/code&gt; 之间加入 &lt;code&gt;&amp;lt;您要读入的变量类型&amp;gt;&lt;/code&gt;。
例：&lt;code&gt;int a = read&amp;lt;int&amp;gt;();&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;快读：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;template&amp;lt;typename T&amp;gt; inline T read() {
  T X = 0; bool flag = 1; char ch = getchar();
  while (ch &amp;lt; &apos;0&apos; || ch &amp;gt; &apos;9&apos;) {if (ch == &apos;-&apos;) flag = 0; ch = getchar();}
  while (ch &amp;gt;= &apos;0&apos; &amp;amp;&amp;amp; ch &amp;lt;= &apos;9&apos;) {X = (X &amp;lt;&amp;lt; 1) + (X &amp;lt;&amp;lt; 3) + ch - &apos;0&apos;; ch = getchar();}
  if (flag) return X;
  return ~ (X - 1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;快写：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;template&amp;lt;typename T&amp;gt; inline void write(T X) {
  if (X &amp;lt; 0) {putchar(&apos;-&apos;); X = ~ (X - 1);}
  int s[50], top = 0;
  while (X) {s[++top] = X % 10; X /= 10;}
  if (!top) s[++top] = 0;
  while (top) putchar(s[top--] + &apos;0&apos;);
  putchar(&apos;\n&apos;);//根据情况自行修改
  return;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一键复制快读快写：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;template&amp;lt;typename T&amp;gt; inline T read() {
  T X = 0; bool flag = 1; char ch = getchar();
  while (ch &amp;lt; &apos;0&apos; || ch &amp;gt; &apos;9&apos;) {if (ch == &apos;-&apos;) flag = 0; ch = getchar();}
  while (ch &amp;gt;= &apos;0&apos; &amp;amp;&amp;amp; ch &amp;lt;= &apos;9&apos;) {X = (X &amp;lt;&amp;lt; 1) + (X &amp;lt;&amp;lt; 3) + ch - &apos;0&apos;; ch = getchar();}
  if (flag) return X;
  return ~ (X - 1);
}

template&amp;lt;typename T&amp;gt; inline void write(T X) {
  if (X &amp;lt; 0) {putchar(&apos;-&apos;); X = ~ (X - 1);}
  int s[50], top = 0;
  while (X) {s[++top] = X % 10; X /= 10;}
  if (!top) s[++top] = 0;
  while (top) putchar(s[top--] + &apos;0&apos;);
  putchar(&apos;\n&apos;);
  return;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;例题&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.luogu.com.cn/problem/P1001&quot;&gt;A + B Problem&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;cstdio&amp;gt;

template&amp;lt;typename T&amp;gt; inline T read() {
  T X = 0; bool flag = 1; char ch = getchar();
  while (ch &amp;lt; &apos;0&apos; || ch &amp;gt; &apos;9&apos;) {if (ch == &apos;-&apos;) flag = 0; ch = getchar();}
  while (ch &amp;gt;= &apos;0&apos; &amp;amp;&amp;amp; ch &amp;lt;= &apos;9&apos;) {X = (X &amp;lt;&amp;lt; 1) + (X &amp;lt;&amp;lt; 3) + ch - &apos;0&apos;; ch = getchar();}
  if (flag) return X;
  return ~ (X - 1);
}

template&amp;lt;typename T&amp;gt; inline void write(T X) {
  if (X &amp;lt; 0) {putchar(&apos;-&apos;); X = ~ (X - 1);}
  int s[50], top = 0;
  while (X) {s[++top] = X % 10; X /= 10;}
  if (!top) s[++top] = 0;
  while (top) putchar(s[top--] + &apos;0&apos;);
  putchar(&apos;\n&apos;);
  return;
}

int main() {
    int a, b;
    a = read&amp;lt;int&amp;gt;(), b = read&amp;lt;int&amp;gt;();
    write(a + b);
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Windows 上 G++ 安装指南（演示系统：Windows 10）</title><link>https://xn--24wq0n.top/posts/2021-02-07-windows_%E4%B8%8A_g_%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97_%E6%BC%94%E7%A4%BA%E7%B3%BB%E7%BB%9F_windows_10/</link><guid isPermaLink="true">https://xn--24wq0n.top/posts/2021-02-07-windows_%E4%B8%8A_g_%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97_%E6%BC%94%E7%A4%BA%E7%B3%BB%E7%BB%9F_windows_10/</guid><description>Update 2025/12/3 现在我自己都不用这个方法了，我都直接下一个带MinGW的Code::Blocks然后直接把他的g++设置到环境变量里 Update 2021/8/6 文件换到蓝奏云上</description><pubDate>Sun, 07 Feb 2021 14:15:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;Update 2025/12/3 现在我自己都不用这个方法了，我都直接下一个带MinGW的Code::Blocks然后直接把他的g++设置到环境变量里&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2021/8/6 文件换到蓝奏云上了，下载体验应该会让人更舒适一些&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2021/2/8 有同学测试貌似下载不了了，目前正在观察&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;有很多同学都不知道如何安装G++编译器，直接使用Dev-C++的编译器。&lt;/p&gt;
&lt;p&gt;直接使用Dev-C++的G++编译器在64位操作系统上没问题，在32位操作系统上就会出问题。&lt;/p&gt;
&lt;p&gt;现在本文介绍一下安装原版G++的方法。&lt;/p&gt;
&lt;p&gt;打开MinGW官网，&lt;/p&gt;
&lt;p&gt;？？？&lt;/p&gt;
&lt;p&gt;慢着，MinGW官网好像污染了&lt;/p&gt;
&lt;p&gt;经验证，要用某些操作才可以正常访问。&lt;/p&gt;
&lt;p&gt;验证日期：2021/2/7 时间：下午2：15&lt;/p&gt;
&lt;p&gt;啊，应该没事，直接提供网盘链接：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://wws.lanzoui.com/ih3Bksaipmd&quot;&gt;https://wws.lanzoui.com/ih3Bksaipmd&lt;/a&gt; 密码：gcpp&lt;/p&gt;
&lt;p&gt;原&lt;strong&gt;百度网盘&lt;/strong&gt;链接：&lt;a href=&quot;https://pan.baidu.com/s/1fNR67KrLRmO-v4s9TRNTQw&quot;&gt;https://pan.baidu.com/s/1fNR67KrLRmO-v4s9TRNTQw&lt;/a&gt; 提取码：yhsq&lt;/p&gt;
&lt;p&gt;其他下载链接：&lt;a href=&quot;https://share.weiyun.com/KrwHH9ud&quot;&gt;https://share.weiyun.com/KrwHH9ud&lt;/a&gt;；&lt;a href=&quot;https://url20.ctfile.com/f/33117920-505073190-a1f4fd&quot;&gt;https://url20.ctfile.com/f/33117920-505073190-a1f4fd&lt;/a&gt; 密码：2792&lt;/p&gt;
&lt;p&gt;打开后，一路戳Install&lt;strong&gt;那个位置&lt;/strong&gt;就行了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220152645907-903544486.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装好后，会自动开启，没有自动开启的点这个：&lt;img src=&quot;./images/2074326-20210401145533233-1054964982.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点开界面之后，应该能看到类似这样的界面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220152355255-146946968.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;我这里因为安装好了，所以那个mingw32-gcc-g++-bin前面有绿的标记。&lt;/p&gt;
&lt;p&gt;没有安装好的应该和别的一样。&lt;/p&gt;
&lt;p&gt;然后右键，点击Mark for Installation。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153014007-1907595835.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;因为已经装好了，我这里就点不了了。&lt;/p&gt;
&lt;p&gt;然后这项前面就应该有一个标记。&lt;/p&gt;
&lt;p&gt;再点击菜单栏的Installation，再点击Apply Changes。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153022200-552207160.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;照样，我已经装好了，所以点不到。&lt;/p&gt;
&lt;p&gt;然后再点击Apply，就不提供截屏了。&lt;/p&gt;
&lt;p&gt;然后就是等待下载。下载很慢，有时会发生错误。发生错误有Apply就点，没有就随便点。&lt;/p&gt;
&lt;p&gt;下载完成后，在C盘根目录下应该有MinGW文件夹，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153036097-1394729182.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;看到了那大概率是安装成功了。&lt;/p&gt;
&lt;p&gt;接下来我们添加环境变量。&lt;/p&gt;
&lt;p&gt;我用的是Windows 10，Windows 7的不太一样，你们百度一下就知道怎么做了。&lt;/p&gt;
&lt;p&gt;首先打开设置，点击“系统”：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153043062-1176067028.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在左边最下方找到关于，再在右边点击高级系统设置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153057883-2084021672.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点开来就像下面这样：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153109074-3601911.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击环境变量：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153115622-1176573584.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点开后在下面的系统变量中找到Path，点编辑：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153135577-1937226782.png&quot; alt=&quot;&quot; /&gt;&lt;img src=&quot;./images/2074326-20210220153141831-2139986017.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;点击“新建”，输入“C:\MinGW\bin&quot;,点确定。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./images/2074326-20210220153153164-2028795958.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;然后把前面的窗口关掉，重启你的编译软件，再试试，应该就可以正常用G++编译了。&lt;/p&gt;
</content:encoded></item></channel></rss>