<?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>小石头ZhX589的小小博客</description><link>https://www.zhx-blog.top/</link><language>zh_CN</language><item><title>网站更新啦</title><link>https://www.zhx-blog.top/posts/%E7%BD%91%E7%AB%99%E6%9B%B4%E6%96%B0%E5%95%A6/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/%E7%BD%91%E7%AB%99%E6%9B%B4%E6%96%B0%E5%95%A6/</guid><description>关于网站更新的简要说明</description><pubDate>Thu, 19 Feb 2026 00:26:00 GMT</pubDate><content:encoded>&lt;h1&gt;关于本网站更新的说明&lt;/h1&gt;
&lt;p&gt;前几天看到一个群友Pinpe的网站，感觉蛮漂亮的。随后看了一眼仓库，唔，发现一只好可爱的正太（；于是关注了一下这个仓库:&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;saicaca/fuwari&quot;}&lt;/p&gt;
&lt;p&gt;随后便开始改造我的网站了。（其实早就想改啦）&lt;/p&gt;
&lt;p&gt;我属于是最一开始就去折腾了一下自动化部署，是参照柳神大佬的博客的：&lt;br /&gt;
&lt;a href=&quot;https://blog.liushen.fun/&quot;&gt;https://blog.liushen.fun/&lt;/a&gt;&lt;br /&gt;
感觉还挺方便的（&lt;br /&gt;
就是腾讯云的告警不知道咋关（qwq找不到；GitHub在使用一个美国ip登录我的网站）。&lt;/p&gt;
&lt;p&gt;但是不得不说，这个速度还蛮快的。构建+部署+上传服务器总共1min不到就能成。感觉好不错，就是写文章太麻烦了。后面看看能不能找/改一个编辑器来。嘿嘿。&lt;/p&gt;
&lt;p&gt;自豪地使用&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari&lt;/a&gt;主题。&lt;/p&gt;
</content:encoded></item><item><title>Linux 基础 &amp; Python 控制流</title><link>https://www.zhx-blog.top/posts/2025-12-08-linux_%E5%9F%BA%E7%A1%80_amp_python_%E6%8E%A7%E5%88%B6%E6%B5%81/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-12-08-linux_%E5%9F%BA%E7%A1%80_amp_python_%E6%8E%A7%E5%88%B6%E6%B5%81/</guid><pubDate>Mon, 08 Dec 2025 11:24:00 GMT</pubDate><content:encoded>&lt;h1&gt;Linux 基础使用 &amp;amp; Python 控制流&lt;/h1&gt;
&lt;h2&gt;Linux 基础使用&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：
机房开启了保存电脑记录，所以请记住你的座位。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本节课开始我们初步开始使用Linux。Linux在全世界有广泛的使用，例如我们的安卓手机都基于Linux内核（Android/Linux），以及80%的线上服务都在Linux服务器上运行（GNU/Linux）。&lt;/p&gt;
&lt;p&gt;本次我们使用NOI Linux 2.0（基于Ubuntu）进行学习活动。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如何打开编辑器。
点击左下角九个点的菜单标识可以打开应用菜单。选择VS Code，在插件栏下载中文及Python插件，重启VS Code即可开始编辑。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Linux 是当今计算领域中至关重要的操作系统。它不仅广泛应用于服务器领域（约80%的线上服务运行在基于GNU/Linux的服务器上），也是移动设备（Android基于Linux内核）、嵌入式系统、超级计算机等领域的核心技术基础。&lt;/p&gt;
&lt;p&gt;本次课程我们将使用 NOI Linux 2.0（基于 Ubuntu 20.04 LTS）作为学习环境。这是一个专门为编程竞赛和学习设计的Linux发行版，预装了丰富的开发工具。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;1. 开发环境配置指南&lt;/h3&gt;
&lt;h4&gt;1.1 编辑器安装与配置&lt;/h4&gt;
&lt;p&gt;点击屏幕左下角的应用程序菜单图标（九宫格图标）即可打开应用程序菜单。&lt;/p&gt;
&lt;p&gt;联网后，在终端（使用Alt+Ctrl+T打开）中输入&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt install vlc firefox -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果有时间可以使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt upgrade -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;进行全局更新。
在搜索框中输入 &quot;VS Code&quot; 或浏览找到 Visual Studio Code: 首次启动 VS Code 后，需要进行以下基础配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;-   **语言包安装**：点击左侧活动栏的扩展图标（四个方块形状），搜索 &quot;Chinese&quot;，安装 Microsoft 提供的中文语言包

-   **Python 支持**：同样在扩展商店中搜索 &quot;Python&quot;，安装 Microsoft 官方的 Python 扩展

-   **重启生效**：安装完成后需要重启 VS Code 使配置生效
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来重启浏览器，就可以&lt;s&gt;enjoy BiliBili&lt;/s&gt;写代码了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;常用命令详解：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
# 1. 更新软件包索引
sudo apt update
# - sudo: 以管理员权限执行命令
# - apt: Ubuntu/Debian系统的包管理工具
# - update: 从软件源服务器获取最新的软件包列表信息

# 2. 安装常用软件
sudo apt install vlc firefox -y
# - install: 安装指定软件包
#   - vlc: 强大的多媒体播放器
#   - firefox: 网页浏览器
# - -y: 自动确认安装，无需手动输入&quot;y&quot;

# 3. 升级已安装的软件（可选，时间充足时执行）
sudo apt upgrade -y
# - upgrade: 将所有已安装的软件升级到最新版本
# - 注意：此过程可能需要较长时间和网络带宽
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;1.3 基础命令扩展学习&lt;/h4&gt;
&lt;p&gt;除了上述命令，以下基础命令也值得掌握：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
# 查看当前目录
pwd

# 列出目录内容
ls
ls -la  # 显示详细信息，包括隐藏文件

# 切换目录
cd Documents  # 进入Documents目录
cd ..         # 返回上一级目录
cd ~          # 返回用户主目录

# 创建目录和文件
mkdir python_projects  # 创建新目录
touch hello.py         # 创建空文件

# 查看文件内容
cat hello.py           # 显示整个文件内容
less hello.py          # 分页查看（按q退出）
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Python 控制流&lt;/h2&gt;
&lt;p&gt;我们之前写的程序，都是按顺序执行的。有些时候，我们需要重复执行一些相似的操作，或者在不同情况下执行不同的工作，这个时候就需要用到循环/分支结构控制程序流程了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请以
&lt;em&gt;写出一个输出&lt;code&gt;1&lt;/code&gt;到&lt;code&gt;n&lt;/code&gt;中的所有质数的程序。其中&lt;code&gt;n&lt;/code&gt;由输入给出。&lt;/em&gt;
为目标学习下方文档并上网查找资料。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;分支结构&lt;/h3&gt;
&lt;p&gt;例如我在天晴的时候会去骑自行车，下雨的时候我在家里看罗小黑，那么该写一个什么程序来猜测我的行程呢？&lt;/p&gt;
&lt;p&gt;我们可以使用if语句&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;status = input(&quot;今天是晴天吗？请输入Yes或No: &quot;)

if status == &quot;Yes&quot;:
	print(&quot;今天副社长石头要去骑车&quot;)
elif status == &quot;No&quot;:
	print(&quot;今天副社长石头回去看罗小黑哦!喵~&quot;)
else:
	print(&quot;你输入的不是Yes或No吧？检查一下哦&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中&lt;code&gt;else&lt;/code&gt;意为否则，&lt;code&gt;elif&lt;/code&gt;是&lt;code&gt;else if&lt;/code&gt;的缩写。
在第一个&lt;code&gt;if&lt;/code&gt;语句为否的情况下，就会执行下面的否则语句。&lt;code&gt;else&lt;/code&gt;和&lt;code&gt;elif&lt;/code&gt;的区别在于，&lt;code&gt;elif&lt;/code&gt;还需要满足另一个条件。由此可知，&lt;code&gt;else&lt;/code&gt;需放在最后，因为任何不满足第一条&lt;code&gt;if&lt;/code&gt;语句的情况都满足&lt;code&gt;else&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;循环结构&lt;/h3&gt;
&lt;p&gt;有的时候我们需要重复进行某些事情，例如一年三百六十五天，我就要吃&lt;code&gt;1095&lt;/code&gt;次饭。要是每一次都重新写一遍代码，那么将会无比麻烦。&lt;/p&gt;
&lt;p&gt;于是就有了循环结构。循环结构有&lt;code&gt;while&lt;/code&gt;和&lt;code&gt;for&lt;/code&gt;两种。&lt;/p&gt;
&lt;hr /&gt;
&lt;h4&gt;while 循环&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;while&lt;/code&gt; 循环会在条件为真时重复执行一段代码。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;count = 0
while count &amp;lt; 5:
    print(&quot;这是第&quot;, count+1, &quot;次循环&quot;)
    count += 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;for 循环&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;for&lt;/code&gt; 循环常用于遍历序列（如列表、元组、字符串）或范围。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for i in range(5):
    print(&quot;这是第&quot;, i+1, &quot;次循环&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;Python 学习任务：输出 1 到 n 中的所有质数&lt;/h2&gt;
&lt;h3&gt;任务分析&lt;/h3&gt;
&lt;p&gt;质数（素数）是指大于1且只能被1和自身整除的自然数。我们需要：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;获取用户输入的整数 &lt;code&gt;n&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;从 2 到 n 依次判断每个数是否为质数&lt;/li&gt;
&lt;li&gt;输出所有质数&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;实现步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;使用 &lt;code&gt;input&lt;/code&gt; 获取用户输入的 &lt;code&gt;n&lt;/code&gt;，并转换为整数&lt;/li&gt;
&lt;li&gt;使用外层循环遍历从 2 到 n 的每个数&lt;/li&gt;
&lt;li&gt;对内层循环判断当前数是否为质数：
&lt;ul&gt;
&lt;li&gt;质数判断：从 2 到该数的平方根，判断是否能整除&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如果是质数，则输出&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;示例代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;n = int(input(&quot;请输入一个整数 n：&quot;))

print(f&quot;1 到 {n} 中的所有质数为：&quot;)

for num in range(2, n + 1):
    is_prime = True
    for i in range(2, int(num ** 0.5) + 1):
        if num % i == 0:
            is_prime = False
            break
    if is_prime:
        print(num, end=&quot; &quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3&gt;代码解释&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;int(input(...))&lt;/code&gt;：获取用户输入并转换为整数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;range(2, n + 1)&lt;/code&gt;：生成从 2 到 n 的整数序列&lt;/li&gt;
&lt;li&gt;&lt;code&gt;num ** 0.5&lt;/code&gt;：计算 num 的平方根，用于优化质数判断&lt;/li&gt;
&lt;li&gt;&lt;code&gt;break&lt;/code&gt;：一旦发现能被整除，立即跳出内层循环&lt;/li&gt;
&lt;li&gt;&lt;code&gt;end=&quot; &quot;&lt;/code&gt;：使输出在同一行以空格分隔&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;优化建议&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;可以只判断奇数（除了2以外）&lt;/li&gt;
&lt;li&gt;使用埃拉托斯特尼筛法（Sieve of Eratosthenes）能更高效地找出质数&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3&gt;扩展练习&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;尝试使用 &lt;code&gt;while&lt;/code&gt; 循环实现质数判断&lt;/li&gt;
&lt;li&gt;尝试使用函数封装质数判断逻辑&lt;/li&gt;
&lt;li&gt;尝试输出 n 以内的所有合数（非质数）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;AI 生成的详解&lt;/h3&gt;
&lt;h1&gt;Python 控制流详解&lt;/h1&gt;
&lt;h2&gt;一、分支结构深入&lt;/h2&gt;
&lt;h3&gt;1.1 条件表达式&lt;/h3&gt;
&lt;p&gt;Python 使用布尔值（True/False）作为判断条件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 比较运算符
a = 10
b = 5
print(a &amp;gt; b)   # True
print(a == b)  # False
print(a != b)  # True
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.2 if 语句的完整结构&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 完整的 if-elif-else 结构
score = int(input(&quot;请输入你的分数：&quot;))

if score &amp;gt;= 90:
    grade = &quot;A&quot;
    print(&quot;优秀！&quot;)
elif score &amp;gt;= 80:
    grade = &quot;B&quot;
    print(&quot;良好！&quot;)
elif score &amp;gt;= 70:
    grade = &quot;C&quot;
    print(&quot;中等！&quot;)
elif score &amp;gt;= 60:
    grade = &quot;D&quot;
    print(&quot;及格！&quot;)
else:
    grade = &quot;F&quot;
    print(&quot;不及格，需要努力！&quot;)

print(f&quot;你的等级是：{grade}&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.3 嵌套 if 语句&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;age = int(input(&quot;请输入你的年龄：&quot;))
has_license = input(&quot;你有驾照吗？(yes/no): &quot;).lower()

if age &amp;gt;= 18:
    if has_license == &quot;yes&quot;:
        print(&quot;你可以开车上路！&quot;)
    else:
        print(&quot;你需要先考取驾照！&quot;)
else:
    print(&quot;你还未成年，不能开车！&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;1.4 逻辑运算符&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# and（与）、or（或）、not（非）
age = 20
is_student = True
has_ticket = False

if age &amp;gt;= 18 and is_student:
    print(&quot;可以享受学生优惠！&quot;)

if has_ticket or age &amp;lt; 12:
    print(&quot;可以进入！&quot;)

if not has_ticket:
    print(&quot;需要购票！&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;二、循环结构深入&lt;/h2&gt;
&lt;h3&gt;2.1 while 循环详解&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 基本 while 循环
count = 1
while count &amp;lt;= 5:
    print(f&quot;这是第 {count} 次循环&quot;)
    count += 1  # 重要：不要忘记改变条件变量！

# 无限循环与 break
total = 0
while True:  # 无限循环
    num = input(&quot;请输入数字（输入&apos;q&apos;退出）：&quot;)
    if num == &apos;q&apos;:
        break  # 跳出循环
    total += int(num)
print(f&quot;总和为：{total}&quot;)

# continue 的使用
num = 0
while num &amp;lt; 10:
    num += 1
    if num % 2 == 0:
        continue  # 跳过偶数
    print(num)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.2 for 循环详解&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 遍历列表
fruits = [&quot;苹果&quot;, &quot;香蕉&quot;, &quot;橙子&quot;, &quot;葡萄&quot;]
for fruit in fruits:
    print(f&quot;我喜欢吃{fruit}&quot;)

# 遍历字符串
message = &quot;Hello Python&quot;
for char in message:
    print(char)

# range() 函数详解
print(&quot;range(5):&quot;, list(range(5)))      # [0, 1, 2, 3, 4]
print(&quot;range(2, 7):&quot;, list(range(2, 7))) # [2, 3, 4, 5, 6]
print(&quot;range(1, 10, 2):&quot;, list(range(1, 10, 2))) # [1, 3, 5, 7, 9]

# 反向遍历
for i in range(10, 0, -1):
    print(i, end=&quot; &quot;)  # 10 9 8 7 6 5 4 3 2 1
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.3 循环的 else 子句&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# for-else：当循环正常完成（未被break中断）时执行else
for i in range(5):
    if i == 10:  # 这个条件永远不会满足
        break
    print(i)
else:
    print(&quot;循环正常完成！&quot;)

# while-else 类似
count = 0
while count &amp;lt; 5:
    print(count)
    count += 1
else:
    print(&quot;while循环正常结束&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2.4 嵌套循环&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 打印乘法表
print(&quot;九九乘法表：&quot;)
for i in range(1, 10):
    for j in range(1, i + 1):
        print(f&quot;{j}×{i}={i*j:2d}&quot;, end=&quot;  &quot;)
    print()  # 换行
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;三、质数判断程序的优化与扩展&lt;/h2&gt;
&lt;h3&gt;3.1 优化版本 - 使用函数封装&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;def is_prime(num):
    &quot;&quot;&quot;判断一个数是否为质数&quot;&quot;&quot;
    if num &amp;lt;= 1:
        return False
    if num == 2:
        return True
    if num % 2 == 0:
        return False

    # 只检查奇数因子
    for i in range(3, int(num ** 0.5) + 1, 2):
        if num % i == 0:
            return False
    return True

def find_primes(n):
    &quot;&quot;&quot;找出1到n中的所有质数&quot;&quot;&quot;
    primes = []
    if n &amp;gt;= 2:
        primes.append(2)

    # 只检查奇数
    for num in range(3, n + 1, 2):
        if is_prime(num):
            primes.append(num)

    return primes

# 主程序
n = int(input(&quot;请输入一个整数 n：&quot;))
primes = find_primes(n)
print(f&quot;1 到 {n} 中的所有质数：{primes}&quot;)
print(f&quot;共有 {len(primes)} 个质数&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.2 高级版本 - 埃拉托斯特尼筛法&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;def sieve_of_eratosthenes(n):
    &quot;&quot;&quot;使用筛法找出所有质数&quot;&quot;&quot;
    if n &amp;lt; 2:
        return []

    # 创建标记数组，初始假设所有数都是质数
    is_prime = [True] * (n + 1)
    is_prime[0] = is_prime[1] = False

    for i in range(2, int(n ** 0.5) + 1):
        if is_prime[i]:
            # 将i的倍数标记为非质数
            for j in range(i * i, n + 1, i):
                is_prime[j] = False

    # 收集所有质数
    primes = [i for i in range(2, n + 1) if is_prime[i]]
    return primes

# 测试筛法
n = int(input(&quot;请输入一个整数 n：&quot;))
primes = sieve_of_eratosthenes(n)
print(f&quot;1 到 {n} 中的所有质数：&quot;)
for i, prime in enumerate(primes, 1):
    print(f&quot;{prime:4d}&quot;, end=&quot; &quot;)
    if i % 10 == 0:  # 每行显示10个
        print()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3.3 扩展练习 - 质数分解&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;def prime_factors(num):
    &quot;&quot;&quot;分解质因数&quot;&quot;&quot;
    factors = []
    divisor = 2

    while divisor * divisor &amp;lt;= num:
        if num % divisor == 0:
            factors.append(divisor)
            num //= divisor
        else:
            divisor += 1 if divisor == 2 else 2  # 跳过偶数

    if num &amp;gt; 1:
        factors.append(num)

    return factors

# 测试质因数分解
number = int(input(&quot;请输入一个正整数：&quot;))
factors = prime_factors(number)
print(f&quot;{number} = &quot;, end=&quot;&quot;)
print(&quot; × &quot;.join(map(str, factors)))
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;四、综合练习&lt;/h2&gt;
&lt;h3&gt;4.1 猜数字游戏&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;import random

def guess_number():
    &quot;&quot;&quot;猜数字游戏&quot;&quot;&quot;
    secret = random.randint(1, 100)
    attempts = 0
    max_attempts = 10

    print(&quot;猜数字游戏开始！我有一个1-100之间的秘密数字。&quot;)

    while attempts &amp;lt; max_attempts:
        try:
            guess = int(input(f&quot;第{attempts+1}次尝试，请输入你的猜测：&quot;))
        except ValueError:
            print(&quot;请输入有效的数字！&quot;)
            continue

        attempts += 1

        if guess &amp;lt; secret:
            print(&quot;太小了！&quot;)
        elif guess &amp;gt; secret:
            print(&quot;太大了！&quot;)
        else:
            print(f&quot;恭喜！你在{attempts}次内猜对了！&quot;)
            break

    if attempts &amp;gt;= max_attempts:
        print(f&quot;游戏结束！正确答案是：{secret}&quot;)

# 运行游戏
guess_number()
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4.2 计算器程序&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;def calculator():
    &quot;&quot;&quot;简单的计算器&quot;&quot;&quot;
    print(&quot;简单计算器&quot;)
    print(&quot;支持的操作：+ - * / % **&quot;)
    print(&quot;输入 &apos;quit&apos; 退出&quot;)

    while True:
        expression = input(&quot;\n请输入表达式：&quot;).strip()

        if expression.lower() == &apos;quit&apos;:
            print(&quot;再见！&quot;)
            break

        try:
            result = eval(expression)  # 注意：eval有安全风险，这里仅用于示例
            print(f&quot;结果：{result}&quot;)
        except ZeroDivisionError:
            print(&quot;错误：不能除以零！&quot;)
        except:
            print(&quot;错误：无效的表达式！&quot;)

# 更安全的版本
def safe_calculator():
    &quot;&quot;&quot;更安全的计算器版本&quot;&quot;&quot;
    while True:
        print(&quot;\n1. 加法&quot;)
        print(&quot;2. 减法&quot;)
        print(&quot;3. 乘法&quot;)
        print(&quot;4. 除法&quot;)
        print(&quot;5. 退出&quot;)

        choice = input(&quot;请选择操作：&quot;)

        if choice == &apos;5&apos;:
            break

        if choice not in [&apos;1&apos;, &apos;2&apos;, &apos;3&apos;, &apos;4&apos;]:
            print(&quot;无效的选择！&quot;)
            continue

        try:
            num1 = float(input(&quot;请输入第一个数：&quot;))
            num2 = float(input(&quot;请输入第二个数：&quot;))

            if choice == &apos;1&apos;:
                result = num1 + num2
                operator = &quot;+&quot;
            elif choice == &apos;2&apos;:
                result = num1 - num2
                operator = &quot;-&quot;
            elif choice == &apos;3&apos;:
                result = num1 * num2
                operator = &quot;*&quot;
            elif choice == &apos;4&apos;:
                if num2 == 0:
                    print(&quot;错误：除数不能为零！&quot;)
                    continue
                result = num1 / num2
                operator = &quot;/&quot;

            print(f&quot;{num1} {operator} {num2} = {result}&quot;)

        except ValueError:
            print(&quot;请输入有效的数字！&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;五、学习建议&lt;/h2&gt;
&lt;h3&gt;5.1 调试技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;使用 print 调试&lt;/strong&gt;：在关键位置打印变量值&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用断点&lt;/strong&gt;：在 VS Code 中设置断点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;异常处理&lt;/strong&gt;：使用 try-except 捕获错误&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5.2 编程习惯&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;变量命名&lt;/strong&gt;：使用有意义的变量名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;注释&lt;/strong&gt;：为复杂逻辑添加注释&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;函数封装&lt;/strong&gt;：将重复代码封装成函数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;测试&lt;/strong&gt;：为代码编写测试用例&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;5.3 进阶学习&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;列表推导式&lt;/strong&gt;：简化循环创建列表&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成器&lt;/strong&gt;：处理大数据时节省内存&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;装饰器&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;h2&gt;六、实践任务&lt;/h2&gt;
&lt;p&gt;完成以下编程任务来巩固学习：&lt;/p&gt;
&lt;h3&gt;任务1：斐波那契数列&lt;/h3&gt;
&lt;p&gt;编写程序输出前 n 个斐波那契数列&lt;/p&gt;
&lt;h3&gt;任务2：闰年判断&lt;/h3&gt;
&lt;p&gt;输入年份，判断是否为闰年&lt;/p&gt;
&lt;h3&gt;任务3：最大公约数和最小公倍数&lt;/h3&gt;
&lt;p&gt;输入两个数，计算它们的最大公约数和最小公倍数&lt;/p&gt;
&lt;h3&gt;任务4：回文数判断&lt;/h3&gt;
&lt;p&gt;判断一个数是否为回文数&lt;/p&gt;
</content:encoded></item><item><title>Python入门 #1</title><link>https://www.zhx-blog.top/posts/2025-11-03-python%E5%85%A5%E9%97%A8/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-11-03-python%E5%85%A5%E9%97%A8/</guid><description>编程社Python教学</description><pubDate>Mon, 17 Nov 2025 11:20:41 GMT</pubDate><content:encoded>&lt;h1&gt;第一个程序&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：
不一定所有内容都能看得懂，实践最重要。所以遇到不懂得可以先跳过（或者直接问），写的代码多了就懂了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如何打开IDE呢？下载好&lt;a href=&quot;www.python.org&quot;&gt;Python&lt;/a&gt;安装后可以在桌面上发现一个名叫IDLE的快捷方式（如果在安装时选择了创建快捷方式），点击即可打开。由于机房电脑一些奇奇怪怪的错误，学校机房的桌面快捷方式死了，所以请按下Win键（或点击左下角Windows图标）打开&lt;strong&gt;开始&lt;/strong&gt;菜单查找Python-&amp;gt;IDLE打开。建议选择白色的。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;IDE:
IDE是集成开发环境的缩写，可以大致理解为用于进行开发活动的全套软件。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;交互式解释器介绍&lt;/h2&gt;
&lt;p&gt;刚打开IDLE时，你会发现一个白色的窗口，其中有如下字样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:24:06) [MSC v.1600 32 bit (Intel)] on win32
Type &quot;copyright&quot;, &quot;credits&quot; or &quot;license()&quot; for more information.
&amp;gt;&amp;gt;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后一行前的&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/code&gt;标志这是交互式解释器。&lt;em&gt;交互式&lt;/em&gt;就意味输入一行解释器就会执行一行。例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; 12+13
25
&amp;gt;&amp;gt;&amp;gt; 135465457654357654357356**10
2081065193176208652493570136210529355534687343561794797850624650869897720865652351060577643074271139111678336606170815459838610973844137190397334937575949673593026866575900058843430712604593435740147956665499607587584231896358322176
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中，你若输入一个表达式，他就会返回表达式的值；反若是语句等，则输出结果。例如&lt;code&gt;print&lt;/code&gt;是一个函数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; print
&amp;lt;built-in function print&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;直接输入（即当做表达式输入）返回的是其类型（即值）：内建函数print&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;表达式：
蕴含值的一个式子（大致可如此理解）。
例如，&lt;code&gt;1+1&lt;/code&gt;是一个表达式，&lt;code&gt;1234*4537&lt;/code&gt;也是一个表达式&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;print&lt;/code&gt;函数：
&lt;code&gt;print&lt;/code&gt;函数用于把参数向控制台输出。例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; print(12)
12
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;h3&gt;实践&lt;/h3&gt;
&lt;p&gt;打开IDLE，使用交互式解释器在控制台输出&lt;code&gt;hello, world!&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;在文件中写代码&lt;/h2&gt;
&lt;p&gt;点击窗口左上角的&lt;code&gt;File&lt;/code&gt;，选择&lt;code&gt;New File&lt;/code&gt;，就可以打开一个名叫&lt;code&gt;untitled&lt;/code&gt;的文件编辑窗口。你可以在这里写代码保存到文件并执行。&lt;/p&gt;
&lt;p&gt;例如，输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;print(1+1)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按&lt;code&gt;Ctrl+S&lt;/code&gt;保存，输入你想取的名字，保存在合适位置。&lt;/p&gt;
&lt;p&gt;接着，点击&lt;code&gt;Run&lt;/code&gt;，选择&lt;code&gt;Run model&lt;/code&gt;，即可在刚才打开的交互式解释器查看运行结果。
例如刚才的文件的运行结果是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt;&amp;gt; ================================ RESTART ================================
&amp;gt;&amp;gt;&amp;gt;
2
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;实践&lt;/h3&gt;
&lt;p&gt;创建一个名叫&lt;code&gt;helloworld.py&lt;/code&gt;(需要把显示拓展名打开)的文件，编辑合适的代码，使得这个文件能够向控制台输出&lt;code&gt;hello, world&lt;/code&gt;。&lt;/p&gt;
</content:encoded></item><item><title># P6824 🉑乐题解</title><link>https://www.zhx-blog.top/posts/2025-10-23--p6824-%E4%B9%90%E9%A2%98%E8%A7%A3/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-10-23--p6824-%E4%B9%90%E9%A2%98%E8%A7%A3/</guid><description>洛谷P6824题解</description><pubDate>Thu, 23 Oct 2025 18:49:57 GMT</pubDate><content:encoded>&lt;h1&gt;🉑乐题解&lt;/h1&gt;
&lt;p&gt;参考题解：&lt;a href=&quot;https://www.luogu.com.cn/article/qn6tgafg&quot;&gt;题解 P6824 【「EZEC-4」可乐】&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;题目分析&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;有 &lt;code&gt;n&lt;/code&gt; 瓶可乐，每瓶可乐有一个&lt;strong&gt;口味值&lt;/strong&gt; &lt;code&gt;a[i]&lt;/code&gt;（非负整数）。&lt;/li&gt;
&lt;li&gt;你可以选择一个整数 &lt;code&gt;x&lt;/code&gt;（非负整数），对于每瓶可乐：
&lt;ul&gt;
&lt;li&gt;如果 &lt;code&gt;(a[i] XOR x) &amp;lt;= k&lt;/code&gt;，那么你能喝到这瓶可乐。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;目标：选择合适的 &lt;code&gt;x&lt;/code&gt;，使得能喝到的可乐瓶数最多，输出这个最大值。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;解题思路&lt;/h2&gt;
&lt;h3&gt;暴力做法&lt;/h3&gt;
&lt;p&gt;最直接的想法是枚举所有可能的 &lt;code&gt;x&lt;/code&gt;，然后对每个 &lt;code&gt;x&lt;/code&gt; 统计有多少瓶可乐满足 &lt;code&gt;(a[i] XOR x) &amp;lt;= k&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;但是 &lt;code&gt;x&lt;/code&gt; 的范围是多少呢？
因为 &lt;code&gt;2^a[i] &amp;lt; 2^21&lt;/code&gt;，所以 &lt;code&gt;a[i]&lt;/code&gt; 最大可能接近 &lt;code&gt;2^21&lt;/code&gt;，但 &lt;code&gt;x&lt;/code&gt; 的值其实可以限制在 &lt;code&gt;[0, 2^21)&lt;/code&gt;，因为更大的 &lt;code&gt;x&lt;/code&gt; 只是高位不同，对比较结果影响不大，而且 &lt;code&gt;k&lt;/code&gt; 最大也是 &lt;code&gt;2^21&lt;/code&gt; 级别，所以枚举到 &lt;code&gt;2^21&lt;/code&gt; 就足够了。&lt;/p&gt;
&lt;h3&gt;优化思路&lt;/h3&gt;
&lt;p&gt;我们知道，从暴力法求解主要需要两个步骤：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;枚举可能的&lt;code&gt;x&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对于给定的 &lt;code&gt;x&lt;/code&gt;，计算有多少 &lt;code&gt;a[i]&lt;/code&gt; 满足 &lt;code&gt;(a[i] XOR x) &amp;lt;= k&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们打算使用 &lt;strong&gt;Trie 树&lt;/strong&gt;（二进制 Trie，这样就只用跑）来存储所有 &lt;code&gt;a[i]&lt;/code&gt;，并在 Trie 上沿着 &lt;code&gt;x XOR k&lt;/code&gt; 的路径走，同时统计满足条件的节点数量。&lt;/p&gt;
&lt;h4&gt;查询&lt;/h4&gt;
&lt;p&gt;在&lt;code&gt;Trie&lt;/code&gt;上，我们从高位到低位枚举，&lt;/p&gt;
&lt;p&gt;记：&lt;code&gt;k&lt;/code&gt;的第&lt;code&gt;i&lt;/code&gt;位为&lt;code&gt;1&lt;/code&gt;，&lt;code&gt;x&lt;/code&gt;的第&lt;code&gt;i&lt;/code&gt;位为&lt;code&gt;c&lt;/code&gt;，假设前面判断的每一位都相等：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;如果&lt;code&gt;k&lt;/code&gt;的这一位是&lt;code&gt;1&lt;/code&gt;，那么&lt;code&gt;a[i] XOR x&lt;/code&gt;在这一位为&lt;code&gt;0&lt;/code&gt;的所有情况都满足条件。&lt;/p&gt;
&lt;p&gt;因为高位相等，当前位&lt;code&gt;0 &amp;lt; 1&lt;/code&gt;，所以整个子树都满足&lt;code&gt;(a[i] XOR x) &amp;lt; k&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        if (t == 1) {
            // 如果k的这一位是1，那么a[i] XOR x在这一位为0的所有情况都满足条件
            // 因为高位相等，当前位0 &amp;lt; 1，所以整个子树都满足(a[i] XOR x) &amp;lt; k
            ret += sz[trie[p][!(c ^ t)]];
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;k的当前位为0&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;此时：(a[i] XOR x) 的当前位必须是 0&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果是 1：那么 (a[i] XOR x) &amp;gt; k，不满足条件&lt;/li&gt;
&lt;li&gt;如果是 0：继续判断低位&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代码实现：只能沿着&lt;code&gt;c ^ t&lt;/code&gt;方向继续走。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;        if (!trie[p][c ^ t]) {
            flag = 1;  // 标记提前结束
            break;
        }
        p = trie[p][c ^ t];  // 移动到下一个节点
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;注意：如果没有提前结束（即最后一个节点亦可），记得加上最后相等的情况&lt;/strong&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;if (!flag) ret += sz[p];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;统计 &lt;code&gt;(a[i] XOR x) == k&lt;/code&gt; 的情况。&lt;/p&gt;
</content:encoded></item><item><title>Open Source: The Hacker&apos;s Utopia</title><link>https://www.zhx-blog.top/posts/2025-10-20-open-source-hackers-utopia/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-10-20-open-source-hackers-utopia/</guid><description>这是一篇在英语课上分享开源软件的文章，使用AIGC工具辅助生成。</description><pubDate>Mon, 20 Oct 2025 10:42:03 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;strong&gt;&lt;a href=&quot;https://www.zhx-blog.top/usr/uploads/2025/10/2538726106.pptx&quot;&gt;Open Source: The Hacker&apos;s Utopia&lt;/a&gt;&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;Hello everyone, it&apos;s a great honor to stand here and share my topic with you. Firstly, I&apos;d like to ask you all to guess what I&apos;ll be talking about today.&lt;/p&gt;
&lt;p&gt;(In English)&lt;/p&gt;
&lt;p&gt;Initially, I intended to address the issue of wasteful electricity consumption and its environmental impact. However, assuming this topic might not resonate with everyone, I&apos;ve decided to pivot to an alternative subject.&lt;/p&gt;
&lt;p&gt;Lately I have been deeply attracted by open-source software. I think it has some characteristics of communism.&lt;strong&gt;Generally speaking, my speech today has four parts.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let&apos;s begin!&lt;/p&gt;
&lt;p&gt;First: The Hook: &quot;The $0 Operating System That Powers the World&quot;&lt;/p&gt;
&lt;p&gt;Have you ever used a phone?&lt;/p&gt;
&lt;p&gt;Have you ever surfed the internet?&lt;/p&gt;
&lt;p&gt;Did you know that ALMOST 90% of the servers you rely on are running on the FREE, OPEN-SOURCE operating system, Linux?&lt;/p&gt;
&lt;p&gt;The system of almost every phone is Android, which is based on the Linux kernel.&lt;/p&gt;
&lt;p&gt;Furthermore, did you know that ALMOST 70% of the servers you rely on are running on the FREE, OPEN-SOURCE operating system, Linux?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is Linux?&lt;/strong&gt;
A free, open-source, and community-driven operating system that powers the world.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Core Idea: Freedom&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Open Source:&lt;/strong&gt; Anyone can view, use, and contribute to its code.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Free:&lt;/strong&gt; Most distributions are free of cost.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where is it&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&quot;Many people think of Linux as a niche technical tool, but the reality is, it&apos;s the invisible foundation of our digital world. It&apos;s everywhere, powering everything from the vast internet to the devices in our pockets. Let me show you what I mean.&quot;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🌐 The Internet:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&quot;Look at the internet.&lt;/strong&gt; Over 70% of all web servers run on Linux. What this means is that &lt;strong&gt;virtually every website you visit is most likely delivered to you by a machine running Linux.&lt;/strong&gt; It&apos;s the bedrock of the online experience.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;📱 Android:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&quot;Now, think about your phone.&lt;/strong&gt; Android is the world&apos;s most popular mobile OS, and it&apos;s built directly on top of the Linux kernel. So, &lt;strong&gt;if you use an Android phone, you are using a Linux-based system every single day.&lt;/strong&gt; &quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;💻 The Cloud:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&quot;Moving to the cloud.&lt;/strong&gt; Linux powers the vast majority of cloud infrastructure. Whether it&apos;s Amazon AWS, Google Cloud, or Microsoft Azure, &lt;strong&gt;the cloud, quite literally, runs on Linux.&lt;/strong&gt; It&apos;s the engine of the modern digital economy.&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🖥️ Supercomputers:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&quot;For the most demanding tasks.&lt;/strong&gt;
When scientists need to tackle the world&apos;s biggest problems—like
climate modeling or genetic research—they turn to supercomputers. And
nearly all of them run on Linux, proving its &lt;strong&gt;unmatched power and reliability&lt;/strong&gt; .&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;🔧 Your Car &amp;amp; Smart Devices:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&quot;And it&apos;s even closer to home.&lt;/strong&gt;
Linux is embedded in the technology all around us: in our cars, our
home routers, and our smart gadgets. This shows its incredible &lt;strong&gt;versatility and adaptability&lt;/strong&gt; .&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&quot;So, from the global scale of the internet and the cloud, down to the personal devices we interact with constantly, &lt;strong&gt;Linux is the silent, stable, and powerful force that makes it all work.&lt;/strong&gt; It truly is the unsung hero of our connected world.&quot;&lt;/p&gt;
&lt;p&gt;So for the normal person, what is the meaning of Open-Source?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Security: The source code is open for inspection by anyone, which allows vulnerabilities to be found and fixed quickly by the global community.&lt;/li&gt;
&lt;li&gt;Reliability &amp;amp; Quality: Peer review by a large number of developers often leads to more stable, efficient, and high-quality software.&lt;/li&gt;
&lt;li&gt;Flexibility &amp;amp; Customization: Users have the freedom to modify the code to fit their specific needs and requirements.&lt;/li&gt;
&lt;li&gt;Active Community Support: Vibrant communities provide free support, documentation, tutorials, and continuous improvement.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Well, there are always some disadvantage, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Lack of Official Support: While community support is available, there may be no formal support service or guaranteed response time, which can be a risk for businesses.&lt;/li&gt;
&lt;li&gt;Complexity &amp;amp; Usability: Some open-source software may have a steeper learning curve and less polished user interface compared to commercial products.&lt;/li&gt;
&lt;li&gt;Potential Security Risks: While transparency aids security, it also means hackers can equally study the code to find vulnerabilities before they are patched.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But honestly, these downsides aren&apos;t a big deal. That&apos;s because we have a global community of dedicated open-source developers who are driven by passion and a spirit of collaboration.&lt;/p&gt;
&lt;p&gt;But generally speaking, the most compelling aspect of the open-source model is its profound spirit of contribution. Countless developers, driven by pure passion and altruism, dedicate their talents and valuable time without monetary reward. They collaborate to build powerful software, motivated not by profit, but by the belief that through selfless sharing, they can make the world of technology better for everyone.&lt;/p&gt;
&lt;p&gt;What is Open Source?
Beyond &quot;Free as in Beer&quot;&lt;/p&gt;
&lt;p&gt;Open-source software is the closest thing we have to the communist ideal in the digital age.&lt;/p&gt;
&lt;p&gt;Abolition of Private Property:
Source code is the &quot;means of production,&quot; rendered public property by its license.&lt;/p&gt;
&lt;p&gt;From Each According to Ability:
Developers contribute voluntarily, following their own interests and skills.&lt;/p&gt;
&lt;p&gt;To Each According to Need:
Any open-source software is free for any person to use for any need.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;You can see them commit their latest changes, as recently as 2 days ago, not for profit, but for passion.&lt;/p&gt;
&lt;p&gt;You can see thousands of individuals, bound by a shared passion, converge into a single force.&lt;/p&gt;
&lt;p&gt;Finally, I&apos;d like to end with an emphatic sentence:
It is their dedication and selfless sharing that makes the open-source truly strong, has allowed me to truly appreciate the charm of open source.&lt;/p&gt;
</content:encoded></item><item><title>Linux终端使用帮助</title><link>https://www.zhx-blog.top/posts/2025-10-04-linux%E7%BB%88%E7%AB%AF%E4%BD%BF%E7%94%A8%E5%B8%AE%E5%8A%A9/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-10-04-linux%E7%BB%88%E7%AB%AF%E4%BD%BF%E7%94%A8%E5%B8%AE%E5%8A%A9/</guid><description>编程社教学Linux终端使用教程</description><pubDate>Sat, 04 Oct 2025 22:17:10 GMT</pubDate><content:encoded>&lt;h1&gt;终端使用帮助&lt;/h1&gt;
&lt;p&gt;在Linux下，终端是一定需要掌握的工具。它可以直接&lt;strong&gt;与任何安装在系统上的软件进行交互（包括系统底层（直接或通过软件）），并可以执行许多在图形化界面不能完成的操作&lt;/strong&gt;，因为Linux最初就&lt;strong&gt;只有一个终端（绝大多数来电脑皆是这样的，包括Windows的老祖宗）&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;常用命令一览&lt;/h2&gt;
&lt;h3&gt;sudo - 提升权限&lt;/h3&gt;
&lt;p&gt;Pay Attantion!!!!!&lt;/p&gt;
&lt;p&gt;We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[sudo] password for [用户名]:&lt;/p&gt;
&lt;p&gt;这是第一次运行sudo时的提示。很抱歉这一次被我使用掉了。但是你们也必须知道这一点。sudo是提升用户权限为管理员的指令，使用后的10min用户都可以显式地获得临时的管理员权限（如用于安装软件等）。&lt;br /&gt;
注意：sudo命令后的输入密码环节**密码不回显！**即没有&lt;code&gt;*&lt;/code&gt;提示（可以配置但是没有必要）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;上面那段话的翻译：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;我们相信您已从当地系统那里听到了常规的训诫
管理员。通常归结为以下三点：
#1) 尊重他人的隐私。
#2）三思而后行。
#3) 力量越大，责任越大。
[sudo] 用户名 的密码：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;&lt;code&gt;chmod&lt;/code&gt;：权限管理之一&lt;/h4&gt;
&lt;p&gt;常用参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;-x&lt;/code&gt;：添加执行权限。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;同样的也有&lt;code&gt;-x&lt;/code&gt;：取消执行权限&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;djy@DianJiaoYuan:~/Temp$ cat temp.sh
#!/usr/bin/bash
echo &quot;HelloWorld&quot;

djy@DianJiaoYuan:~/Temp$ ll temp.sh
-rw-rw-r-- 1 djy djy 35 10月  4 22:10 temp.sh
djy@DianJiaoYuan:~/Temp$ ./temp.sh
bash: ./temp.sh: 权限不够
djy@DianJiaoYuan:~/Temp$ chmod +x temp.sh
djy@DianJiaoYuan:~/Temp$ ./temp.sh
HelloWorld
djy@DianJiaoYuan:~/Temp$ ll temp.sh
-rwxrwxr-x 1 djy djy 35 10月  4 22:10 temp.sh*
djy@DianJiaoYuan:~/Temp$ chmod -x temp.sh
djy@DianJiaoYuan:~/Temp$ ./temp.sh
bash: ./temp.sh: 权限不够
djy@DianJiaoYuan:~/Temp$ ll temp.sh
-rw-rw-r-- 1 djy djy 35 10月  4 22:10 temp.sh
djy@DianJiaoYuan:~/Temp$
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;mkdir touch&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;mkdir&lt;/code&gt;: 创建目录&lt;/p&gt;
&lt;p&gt;&lt;code&gt;touch&lt;/code&gt;: 创建文件&lt;/p&gt;
&lt;h3&gt;echo&lt;/h3&gt;
&lt;p&gt;输出&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ echo &quot;Hello, World!&quot;
&quot;Hello, World!&quot;
$
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;ls&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ls&lt;/code&gt;命令用于列出目录中的所有文件及子目录。有几个常用的参数：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-a&lt;/code&gt;：列出隐藏文件，默认有缩写&lt;code&gt;la&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-l&lt;/code&gt;：列出详细信息，默认有缩写&lt;code&gt;ll&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;cat&lt;/h3&gt;
&lt;p&gt;输出文件内容&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cat temp.txt
Exemple File
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;pwd&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;pwd&lt;/code&gt;输出当前工作目录即所在目录&lt;/p&gt;
&lt;h3&gt;cd&lt;/h3&gt;
&lt;p&gt;进入某目录
例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;djy@DianJiaoYuan:~$ cd 下载
djy@DianJiaoYuan:~/下载$ pwd
/home/djy/下载
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;rm 删除文件/目录&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;rm &amp;lt;filename&amp;gt;&lt;/code&gt;删除文件&amp;lt;filename&amp;gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;djy@DianJiaoYuan:~/Temp$ touch temp.txt
djy@DianJiaoYuan:~/Temp$ ls
temp.txt
djy@DianJiaoYuan:~/Temp$ rm temp.txt
djy@DianJiaoYuan:~/Temp$ ls
djy@DianJiaoYuan:~/Temp$
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;辅助字符（部分常用的）&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;连续执行（在前者执行成功之后）
如&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;djy@DianJiaoYuan:~$ mkdir Temp &amp;amp;&amp;amp; cd Temp
djy@DianJiaoYuan:~/Temp$ pwd
/home/djy/Temp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;&amp;gt;&lt;/code&gt; / &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;&amp;gt;&lt;/code&gt;: 覆写。即删除文件所有内容并写入(执行过程：若存在同名文件：覆盖；不存在：创建。所以会自动创建文件)&lt;br /&gt;
&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;: 追加。即在文件最后追加内容(同样会自动创建文件（兼容性存疑））&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;djy@DianJiaoYuan:~/Temp$ touch temp.txt
djy@DianJiaoYuan:~/Temp$ ls
temp.txt
djy@DianJiaoYuan:~/Temp$ cat temp.txt
djy@DianJiaoYuan:~/Temp$ echo &quot;Hello, world!&quot; &amp;gt; temp.txt
djy@DianJiaoYuan:~/Temp$ cat temp.txt
Hello, world!
djy@DianJiaoYuan:~/Temp$ echo &quot;Hello, Linux!&quot; &amp;gt; temp.txt
djy@DianJiaoYuan:~/Temp$ cat temp.txt
Hello, Linux!
djy@DianJiaoYuan:~/Temp$ echo &quot;Hello, Linux!&quot; &amp;gt;&amp;gt; temp.txt
djy@DianJiaoYuan:~/Temp$ cat temp.txt
Hello, Linux!
Hello, Linux!
djy@DianJiaoYuan:~/Temp$ rm temp.txt
djy@DianJiaoYuan:~/Temp$ ls
djy@DianJiaoYuan:~/Temp$ echo &quot;Hello, world!&quot; &amp;gt; temp.txt
djy@DianJiaoYuan:~/Temp$ ls
temp.txt
djy@DianJiaoYuan:~/Temp$ cat temp.txt
Hello, world!
djy@DianJiaoYuan:~/Temp$ rm temp.txt
djy@DianJiaoYuan:~/Temp$ ls
djy@DianJiaoYuan:~/Temp$ echo &quot;Hello, World!&quot; &amp;gt;&amp;gt; temp.txt
djy@DianJiaoYuan:~/Temp$ ls
temp.txt
djy@DianJiaoYuan:~/Temp$ cat temp.txt
Hello, World!

&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;&lt;code&gt;|&lt;/code&gt;管道字符。&lt;/h3&gt;
&lt;p&gt;将前者的输出作为后者的输入执行两者（将前者的标准输出(&lt;code&gt;stdout&lt;/code&gt;)重定向到后者的标准输入&lt;code&gt;stdin&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;djy@DianJiaoYuan:~/Temp$ echo &quot;#include &amp;lt;bits/stdc++.h&amp;gt;
int main() {
    int a;
    std::cin &amp;gt;&amp;gt; a;
    std::cout &amp;lt;&amp;lt; \&quot;a = \&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; std::endl;
    return 0;
}&quot; &amp;gt; temp.cpp
djy@DianJiaoYuan:~/Temp$ g++ -std=c++14 -O2 -o temp temp.cpp
djy@DianJiaoYuan:~/Temp$ ./temp
1
a = 1
djy@DianJiaoYuan:~/Temp$ echo &quot;12&quot; &amp;gt; ./temp
djy@DianJiaoYuan:~/Temp$ echo &quot;#include &amp;lt;bits/stdc++.h&amp;gt;
int main() {
    int a;
    std::cin &amp;gt;&amp;gt; a;
    std::cout &amp;lt;&amp;lt; \&quot;a = \&quot; &amp;lt;&amp;lt; a &amp;lt;&amp;lt; std::endl;
    return 0;
}&quot; &amp;gt; temp.cpp
djy@DianJiaoYuan:~/Temp$ g++ -std=c++14 -O2 -o temp temp.cpp
djy@DianJiaoYuan:~/Temp$ echo &quot;1&quot; | ./temp
a = 1
djy@DianJiaoYuan:~/Temp$ echo &quot;1&quot; &amp;gt; ./temp
djy@DianJiaoYuan:~/Temp$ ./temp
./temp: 行 1: 1：未找到命令
djy@DianJiaoYuan:~/Temp$ cat ./temp
1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个用处还是挺多的，可以直接把&lt;code&gt;cat 文件&lt;/code&gt;作为前项，达到不用手输输入。或者这个好玩的（需要你们自己试试，我这里就放终端复制的HTML了）&lt;/p&gt;
&lt;p&gt;&amp;lt;pre&amp;gt;&amp;lt;font color=&quot;#4E9A06&quot;&amp;gt;&amp;lt;b&amp;gt;djy@DianJiaoYuan&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;:&amp;lt;font color=&quot;#3465A4&quot;&amp;gt;&amp;lt;b&amp;gt;~&amp;lt;/b&amp;gt;&amp;lt;/font&amp;gt;$ ll | lolcat
&amp;lt;font color=&quot;#5F5FFF&quot;&amp;gt;总用量 72&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#5F5FFF&quot;&amp;gt;drwxr-xr&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5F87FF&quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#0087FF&quot;&amp;gt;x 12 djy &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFFF&quot;&amp;gt; djy  409&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt;6 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;10月  3 23:&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;2&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;0 ./&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#5F5FFF&quot;&amp;gt;drwxr&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5F87FF&quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#0087FF&quot;&amp;gt;xr-x  3 r&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFFF&quot;&amp;gt;oot root &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt;40&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;96 10月  3 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;2&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;1:52 ../&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#5F5FFF&quot;&amp;gt;dr&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5F87FF&quot;&amp;gt;w&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#0087FF&quot;&amp;gt;xr-xr-x  &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFFF&quot;&amp;gt;2 djy  dj&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt;y &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt; 4096 10月 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;3 22:37 下载&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;/&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#0087FF&quot;&amp;gt;drwxr-xr-&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFFF&quot;&amp;gt;x  2 djy &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt; d&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;jy  4096 1&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;0&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;月  3 22:44&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt; 桌面/&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#0087FF&quot;&amp;gt;-rw---&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFFF&quot;&amp;gt;----  1 d&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt;jy&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;  djy    1&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;5&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt; 10月  3 21&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;:57 .bash&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt;&lt;em&gt;&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;history&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#0087FF&quot;&amp;gt;-rw&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFFF&quot;&amp;gt;-r--r--  &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt;1 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;djy  djy  &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;220 10月  3&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt; 21:52 .b&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt;a&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;sh_logout&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00AFFF&quot;&amp;gt;-rw-r--r-&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt;- &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt; 1 djy  dj&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;y&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;  3771 10月&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;  3 21:52&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;.bashrc&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00AFFF&quot;&amp;gt;drwx--&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt;--&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;-- 14 djy &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;djy  4096 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;10月  4  2&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt;0&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;25 .cache/&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00AFFF&quot;&amp;gt;drw&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt;xr&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;-xr-x 12 d&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;j&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;y  djy  40&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;96 10月  3&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;22:03 .conf&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt;i&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt;g/&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00AFD7&quot;&amp;gt;dr&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;wx------  &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;3&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt; djy  djy &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt; 4096 10月&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt; 3 21:52 .d&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt;b&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt;us/&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;drwx-----&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;  3 djy  d&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;jy  4096 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;0月  4  2025&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt;.gnupg/&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;drwx--&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;---  3 djy&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;  djy  40&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt;9&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;6 10月  4  2&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt;0&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt;25 .local&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFFF00&quot;&amp;gt;/&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00D7D7&quot;&amp;gt;drw&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;x&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;------  5 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;djy  djy &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;4096 10月  4&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt; 2025 .mo&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFFF00&quot;&amp;gt;zilla/&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00D7AF&quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;rw-r--r-- &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt; 1 djy  d&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt;j&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;y   807 10月&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt; 3 21:52 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFFF00&quot;&amp;gt;.profile&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;-rw-r--r&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;--  1 djy&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt; djy     0 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt;1&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt;0月  3 22:&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFFF00&quot;&amp;gt;37 .sudo&lt;/em&gt;&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFD700&quot;&amp;gt;a&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#D7D700&quot;&amp;gt;s_admin_suc&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#D7AF00&quot;&amp;gt;c&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#FFAF00&quot;&amp;gt;essful&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;drwxr&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;wxr-x  2 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt;d&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;jy  djy  40&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt;9&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt;6 10月  3 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFFF00&quot;&amp;gt;23:35 Tem&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFD700&quot;&amp;gt;p&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#D7D700&quot;&amp;gt;/&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00FFAF&quot;&amp;gt;-r&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;w------- &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;1 djy  djy &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt; &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt;4138 10月 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFFF00&quot;&amp;gt; 3 22:44 &amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFD700&quot;&amp;gt;.&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#D7D700&quot;&amp;gt;viminfo&amp;lt;/font&amp;gt;
&amp;lt;font color=&quot;#00FF87&quot;&amp;gt;drwxr-xr&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF87&quot;&amp;gt;-&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#5FFF5F&quot;&amp;gt;x  3 djy  d&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF5F&quot;&amp;gt;j&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#87FF00&quot;&amp;gt;y  4096 1&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFFF00&quot;&amp;gt;0月  3 21:&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#AFD700&quot;&amp;gt;5&amp;lt;/font&amp;gt;&amp;lt;font color=&quot;#D7D700&quot;&amp;gt;2 .vscode/&amp;lt;/font&amp;gt;
&amp;lt;/pre&amp;gt;&lt;/p&gt;
&lt;h2&gt;第三方常用软件&lt;/h2&gt;
&lt;h3&gt;g++&lt;/h3&gt;
&lt;p&gt;这里介绍g++的常用用法&lt;/p&gt;
&lt;p&gt;g++ &quot;文件名&quot; &amp;lt;选项&amp;gt;
常用的选项有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-o&lt;/code&gt; 指定输出文件名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-std=&lt;/code&gt;指定C++标准。如C++ 14&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;lolcat: 彩色输出&lt;/h4&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;djy@DianJiaoYuan:~$ ls | lolcat
001.cpp
下载
桌面
clash-for-linux
OI-ZhX589
temp
Temp
temp.cpp
temp.o

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然，实际上要你们自行测试才能清楚是什么样子的（或者使用typora打开时查看上面那一段HTML代码）。&lt;/p&gt;
</content:encoded></item><item><title>树链剖分 </title><link>https://www.zhx-blog.top/posts/2025-09-25-%E6%A0%91%E9%93%BE%E5%89%96%E5%88%86_/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-09-25-%E6%A0%91%E9%93%BE%E5%89%96%E5%88%86_/</guid><description>关于树链剖分的介绍</description><pubDate>Thu, 25 Sep 2025 18:54:00 GMT</pubDate><content:encoded>&lt;h1&gt;树链剖分&lt;/h1&gt;
&lt;h2&gt;重链剖分&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;树链剖分&lt;/strong&gt;：将树分割成若干条链的形式，用于维护树上的信息。&lt;/p&gt;
&lt;p&gt;形式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;重链剖分&lt;/li&gt;
&lt;li&gt;长链剖分&lt;/li&gt;
&lt;li&gt;实链剖分&lt;/li&gt;
&lt;li&gt;等等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;重链剖分由于&lt;strong&gt;将树上数据的维护变成了序列数据的维护&lt;/strong&gt;，因此可以用线段树等维护序列的数据结构便捷地维护。&lt;/p&gt;
&lt;h3&gt;定义申明&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;重儿子（Heavy Son）&lt;/strong&gt;：对于一个节点 &lt;code&gt;u&lt;/code&gt;，其所有子节点中&lt;strong&gt;子树大小最大&lt;/strong&gt;的那个子节点称为重儿子。如果有多个最大，任意选一个。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻儿子（Light Son）&lt;/strong&gt;：除了重儿子以外的其他子节点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重边（Heavy Edge）&lt;/strong&gt;：连接节点 &lt;code&gt;u&lt;/code&gt; 和其重儿子的边。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;轻边（Light Edge）&lt;/strong&gt;：连接节点 &lt;code&gt;u&lt;/code&gt; 和其轻儿子的边。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重链（Heavy Chain）&lt;/strong&gt;：由一系列重边连接而成的路径。重链的开头是轻儿子或根节点。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;需要为每个节点 &lt;code&gt;u&lt;/code&gt; 存储的信息：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;father[u]&lt;/code&gt;：节点 &lt;code&gt;u&lt;/code&gt; 的父节点。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;deep[u]&lt;/code&gt;：节点 &lt;code&gt;u&lt;/code&gt; 的深度（根节点深度为0或1）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sz[u]&lt;/code&gt;：以 &lt;code&gt;u&lt;/code&gt; 为根的子树的节点数量。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;son[u]&lt;/code&gt;：节点 &lt;code&gt;u&lt;/code&gt; 的重儿子。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;top[u]&lt;/code&gt;：节点 &lt;code&gt;u&lt;/code&gt; 所在&lt;strong&gt;重链的顶端&lt;/strong&gt;节点。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tid[u]&lt;/code&gt;（或 &lt;code&gt;id[u]&lt;/code&gt;）：节点 &lt;code&gt;u&lt;/code&gt; 在 &lt;strong&gt;DFS 序（新编号）&lt;/strong&gt; 中的位置。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wt[dfn[u]]&lt;/code&gt;：DFS 序对应位置的节点权值。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;把落单的结点也当作重链，那么整棵树就被剖分成若干条重链。如图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/home/zhx/%E4%B8%8B%E8%BD%BD/hld.png&quot; alt=&quot;树&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://oi-wiki.org/graph/hld/&quot;&gt;来源于OI-WiKi，侵删&lt;/a&gt;&lt;/p&gt;
&lt;h5&gt;注意：&lt;/h5&gt;
&lt;p&gt;节点编号有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原编号（节点ID）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范围&lt;/strong&gt;：1 到 n&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：&lt;code&gt;x&lt;/code&gt;, &lt;code&gt;fa&lt;/code&gt;, &lt;code&gt;edge[i].to&lt;/code&gt; 等都使用这个编号体系&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;示例&lt;/strong&gt;：根节点是1，它的子节点可能是2,3,4等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DFS序编号 (&lt;code&gt;tid&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范围&lt;/strong&gt;：1 到 n&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：线段树中的位置编号&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;映射&lt;/strong&gt;：&lt;code&gt;tid[x]&lt;/code&gt; 表示原节点x的DFS序位置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边的索引 (&lt;code&gt;edge&lt;/code&gt;下标)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范围&lt;/strong&gt;：1 到 cnt（边的计数器）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用途&lt;/strong&gt;：邻接表中遍历边时使用&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;实现&lt;/h3&gt;
&lt;p&gt;共用两个DFS：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&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;/p&gt;
&lt;p&gt;获得了以下基础信息：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每棵树的子树大小&lt;/li&gt;
&lt;li&gt;标记父节点和深度&lt;/li&gt;
&lt;li&gt;确定重儿子&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;具体步骤：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void dfs1(int x, int fa, int depth) // 节点id，fa id，节点在树上的深度；
{
    sz[x] = 1; // 初始化节点子树大小
    father[x] = fa;
    deep[x] = depth; // 节点在树上的深度

   	// 遍历该节点的所有子节点(链式前向星)
    for (int i = head[x]; i; i = edge[i].next) // i是指针
    {
        Node v = edge[i].to;
        if (v == fa) continue; // 非有向边

        dfs1(v, x, depth+1);
        sz[x] += sz[v];

        // 判断重儿子 &amp;lt;- 没有重儿子/新节点更重
        if (!son[x] or sz[v] &amp;gt; deep[son[x]])
            son[x] = v;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;划分重链并生成DFS序&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;核心逻辑&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DFS序分配 (&lt;code&gt;tid[]&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;每个节点被访问时获得一个唯一的DFS序编号&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键技巧&lt;/strong&gt;：先递归&lt;strong&gt;重儿子&lt;/strong&gt;，保证同一条重链上的节点编号连续&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重链划分 (&lt;code&gt;top[]&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;tp&lt;/code&gt; 参数表示当前重链的顶端节点&lt;/li&gt;
&lt;li&gt;重儿子继承父亲的链顶 (&lt;code&gt;dfs2(son[x], tp)&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;轻儿子自己成为新链的顶端 (&lt;code&gt;dfs2(轻儿子, 轻儿子)&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;具体步骤：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void dfs2(int x, int tp)
{
    tid[x] = ++tidnum;
    pos[tid[x]] = x; // 反向映射，用于通过DFS序来查找节点
    top[x] = tp; // 标记链顶

    // 叶子节点特判
    if (!son[x]) return;
    dfs2(son[x], tp); // 先对重儿子进行DFS保证DFS序的顺序

    // 对轻节点进行遍历：
    // - 遍历所有节点
    // - 判断是否是重节点：
    // ├── 不是：DFS并以它本身作为链顶
    // └── 是：跳过
    for (int i = head[x]; i; i = edge[x].next)
    {
        int v = edge[i].to;
        if (v != son[x] and v != father[x]) // 注意：无向边需特判父节点
        {
           	dfs2(v, v);
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;附：链式前行星代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;// 链式前向星
struct Node {
    int to, next;
//  int w; //权重
} edge[maxn &amp;lt;&amp;lt; 2]; // 边翻四倍

addedge(int u, int v)
{
    edge[++cnt] = {v, head[u]};
    head[u] = cnt;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Linux入门：安装系统</title><link>https://www.zhx-blog.top/posts/2025-08-25-linux%E5%85%A5%E9%97%A8%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-08-25-linux%E5%85%A5%E9%97%A8%E5%AE%89%E8%A3%85%E7%B3%BB%E7%BB%9F/</guid><pubDate>Mon, 25 Aug 2025 17:21:31 GMT</pubDate><content:encoded>&lt;h1&gt;Linux系统的安装&lt;/h1&gt;
&lt;h2&gt;1. 系统的选择&lt;/h2&gt;
&lt;p&gt;Linux发展了几十年，到今天已经诞生了上百种发行版
&lt;img src=&quot;https://www.zhx-blog.top/usr/uploads/2025/08/2567349419.jpg&quot; alt=&quot;&quot; /&gt;
我个人建议新手使用Ubnutu系的发行版（或debian系），软件源十分丰富，而且入手难度低；&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;当然，国产系统也是不错的选择，比如Deppin、统信USO&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里以Ubuntu系的LinuxMint为例来演示，这也是我现在正在使用的发行版。&lt;/p&gt;
&lt;h2&gt;下载ISO镜像文件&lt;/h2&gt;
&lt;p&gt;访问&lt;a href=&quot;https://www.linuxmint.com/&quot;&gt;LinuxMint官网&lt;/a&gt;（或其他发行版官网）&lt;a href=&quot;https://mirrors.aliyun.com/linuxmint/stable/22.1/linuxmint-22.1-cinnamon-64bit.iso&quot;&gt;下载ISO系统镜像&lt;/a&gt;，里面有很多镜像地址，如alibaba的。&lt;/p&gt;
&lt;h2&gt;制作启动盘&lt;/h2&gt;
&lt;p&gt;目前启动盘制作主要可以用以下几种方法（都要准备一个至少8G的U盘）：&lt;/p&gt;
&lt;h3&gt;方法1：将文件写入U盘中&lt;/h3&gt;
&lt;p&gt;优点：&lt;s&gt;历史悠久&lt;/s&gt;，稳定；
缺点：每次制作都要格式化U盘，且只能同时制作1张&lt;/p&gt;
&lt;h3&gt;方法2：使用Ventoy&lt;/h3&gt;
&lt;p&gt;Ventoy只需要在U盘中放入镜像文件（放进去就行）即可作为启动盘，可以一次放入多个系统镜像，也可以放入杂七杂八的文件。&lt;s&gt;建议使用64G以上的U盘（最低8G不影响）因为以后你可能像我一样放七八个镜像文件、一包安装包和一堆备份文件&lt;/s&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：请确保U盘容量正常不虚标，否则制作将失败&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;首先前往&lt;a href=&quot;https://www.ventoy.net/cn/&quot;&gt;官网&lt;/a&gt;下载相应系统最新版本的&lt;strong&gt;Ventoy&lt;/strong&gt;，插入U盘，正对电脑启动方式选择对应的分区类型。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;简单来说，&lt;strong&gt;你无法在MBR磁盘上安装UEFI模式的操作系统，也无法在GPT磁盘上安装传统的BIOS模式操作系统。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以如果待重装系统的电脑&lt;strong&gt;是UEFI模式&lt;/strong&gt;，则需要选择&lt;strong&gt;GPT类型&lt;/strong&gt;，反之则选择&lt;strong&gt;MBR类型&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;一般来讲，新电脑一般是UEFI模式的。&lt;/p&gt;
&lt;p&gt;插入U盘后&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.zhx-blog.top/usr/uploads/2025/08/1656605217.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;设备&lt;/code&gt;中选择到你的U盘，点击安装（确认U盘内没有重要文件），就会&lt;strong&gt;格式化U盘&lt;/strong&gt;并安装Ventoy到你的U盘上。此时会创建两个分区，&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.zhx-blog.top/usr/uploads/2025/08/2781680088.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其中Ventoy用于放置你的ISO文件或其他需要存储的文件，VTOYEFI则是引导电脑寻找文件的分区。安装好并放入刚才下载的ISO文件后，重启电脑至&lt;strong&gt;启动设备菜单&lt;/strong&gt;（需要按下特殊按键。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;常见的按键有哪些？（需要快速连按）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;最常见的是 &lt;code&gt;F12&lt;/code&gt; 和 &lt;code&gt;Esc&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;华硕 (ASUS)&lt;/strong&gt;：&lt;code&gt;F8&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;技嘉 (GIGABYTE)&lt;/strong&gt;：&lt;code&gt;F12&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;微星 (MSI)&lt;/strong&gt;：&lt;code&gt;F11&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;联想 (Lenovo)&lt;/strong&gt;：&lt;code&gt;F12&lt;/code&gt; 或 笔记本侧的 &lt;strong&gt;Novo键&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;戴尔 (Dell)&lt;/strong&gt;：&lt;code&gt;F12&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;惠普 (HP)&lt;/strong&gt;：&lt;code&gt;F9&lt;/code&gt; 或 &lt;code&gt;Esc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;宏碁 (Acer)&lt;/strong&gt;：&lt;code&gt;F12&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;三星 (Samsung)&lt;/strong&gt;：&lt;code&gt;Esc&lt;/code&gt; 或 &lt;code&gt;F2&lt;/code&gt;、&lt;code&gt;F10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Surface&lt;/strong&gt;：按住 &lt;strong&gt;音量减键&lt;/strong&gt; 再按一下电源键&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;随后选择通过你的U盘启动。随后你会打开一个体验LinuxMint的界面，双击运行桌面上的引导程序，你就可以根据提示与选项安装系统了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：&lt;/p&gt;
&lt;p&gt;安装后可能出现无法联网的现象，这是因为驱动缺失，建议使用网线/蓝牙先暂时连接网络，等按照&lt;strong&gt;欢迎画面&lt;/strong&gt;的提示把&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.zhx-blog.top/usr/uploads/2025/08/235085004.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;驱动和软件更新安装好就行了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;常用软件推荐：&lt;/h2&gt;
&lt;p&gt;首先可以安装&lt;strong&gt;QQ&lt;/strong&gt;和&lt;strong&gt;微信&lt;/strong&gt;，使用Firefox搜索进入官网下载即可。建议下载AppImage包，这个给到运行后即可直接使用，卸载只需将该文件删除；&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 进入下载目录
cd Downloads/
# 授予执行权限
chmod +x QQ_*.AppImage # 换成实际文件名
# 或者使用通配符
chmod +x *.AppImage
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或下载.deb安装包&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 建议使用apt安装，避免依赖问题
sudo apt install ./QQ_*.deb # 一定要加上`./`，告诉apt于本地寻找文件而非在线查找
# 或者使用dpkg，最原始的方式
sudo dpkg -i QQ_*.deb # `./`加不加皆可
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;其他系统自行搜索教程&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;其他生产力工具：&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;markdown编辑器&lt;/strong&gt;：Typora&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install typora
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;代码编辑器&lt;/strong&gt;：sublime text&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install sublime-text
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;修图软件&lt;/strong&gt;：GIMP（Linux上的PS）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install gimp
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;游戏推荐&lt;/h3&gt;
&lt;p&gt;**经典中的经典：**steam&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install steam
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;吉祥物Tux&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install supertux
sudo apt install supertuxkart
sudo apt install extremetuxracer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;**开元RTS：**Warzone2100&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install warzone2100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;剩下的你们就自行探索啦！&lt;/p&gt;
</content:encoded></item><item><title>入门：C++的位运算</title><link>https://www.zhx-blog.top/posts/2025-08-24-%E5%85%A5%E9%97%A8c%E7%9A%84%E4%BD%8D%E8%BF%90%E7%AE%97/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-08-24-%E5%85%A5%E9%97%A8c%E7%9A%84%E4%BD%8D%E8%BF%90%E7%AE%97/</guid><description>关于C++程序设计语言的位运算内容的简要介绍</description><pubDate>Mon, 25 Aug 2025 15:03:09 GMT</pubDate><content:encoded>&lt;h1&gt;Ｃ++的位运算&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;作者为蒟蒻高中牲，若有不妥之处请多多包含，并望于评论区指正，不胜感激！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ｃ++中有&lt;strong&gt;6种位运算符&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;amp;&lt;/code&gt;: 与&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1 &amp;amp; 1 = 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1 &amp;amp; 0 = 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;0 &amp;amp; 0 = 0&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;|&lt;/code&gt;: 或&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1 | 1 = 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1 | 0 = 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;0 | 0 = 0&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;~&lt;/code&gt;: 非&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~ 1 = 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;~ 0 = 1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;^&lt;/code&gt;: 异或&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1 ^ 1 = 1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;1 ^ 0 = 0&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;0 ^ 0 = 1&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;: 左移&lt;/p&gt;
&lt;p&gt;$1 &amp;lt;&amp;lt; 1 = 10_２$&lt;/p&gt;
&lt;p&gt;$1 &amp;lt;&amp;lt; 2 = 100_2$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;: 右移&lt;/p&gt;
&lt;p&gt;$11_2 &amp;gt;&amp;gt; 1 = 110_2$&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>入门：链表</title><link>https://www.zhx-blog.top/posts/2025-08-24-%E5%85%A5%E9%97%A8%E9%93%BE%E8%A1%A8/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-08-24-%E5%85%A5%E9%97%A8%E9%93%BE%E8%A1%A8/</guid><description>关于链表数据结构的介绍</description><pubDate>Mon, 25 Aug 2025 15:00:34 GMT</pubDate><content:encoded>&lt;h1&gt;链表&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;作者为蒟蒻高中牲，若有不妥之处请多多包含，并望于评论区指正，不胜感激！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;链表是一种动态的数据结构，每一个节点存储两个数据：&lt;code&gt;data&lt;/code&gt;和&lt;code&gt;next&lt;/code&gt;。&lt;code&gt;data&lt;/code&gt;是数据，&lt;code&gt;next&lt;/code&gt;是下一个节点的地址。&lt;/p&gt;
&lt;p&gt;链表经常是首尾相接的。&lt;/p&gt;
&lt;p&gt;算法竞赛中，链表常用STL 中的&lt;code&gt;list&lt;/code&gt;而非手写，以节约时间。&lt;/p&gt;
&lt;p&gt;这里给到&lt;a href=&quot;https://www.luogu.com.cn/problem/P1996&quot;&gt;Luogu P1996&lt;/a&gt;的题解示范&lt;code&gt;list&lt;/code&gt;的用法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

int main() {
    int n, m;  cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m;
    list&amp;lt;int&amp;gt; node;

    for (int i = 1; i &amp;lt;= n; ++i) node.push_back(i); // 建立列表
    list&amp;lt;int&amp;gt;::iterator it = node.begin(); // 创建迭代器
    while (node.size() &amp;gt; 1) {
        for (int i = 1; i &amp;lt; m; i++) {
            it++;
            if (it == node.end()) it = node.begin();
        }
        cout &amp;lt;&amp;lt; *it &amp;lt;&amp;lt; &quot; &quot;;
        list&amp;lt;int&amp;gt;::iterator next = ++it;
        if (next == node.end()) next = node.begin();
        node.erase(--it);
        it = next;
    }
    cout &amp;lt;&amp;lt; *it;
    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>C++中二叉树的前序、中序、后序、层序遍历</title><link>https://www.zhx-blog.top/posts/2025-08-24-c%E4%B8%AD%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%89%8D%E5%BA%8F%E4%B8%AD%E5%BA%8F%E5%90%8E%E5%BA%8F%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-08-24-c%E4%B8%AD%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%89%8D%E5%BA%8F%E4%B8%AD%E5%BA%8F%E5%90%8E%E5%BA%8F%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86/</guid><pubDate>Sun, 24 Aug 2025 19:36:00 GMT</pubDate><content:encoded>&lt;h1&gt;二叉树的遍历&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;作者为蒟蒻高中牲，若有不妥之处请多多包含，并望于评论区指正，不胜感激！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;什么是二叉树&lt;/h2&gt;
&lt;p&gt;二叉树是一个&lt;strong&gt;为空&lt;/strong&gt;或者&lt;strong&gt;由不相交的左子树、右子树和根节点&lt;/strong&gt;组成的集合。其中左右子树也为二叉树。&lt;/p&gt;
&lt;p&gt;例如，这是一个二叉树：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
    A[A] --&amp;gt; B[B]
    A --&amp;gt; C[C]
    B --&amp;gt; D[D]
    B --&amp;gt; E[E]
    C --&amp;gt; F[F]
    C --&amp;gt; G[ ]
    style G fill:none, stroke:none
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而这也是一个二叉树（已经退化成一条链了）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
A[1] --&amp;gt; B[2]
A --&amp;gt; None1[ ]
B --&amp;gt; C[3]
B --&amp;gt; None2[ ]
C --&amp;gt; D[4]
C --&amp;gt; None3[ ]
style None1 fill: none, stroke: none
style None2 fill: none, stroke: none
style None3 fill: none, stroke: none
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;左右子树为空集节点叫做叶子节点。&lt;/p&gt;
&lt;p&gt;每一层被填满的二叉树叫做&lt;strong&gt;完美二叉树（满二叉树）&lt;/strong&gt;。按照从上到下、从左到右的顺序编号，只有最后一层缺失、且缺失的编号都在最后在的二叉树叫做&lt;strong&gt;完全二叉树&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;如何存储&lt;/h3&gt;
&lt;h4&gt;(1 动态存储&lt;/h4&gt;
&lt;p&gt;数据结构中一般这样定义二叉树：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;struct Node {
	int value; // 节点的值，可以不止一个
    node *lson, *rson; // 指向左右子节点
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;动态新建一个&lt;code&gt;Node&lt;/code&gt;时，使用&lt;code&gt;new&lt;/code&gt;运算符动态申请一个。使用完毕记得使用&lt;code&gt;delete&lt;/code&gt;命令释放防止内存泄漏。&lt;/p&gt;
&lt;p&gt;动态二叉树的优点是不浪费空间，缺点是需要管理，容易出错。&lt;/p&gt;
&lt;h4&gt;(2 使用静态数组存储&lt;/h4&gt;
&lt;p&gt;比赛中一般使用这种方法，编码比较简单。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;struct Node {
    int value;
    int lson, rson; // 子节点在数组中的编号
} tree[N];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;特别地，可以使用单独的一个静态数组实现完全二叉树的存储&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;二叉树的各种遍历&lt;/h2&gt;
&lt;p&gt;常见遍历二叉树的方式有一下几种，我以以下树展示&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;flowchart TD
1 --&amp;gt; 2
1 --&amp;gt; 3
2 --&amp;gt; 4
2 --&amp;gt; 5
3 --&amp;gt; 6
3 --&amp;gt; 01[ ]
4 --&amp;gt; 7
4 --&amp;gt; 8
5 --&amp;gt; 02[ ]
5 --&amp;gt; 9
style 01 fill: none
style 02 fill: none
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;先序遍历&lt;/h3&gt;
&lt;p&gt;按照&lt;code&gt;根节点 -&amp;gt; 左子树 -&amp;gt; 右子树&lt;/code&gt;的顺序遍历。这颗树的先序遍历是&lt;code&gt;1 2 4 7 8 5 9 3 6&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void preorder(Node root) {
    cout &amp;lt;&amp;lt; root.value &amp;lt;&amp;lt; &apos; &apos;;
    if (root.lson)
	    preorder(tree[root.lson]);
    if (root.rson)
	    preorder(tree[root.rson]);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;中序遍历&lt;/h3&gt;
&lt;p&gt;按照&lt;code&gt;左子树 -&amp;gt; 根节点 -&amp;gt; 右子树&lt;/code&gt;的顺序遍历。这颗树的中序遍历是&lt;code&gt;7 4 8 2 5 9 1 6 3&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void inorder(Node root) {
    if (root.lson)
	    inorder(tree[root.lson]);
    cout &amp;lt;&amp;lt; root.value &amp;lt;&amp;lt; &apos; &apos;;
    if (root.rson)
	    inorder(tree[root.rson]);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;后序遍历&lt;/h3&gt;
&lt;p&gt;按照&lt;code&gt;左子树 -&amp;gt; 右子树 -&amp;gt; 根节点&lt;/code&gt;的顺序遍历。这颗树的后序遍历是&lt;code&gt;7 8 4 9 5 2 6 3 1&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void postorder(Node root) {
    if (root.lson)
	    postorder(tree[root.lson]);
    if (root.rson)
	    postorder(tree[root.rson]);
    cout &amp;lt;&amp;lt; root.value &amp;lt;&amp;lt; &apos; &apos;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;层序遍历&lt;/h3&gt;
&lt;p&gt;顾名思义，层序遍历即从上到下一层一层地遍历节点。&lt;/p&gt;
&lt;p&gt;前面集中遍历方式都使用的DFS（深度优先搜索），层序遍历建议使用&lt;strong&gt;BFS&lt;/strong&gt;（广度优先搜索）。&lt;/p&gt;
&lt;p&gt;这颗树的层序遍历是&lt;code&gt;1 2 3 4 5 6 7 8 9&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;void bfs(Node root) {
    queue&amp;lt;Node&amp;gt; Q;
    Q.push(root);

    while (!Q.empty()) {
        Node node = Q.front();
        Q.pop();
        cout &amp;lt;&amp;lt; node.value &amp;lt;&amp;lt; &apos; &apos;;

        if (node.lson)
            Q.push(tree[node.lson]);
        if (node.rson)
            Q.push(tree[node.rson]);
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;总结一下，可以是这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include &quot;bits/stdc++.h&quot;
using namespace std;

const int N = 100010; // 数组大小，根据需求调整

struct Node {
    int value;    // 节点值
    int lson;     // 左子节点索引，0表示空
    int rson;     // 右子节点索引，0表示空
} tree[N];

int idx = 1; // 当前可用的节点索引，从1开始（0表示空节点）
unordered_map&amp;lt;int, int&amp;gt; val_to_idx; // 值到索引的映射
int n;


// 创建新节点（如果已存在则返回现有索引）
int create(int value) {
    if (val_to_idx.count(value)) {
        return val_to_idx[value];
    }
    tree[idx] = {value, 0, 0};
    val_to_idx[value] = idx;
    return idx++;
}

// 构建二叉树
void build(int n) {
    for (int i = 0; i &amp;lt; n; i++) {
        int root_val, l_val, r_val;
        cin &amp;gt;&amp;gt; root_val &amp;gt;&amp;gt; l_val &amp;gt;&amp;gt; r_val;

        int root_idx = create(root_val);

        if (l_val != 0) {
            int l_idx = create(l_val);
            tree[root_idx].lson = l_idx;
        }

        if (r_val != 0) {
            int r_idx = create(r_val);
            tree[root_idx].rson = r_idx;
        }
    }
}

void preorder(Node root) {
    cout &amp;lt;&amp;lt; root.value &amp;lt;&amp;lt; &apos; &apos;;

    if (root.lson)
        preorder(tree[root.lson]);
    if (root.rson)
        preorder(tree[root.rson]);
}

void inorder(Node root) {
    if (root.lson)
        inorder(tree[root.lson]);

    cout &amp;lt;&amp;lt; root.value &amp;lt;&amp;lt; &apos; &apos;;

    if (root.rson)
        inorder(tree[root.rson]);
}

void postorder(Node root) {
    if (root.lson)
        postorder(tree[root.lson]);
    if (root.rson)
        postorder(tree[root.rson]);

    cout &amp;lt;&amp;lt; root.value &amp;lt;&amp;lt; &apos; &apos;;
}

void bfs(Node root) {
    queue&amp;lt;Node&amp;gt; Q;
    Q.push(root);

    while (!Q.empty()) {
        Node node = Q.front();
        Q.pop();
        cout &amp;lt;&amp;lt; node.value &amp;lt;&amp;lt; &apos; &apos;;

        if (node.lson)
            Q.push(tree[node.lson]);
        if (node.rson)
            Q.push(tree[node.rson]);
    }
}

// 查找根节点（没有父节点的节点）
int find_root() {
    // 标记所有出现的节点
    vector&amp;lt;bool&amp;gt; has_parent(idx + 1, false);

    for (int i = 1; i &amp;lt; idx; i++) { // 对于节点i，它的子节点一定有父节点
        if (tree[i].lson != 0) {
            has_parent[tree[i].lson] = true;
        }
        if (tree[i].rson != 0) {
            has_parent[tree[i].rson] = true;
        }
    }

    // 找到没有父节点的节点（根节点）
    for (int i = 1; i &amp;lt; idx; i++) {
        if (!has_parent[i]) {
            return i;
        }
    }
    return 1; // 默认返回第一个节点
}

int main() {
    cin &amp;gt;&amp;gt; n;

    build(n);

    int root = find_root();

    cout &amp;lt;&amp;lt; &quot;先序遍历:&quot; &amp;lt;&amp;lt; endl;
    preorder(tree[root]);
    cout &amp;lt;&amp;lt; &apos;\n&apos;;
    cout &amp;lt;&amp;lt; &quot;中序遍历:&quot; &amp;lt;&amp;lt; endl;
    inorder(tree[root]);
    cout &amp;lt;&amp;lt; &apos;\n&apos;;
    cout &amp;lt;&amp;lt; &quot;后序遍历:&quot; &amp;lt;&amp;lt; endl;
    postorder(tree[root]);
    cout &amp;lt;&amp;lt; &apos;\n&apos;;
    cout &amp;lt;&amp;lt; &quot;层序遍历:&quot; &amp;lt;&amp;lt; endl;
    bfs(tree[root]);

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;输入格式：&lt;/p&gt;
&lt;p&gt;第1行一个数&lt;code&gt;n&lt;/code&gt;代表节点个数&lt;/p&gt;
&lt;p&gt;第2至n+1行三个数root, l, r，代表根节点、左右子节点的值&lt;/p&gt;
&lt;p&gt;输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;9
1 2 3
2 4 5
3 6 0
4 7 8
5 0 9
6 0 0
7 0 0
8 0 0
9 0 0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;先序遍历:
1 2 4 7 8 5 9 3 6
中序遍历:
7 4 8 2 5 9 1 6 3
后序遍历:
7 8 4 9 5 2 6 3 1
层序遍历:
1 2 3 4 5 6 7 8 9
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;改进建议：&lt;/p&gt;
&lt;p&gt;这里传递的参数都是&lt;code&gt;Node&lt;/code&gt;类型的，导致调用一次就复制一遍&lt;code&gt;Node&lt;/code&gt;，效率不如&lt;code&gt;int&lt;/code&gt;高。请尝试修改代码，传递索引为参数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3&gt;如何根据先序遍历、中序遍历求后序遍历，或根据后序遍历、中序遍历求先序遍历？&lt;/h3&gt;
&lt;h4&gt;核心思想：&lt;/h4&gt;
&lt;p&gt;所有方法都基于二叉树遍历的一个&lt;strong&gt;核心性质&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先序遍历 (Preorder)&lt;/strong&gt;：&lt;code&gt;[根节点]&lt;/code&gt; + &lt;code&gt;[左子树的先序遍历]&lt;/code&gt; + &lt;code&gt;[右子树的先序遍历]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中序遍历 (Inorder)&lt;/strong&gt;：&lt;code&gt;[左子树的中序遍历]&lt;/code&gt; + &lt;code&gt;[根节点]&lt;/code&gt; + &lt;code&gt;[右子树的中序遍历]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;后序遍历 (Postorder)&lt;/strong&gt;：&lt;code&gt;[左子树的后序遍历]&lt;/code&gt; + &lt;code&gt;[右子树的后序遍历]&lt;/code&gt; + &lt;code&gt;[根节点]&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;解决问题的关键是：&lt;strong&gt;利用“根节点”在中序遍历中的位置，将序列划分为左子树和右子树，然后递归地处理这些子树。&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;由此也可以看出：想要根据两种方式的遍历结果求树/另一种遍历，必须要有&lt;strong&gt;中序遍历&lt;/strong&gt;，因为只有中序遍历才能把左右子树划分开来。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;问题一：根据先序遍历和中序遍历求后序遍历&lt;/h4&gt;
&lt;h5&gt;&lt;strong&gt;步骤（递归方法）：&lt;/strong&gt;&lt;/h5&gt;
&lt;ol&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;ul&gt;
&lt;li&gt;根节点左边的所有元素：&lt;strong&gt;左子树&lt;/strong&gt;的中序遍历&lt;/li&gt;
&lt;li&gt;根节点&lt;/li&gt;
&lt;li&gt;根节点右边的所有元素：&lt;strong&gt;右子树&lt;/strong&gt;的中序遍历&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算左右子树的大小&lt;/strong&gt;：根据上一步分割的结果，可以确定左子树和右子树分别包含的节点个数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;递归构建左右子树&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;左子树的先序遍历&lt;/strong&gt;：从原始先序序列中，跳过第一个根节点，取紧接着的 &lt;code&gt;左子树节点个数&lt;/code&gt; 个元素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右子树的先序遍历&lt;/strong&gt;：先序序列中剩下的部分。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;递归处理&lt;/strong&gt;：对左子树和右子树分别递归地重复步骤 1-4。&lt;/li&gt;
&lt;li&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;左子树后序 + 右子树后序 + 根&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;问题二：根据后序遍历和中序遍历求先序遍历&lt;/h4&gt;
&lt;h5&gt;&lt;strong&gt;步骤（递归方法）：&lt;/strong&gt;&lt;/h5&gt;
&lt;p&gt;这个方法与前一个非常对称。&lt;/p&gt;
&lt;ol&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;ul&gt;
&lt;li&gt;&lt;strong&gt;左子树&lt;/strong&gt;的中序遍历&lt;/li&gt;
&lt;li&gt;根节点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右子树&lt;/strong&gt;的中序遍历&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;计算左右子树的大小&lt;/strong&gt;：根据分割结果确定左右子树的节点个数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;递归构建左右子树&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;左子树的后序遍历&lt;/strong&gt;：从原始后序序列中，从开头取 &lt;code&gt;左子树节点个数&lt;/code&gt; 个元素。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右子树的后序遍历&lt;/strong&gt;：后序序列中紧接着的 &lt;code&gt;右子树节点个数&lt;/code&gt; 个元素（最后一个根节点之前的那些元素）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;递归处理&lt;/strong&gt;：对左子树和右子树分别递归地重复步骤 1-4。&lt;/li&gt;
&lt;li&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;根 + 左子树先序 + 右子树先序&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;C++代码：&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

vector&amp;lt;int&amp;gt; preInToPost(vector&amp;lt;int&amp;gt;&amp;amp; pre, vector&amp;lt;int&amp;gt;&amp;amp; in,
    int preStart, int preEnd,
    int inStart, int inEnd,
    unordered_map&amp;lt;int, int&amp;gt;&amp;amp; inMap)
{
    if (preStart &amp;gt; preEnd) return {};

    int rootVal = pre[preStart];
    int rootIndex = inMap[rootVal];
    int leftSize = rootIndex - inStart;


    vector&amp;lt;int&amp;gt; leftPost = preInToPost(pre, in,
        preStart + 1, preStart + leftSize,
        inStart, rootIndex - 1, inMap);

    vector&amp;lt;int&amp;gt; rightPost = preInToPost(pre, in,
        preStart + leftSize + 1, preEnd,
        rootIndex + 1, inEnd, inMap);

    // 组合结果：左子树后序 + 右子树后序 + 根
    vector&amp;lt;int&amp;gt; result;
    result.insert(result.end(), leftPost.begin(), leftPost.end());
    result.insert(result.end(), rightPost.begin(), rightPost.end());
    result.push_back(rootVal);

    return result;
}

vector&amp;lt;int&amp;gt; postInToPre(vector&amp;lt;int&amp;gt;&amp;amp; post, vector&amp;lt;int&amp;gt;&amp;amp; in,
    int postStart, int postEnd,
    int inStart, int inEnd,
    unordered_map&amp;lt;int, int&amp;gt;&amp;amp; inMap)
{
    if (postStart &amp;gt; postEnd) return {};

    int rootVal = post[postEnd];
    int rootIndex = inMap[rootVal];
    int leftSize = rootIndex - inStart;

    vector&amp;lt;int&amp;gt; leftPre = postInToPre(post, in,
        postStart, postStart + leftSize - 1,
        inStart, rootIndex - 1, inMap);

    vector&amp;lt;int&amp;gt; rightPre = postInToPre(post, in,
        postStart + leftSize, postEnd - 1,
        rootIndex + 1, inEnd, inMap);

    // 组合结果：根 + 左子树先序 + 右子树先序
    vector&amp;lt;int&amp;gt; result;
    result.push_back(rootVal);
    result.insert(result.end(), leftPre.begin(), leftPre.end());
    result.insert(result.end(), rightPre.begin(), rightPre.end());

    return result;
}

int main() {
    int n;

    // 读取树1的先序和中序遍历
    cin &amp;gt;&amp;gt; n;
    vector&amp;lt;int&amp;gt; pre1(n), in1(n);
    for (int i = 0; i &amp;lt; n; i++) cin &amp;gt;&amp;gt; pre1[i];
    for (int i = 0; i &amp;lt; n; i++) cin &amp;gt;&amp;gt; in1[i];

    // 读取树2的后序和中序遍历
    cin &amp;gt;&amp;gt; n;
    vector&amp;lt;int&amp;gt; post2(n), in2(n);
    for (int i = 0; i &amp;lt; n; i++) cin &amp;gt;&amp;gt; post2[i];
    for (int i = 0; i &amp;lt; n; i++) cin &amp;gt;&amp;gt; in2[i];

    // 创建中序遍历值的索引映射（加速查找）
    unordered_map&amp;lt;int, int&amp;gt; inMap1, inMap2;
    for (int i = 0; i &amp;lt; (int)in1.size(); i++) inMap1[in1[i]] = i;
    for (int i = 0; i &amp;lt; (int)in2.size(); i++) inMap2[in2[i]] = i;

    // 计算树1的后序遍历
    vector&amp;lt;int&amp;gt; post1 = preInToPost(pre1, in1, 0, pre1.size()-1, 0, in1.size()-1, inMap1);

    // 计算树2的先序遍历
    vector&amp;lt;int&amp;gt; pre2 = postInToPre(post2, in2, 0, post2.size()-1, 0, in2.size()-1, inMap2);

    // 输出结果
    for (int i = 0; i &amp;lt; (int)post1.size(); i++) {
        if (i &amp;gt; 0) cout &amp;lt;&amp;lt; &quot; &quot;;
        cout &amp;lt;&amp;lt; post1[i];
    }
    cout &amp;lt;&amp;lt; endl;

    for (int i = 0; i &amp;lt; (int)pre2.size(); i++) {
        if (i &amp;gt; 0) cout &amp;lt;&amp;lt; &quot; &quot;;
        cout &amp;lt;&amp;lt; pre2[i];
    }
    cout &amp;lt;&amp;lt; endl;

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;输入格式：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一行：树1的节点数n&lt;/li&gt;
&lt;li&gt;接下来n行：树1的先序遍历&lt;/li&gt;
&lt;li&gt;接下来n行：树1的中序遍历&lt;/li&gt;
&lt;li&gt;下一行：树2的节点数n&lt;/li&gt;
&lt;li&gt;接下来n行：树2的后序遍历&lt;/li&gt;
&lt;li&gt;接下来n行：树2的中序遍历&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;输出格式：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一行：树1的后序遍历（空格分隔）&lt;/li&gt;
&lt;li&gt;第二行：树2的先序遍历（空格分隔）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;示例输入：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;7
1 2 4 5 3 6 7
4 2 5 1 6 3 7
7
4 5 2 6 7 3 1
4 2 5 1 6 3 7
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;示例输出：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;4 5 2 6 7 3 1
1 2 4 5 3 6 7
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>入门：计算机的基本构成</title><link>https://www.zhx-blog.top/posts/2025-08-24-%E5%85%A5%E9%97%A8%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%9E%84%E6%88%90/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-08-24-%E5%85%A5%E9%97%A8%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%9A%84%E5%9F%BA%E6%9C%AC%E6%9E%84%E6%88%90/</guid><pubDate>Sun, 24 Aug 2025 16:37:00 GMT</pubDate><content:encoded>&lt;h1&gt;计算机的构成&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;作者为蒟蒻高中牲，若有不妥之处请多多包含，并望于评论区指正，不胜感激！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;计算机由&lt;strong&gt;软件&lt;/strong&gt;和&lt;strong&gt;硬件&lt;/strong&gt;构成。&lt;/p&gt;
&lt;p&gt;-　硬件是指看得见摸得着的各种电子元器件。如主机、键盘、鼠标等。-　软件看不见摸不着，但在逻辑上，我们确实可以感知到它的存在，它由人们事先编制的具有某种功能的程序组成。比如操作系统、编程语言等。&lt;/p&gt;
&lt;p&gt;计算机的软件通常又分为：&lt;strong&gt;系统软件和应用软件&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统软件：又称为系统程序，主要用来管理整个计算机系统，监视服务，使系统资源得到合理调度。它包括：操作系统、语言处理程序、数据库管理系统、网络软件、服务程序等。&lt;/li&gt;
&lt;li&gt;应用软件：又称为应用程序，它是用户根据需要事先编制的程序。比如 QQ、微信等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;硬件系统&lt;/h2&gt;
&lt;p&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;strong&gt;中央处理器&lt;/strong&gt;（Central Processing Unit，CPU）。&lt;/p&gt;
&lt;p&gt;存储器已成为多级存储器体系，包含主存、高速缓存和外存三个层次。&lt;/p&gt;
&lt;h2&gt;软件系统&lt;/h2&gt;
&lt;p&gt;软件类别：&lt;strong&gt;系统软件&lt;/strong&gt;和&lt;strong&gt;应用软件&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统软件：又称为系统程序，主要用来管理整个计算机系统，监视服务，使系统资源得到合理调度。它包括：操作系统、语言处理程序、数据库管理系统、网络软件、服务程序等。&lt;/li&gt;
&lt;li&gt;应用软件：又称为应用程序，它是用户根据需要事先编制的程序。比如 QQ、微信等。&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>你们玩过“开源游戏”吗？开源即时策略游戏——战地2100游玩体验</title><link>https://www.zhx-blog.top/posts/2025-08-17-%E4%BD%A0%E4%BB%AC%E7%8E%A9%E8%BF%87%E5%BC%80%E6%BA%90%E6%B8%B8%E6%88%8F%E5%90%97%E5%BC%80%E6%BA%90%E5%8D%B3%E6%97%B6%E7%AD%96%E7%95%A5%E6%B8%B8%E6%88%8F%E6%88%98%E5%9C%B02100%E6%B8%B8%E7%8E%A9%E4%BD%93%E9%AA%8C/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-08-17-%E4%BD%A0%E4%BB%AC%E7%8E%A9%E8%BF%87%E5%BC%80%E6%BA%90%E6%B8%B8%E6%88%8F%E5%90%97%E5%BC%80%E6%BA%90%E5%8D%B3%E6%97%B6%E7%AD%96%E7%95%A5%E6%B8%B8%E6%88%8F%E6%88%98%E5%9C%B02100%E6%B8%B8%E7%8E%A9%E4%BD%93%E9%AA%8C/</guid><description>简要地介绍了一下最近发现的开源RTS游戏Warzone 2100</description><pubDate>Sun, 17 Aug 2025 15:28:00 GMT</pubDate><content:encoded>&lt;h1&gt;战地2100游玩体验&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;作者为蒟蒻高中牲，若有不妥之处请多多包含，并望于评论区指正，不胜感激！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;最近看小说，突然对即时战略游戏产生了&lt;strong&gt;强烈的冲动&lt;/strong&gt;。但是在Linux上，想找点好玩的却不容易，因为例如红警等都是闭源软件，一般很少有对Linux的支持；而且一般都依托于Steam或者GOG Game进行售卖。尽管wine或者Proton等软件让Linux游玩Windows游戏没那么困难，但是闭源在Linux社区绝对不算是良好的选择。所以我盯上了&lt;a href=&quot;https://wz2100.net/zh-cn/&quot;&gt;Warzone 2100（战地2100）&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;游戏介绍&lt;/h2&gt;
&lt;p&gt;据官网描述，这个游戏是1999年发行的，后来在2000年1月官方结束了支持。而在2004年，粉丝们请愿工作室能开放源代码，从此Warzone就走上了开源软件的道路。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;历史悠久
由南瓜工作室开发于90年代。 2004年独立。&lt;/p&gt;
&lt;p&gt;2100 Warzone 最初由南瓜工作室开发，由Eidos Interactivity发行。 1999年，在微软的Windows和索尼的PlayStation上投放了该产品。 南瓜工作室于2000年1月5日结束了对 Warzone 2100 的支持。&lt;/p&gt;
&lt;p&gt;2004年，在粉丝们请愿后，根据开放源码许可证公开发布了 Warzone 的源码。 自那时以来，在“Warzone 2100”项目的旗帜下，该项目一直得到社区的开发、维护和改进。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这款游戏是一款&lt;strong&gt;即时战略游戏&lt;/strong&gt;,支持Windows、MacOS与Linux，可以说是全平台支持了；据官网上是这样介绍的：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;为什么 Warzone 2100 震撼&lt;/p&gt;
&lt;p&gt;设计战略。 无限可重新玩。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;单人战役&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在人类几乎被核弹摧毁之后，指挥武装力量重建世界。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;局域网 / 因特网多玩家&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在本地网络上与您的朋友们玩游戏，或者在一个在线多人游戏大厅中试试手吧。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AI 机器人&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;与AI 机器人进行本地小规模战斗(或在多人游戏中添加为队友/敌人)，在无限重玩中练习你的技能。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;广阔的科技树&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;超过400种不同的科技成就和丰富的科技树路径选择。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;单位设计&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用灵活的设计系统定制你的单位，提供各种可能的单位和战术。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;跨平台&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;支持 Windows，macOS，Linux，FreeBSD 等等，都有跨平台多人游戏支持！&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2&gt;游戏安装&lt;/h2&gt;
&lt;p&gt;Linux上可以直接使用&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install warzone2100
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;来安装，或者从&lt;a href=&quot;https://github.com/Warzone2100/warzone2100&quot;&gt;官方GitHub页面/官网&lt;/a&gt;下载.tar.xz包自行编译安装，在GitHub上都有介绍。&lt;/p&gt;
&lt;p&gt;Windows可以去微软应用商店安装，几十分钟就好了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Warzone 2100
100%免费且开源的3D即时策略游戏。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
在Linux/MacOS版本上，有一个名为&lt;code&gt;sequences.wz&lt;/code&gt;的视频资源包&lt;strong&gt;不会自动下载&lt;/strong&gt;，没有它一些游戏动画、教程、战役等都会加载异常，官网上有下载链接，速度不慢（至少没有某度网盘一样&lt;code&gt;50kb/s&lt;/code&gt;）但要下载好也很费功夫。我这里下好了低质版本(其他版本死活下载失败)，我会放在网盘里开放下载，下载后放到配置目录即可（配置目录位置官网上有）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;使用体验&lt;/h2&gt;
&lt;p&gt;整体来说，除了UI界面有点古老，其他还是很不错的；丰富开放的玩法，局域网联机，精心打磨的背景图片以及昨晚在GitHub上看到的&lt;code&gt;最近提交：10分钟前&lt;/code&gt;给足了我信心——这就是开源产品的魅力。&lt;/p&gt;
&lt;h2&gt;网盘资源地址&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://pan.lansod.cn/s/KMWIB&quot;&gt;视频资源&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pan.lansod.cn/s/rPwHd&quot;&gt;debian安装包&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>尝试解决Edge和Firefox滚动条样式不统一</title><link>https://www.zhx-blog.top/posts/2025-08-16-%E5%B0%9D%E8%AF%95%E8%A7%A3%E5%86%B3edge%E5%92%8Cfirefox%E6%BB%9A%E5%8A%A8%E6%9D%A1%E6%A0%B7%E5%BC%8F%E4%B8%8D%E7%BB%9F%E4%B8%80/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-08-16-%E5%B0%9D%E8%AF%95%E8%A7%A3%E5%86%B3edge%E5%92%8Cfirefox%E6%BB%9A%E5%8A%A8%E6%9D%A1%E6%A0%B7%E5%BC%8F%E4%B8%8D%E7%BB%9F%E4%B8%80/</guid><description>如题，尝试解决Edge和Firefox滚动条样式不统一</description><pubDate>Sat, 16 Aug 2025 14:46:00 GMT</pubDate><content:encoded>&lt;h1&gt;尝试解决Edge和Firefox滚动条样式不统一&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;作者为蒟蒻高中牲，若有不妥之处请多多包含，并望于评论区指正，不胜感激！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;之前在MDN学习CSS时，看到了一些关于滚动条样式的属性&lt;code&gt;scrollbar-width&lt;/code&gt;，想着去观察一下我的网站的滚动条。发现是最初很细，鼠标悬停时变粗，既好看又方便。直到我一不小心在Edge上打开了我的网站，一看这个滚动条：
&lt;img src=&quot;https://49.232.0.197/usr/uploads/2025/08/1544601003.png&quot; alt=&quot;2025-08-16T06:21:12.png&quot; /&gt;
太不好看了！
于是便琢磨把Edge上的调整一下。
网上查到Chromium浏览器都不支持&lt;code&gt;scrollbar-width&lt;/code&gt;，但是查到可以使用非标准的伪元素&lt;code&gt;::-webkit-scrollbar&lt;/code&gt;来自定义滚动条，于是便尝试通过这种方式模拟类似的效果。&lt;/p&gt;
&lt;p&gt;目的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;默认情况下，将滚动条设置为较细。&lt;/li&gt;
&lt;li&gt;当鼠标悬停在滚动条上时，将滚动条变粗。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;首先设置一下滚动条的大小。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::-webkit-scrollbar {
  width: 8px; /* 默认细宽度 */
  height: 8px; /* 水平滚动条高度 */
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;接下来设置滑动条块的样式，&lt;code&gt;background&lt;/code&gt;用灰色填充，&lt;code&gt;border-radius&lt;/code&gt;设置圆角，用&lt;code&gt;border&lt;/code&gt;创建一个一定大小的透明边框实现变细效果。在鼠标悬停时移除就实现了“变粗”。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::-webkit-scrollbar-thumb {
  background: #c1c1c1;
  border-radius: 4px;
  border: 2px solid transparent; /* 创建透明边框 */
  background-clip: padding-box; /* 确保背景不渗透到边框 */
}

::-webkit-scrollbar-thumb:hover {
  background: #a8a8a8;
  border: 0; /* 悬停时移除透明边框实现&quot;变粗&quot;效果 */
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Luogu  P1217 回文质数</title><link>https://www.zhx-blog.top/posts/2025-08-15-luogu__p1217_%E5%9B%9E%E6%96%87%E8%B4%A8%E6%95%B0/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-08-15-luogu__p1217_%E5%9B%9E%E6%96%87%E8%B4%A8%E6%95%B0/</guid><description>洛谷 P1217 题解</description><pubDate>Fri, 15 Aug 2025 11:09:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;a href=&quot;https://www.luogu.com.cn/problem/P1217&quot;&gt;题目传送门&lt;/a&gt;&lt;/h1&gt;
&lt;p&gt;&lt;s&gt;这是一道我弟拿给我做题目，本来想着&amp;lt;span data-v-0294ff43=&quot;&quot; data-v-91367258-s=&quot;&quot;&amp;gt;&amp;lt;span data-v-386007e1=&quot;&quot; style=&quot;background-color: rgb(243, 156, 17); border-color: rgb(202, 137, 32); color: rgb(255, 255, 255);&quot;&amp;gt;普及−&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;应该挺简单的，结果翻车了&lt;/s&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;题目解读&lt;/h2&gt;
&lt;p&gt;本题要求我们找出给定区间内的所有“回文质数”&lt;a href=&quot;%E5%8D%B3%E6%97%A2%E6%98%AF%E5%9B%9E%E6%96%87%E6%95%B0%E5%8F%88%E6%98%AF%E8%B4%A8%E6%95%B0%E7%9A%84%E6%95%B0&quot;&gt;^1&lt;/a&gt;。我一看就想着：先筛质数，再判断是不是回文数~~，结果&lt;strong&gt;大意失荆州&lt;/strong&gt;——开了一个占用4G内存的&lt;code&gt;prime[100000000]&lt;/code&gt;~~于是我终于注意到了题目中的提示：&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2&gt;说明/提示&lt;/h2&gt;
&lt;p&gt;Hint 1: Generate the palindromes and see if they are prime.&lt;/p&gt;
&lt;p&gt;提示 1: 找出所有的回文数再判断它们是不是质数（素数）.&lt;/p&gt;
&lt;p&gt;Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.&lt;/p&gt;
&lt;p&gt;提示 2: 要产生正确的回文数，你可能需要几个像下面这样的循环。&lt;/p&gt;
&lt;p&gt;题目翻译来自NOCOW。&lt;/p&gt;
&lt;p&gt;USACO Training Section 1.5&lt;/p&gt;
&lt;p&gt;产生长度为 5 的回文数：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (d1 = 1; d1 &amp;lt;= 9; d1+=2) {    // 只有奇数才会是素数
    for (d2 = 0; d2 &amp;lt;= 9; d2++) {
        for (d3 = 0; d3 &amp;lt;= 9; d3++) {
          palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/blockquote&gt;
&lt;p&gt;于是我便把提示里的代码复制了几份～&lt;/p&gt;
&lt;h2&gt;&amp;lt;span data-v-71731098=&quot;&quot; data-v-d9da1260=&quot;&quot; class=&quot;lfe-caption tag status-name&quot; style=&quot;background: rgb(82, 196, 26); color: rgb(255, 255, 255);&quot; data-v-0640126c=&quot;&quot;&amp;gt; AC &amp;lt;/span&amp;gt;代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

// 判断一个数是否为质数
bool isPrime(int n) {
    if (n &amp;lt; 2) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;

    for (int i = 3; i * i &amp;lt;= n; i += 2) {
        if (n % i == 0) return false;
    }
    return true;
}

vector&amp;lt;int&amp;gt; palindromes;

int main() {
    int st, ed;
    scanf(&quot;%d%d&quot;, &amp;amp;st, &amp;amp;ed);

    // 生成所有可能的回文数

    // 1位回文数
    for (int i = 1; i &amp;lt;= 9; i++) {
        palindromes.push_back(i);
    }
    // 偶数位回文数(除了11)都能被11整除，不是回文数
    // 2位回文数
    palindromes.push_back(11);

    // 3位回文数
    for (int i = 1; i &amp;lt;= 9; i += 2) { // 只考虑奇数开头，偶数开头的必不是质数
        for (int j = 0; j &amp;lt;= 9; j++) {
            palindromes.push_back(i * 101 + j * 10); // iji形式
        }
    }

    // 5位回文数
    for (int i = 1; i &amp;lt;= 9; i += 2) {
        for (int j = 0; j &amp;lt;= 9; j++) {
            for (int k = 0; k &amp;lt;= 9; k++) {
                palindromes.push_back(i * 10001 + j * 1010 + k * 100); // ijkji形式
            }
        }
    }

    // 7位回文数
    for (int i = 1; i &amp;lt;= 9; i += 2) {
        for (int j = 0; j &amp;lt;= 9; j++) {
            for (int k = 0; k &amp;lt;= 9; k++) {
                for (int l = 0; l &amp;lt;= 9; l++) {
                    palindromes.push_back(i * 1000001 + j * 100010 + k * 10100 + l * 1000); // ijklkji形式
                }
            }
        }
    }

    // 9位回文数（虽然超出了1亿，但为了完整性）
    for (int i = 1; i &amp;lt;= 9; i += 2) {
        for (int j = 0; j &amp;lt;= 9; j++) {
            for (int k = 0; k &amp;lt;= 9; k++) {
                for (int l = 0; l &amp;lt;= 9; l++) {
                    for (int m = 0; m &amp;lt;= 9; m++) {
                        int palindrome = i * 100000001 + j * 10000010 + k * 1000100 + l * 100010 + m * 10000;
                        if (palindrome &amp;lt;= 100000000) { // 只添加不超过1亿的
                            palindromes.push_back(palindrome);
                        }
                    }
                }
            }
        }
    }

    // 排序
    sort(palindromes.begin(), palindromes.end());

    // 遍历回文数数组，找出其中的质数并输出
    for (int palindrome : palindromes) {
        if (palindrome &amp;gt; ed) break;
        if (palindrome &amp;gt;= st &amp;amp;&amp;amp; isPrime(palindrome)) {
            printf(&quot;%d\n&quot;, palindrome);
        }
    }

    return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Over!&lt;/p&gt;
</content:encoded></item><item><title>Luogu P3218 题解</title><link>https://www.zhx-blog.top/posts/2025-10-03-luogu_p3218%E9%A2%98%E8%A7%A3/</link><guid isPermaLink="true">https://www.zhx-blog.top/posts/2025-10-03-luogu_p3218%E9%A2%98%E8%A7%A3/</guid><description>洛谷P3128 (求取被指定的多条路径覆盖的树中找出被覆盖次数最多的节点) 的题解</description><pubDate>Sat, 09 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;a href=&quot;https://www.luogu.com.cn/problem/P3128&quot;&gt;Luogu P3218&lt;/a&gt;&lt;/h1&gt;
&lt;h2&gt;&lt;strong&gt;题目大意&lt;/strong&gt;：&lt;/h2&gt;
&lt;p&gt;求取被指定的多条路径覆盖的树中找出被覆盖次数最多的节点&lt;/p&gt;
&lt;h3&gt;!!INPUT：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第一行&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;N&lt;/code&gt;: 节点&lt;/li&gt;
&lt;li&gt;&lt;code&gt;K&lt;/code&gt;: 路径数&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接下来&lt;code&gt;N - 1&lt;/code&gt;行，每一行：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; &lt;code&gt;y&lt;/code&gt;: 节点&lt;code&gt;x&lt;/code&gt;与&lt;code&gt;y&lt;/code&gt;之间有通路&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;接下来&lt;code&gt;K&lt;/code&gt;行：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt; &lt;code&gt;t&lt;/code&gt;: 路径端点&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;思路&lt;/h2&gt;
&lt;p&gt;考虑使用&lt;strong&gt;链式前向星&lt;/strong&gt;建树。&lt;/p&gt;
&lt;p&gt;遍历路上的节点，经过一次加&lt;code&gt;1&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;题中路径已知两端点，记起点为 $u$ , 终点为 $ v $ 则路径为&lt;/p&gt;
&lt;p&gt;$$
u \to lca(u, v) \to v
$$&lt;/p&gt;
&lt;p&gt;若直接遍历，则时间复杂度为$ O(NK)$ ，按题目数据最多遍历$ 5 \times 10^{10}$ , 这是不能接受的。&lt;/p&gt;
&lt;p&gt;考虑使用&lt;strong&gt;树上差分&lt;/strong&gt;优化。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;关于&lt;em&gt;前缀和 &amp;amp; 差分&lt;/em&gt;的知识，可以去&lt;a href=&quot;https://oi-wiki.org/basic/prefix-sum&quot;&gt;OI-WiKi&lt;/a&gt;中学习。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;如果要对结点 $x$ 和 $y$ 之间的路径上的所有点权都加 $v$，可以对它的差分序列 ${D_x}$ 做如下操作：&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
D_x &amp;amp;\gets D_x + v, \
D_{\operatorname{lca}(x, y)} &amp;amp;\gets D_{\operatorname{lca}(x, y)} - v,\
D_y &amp;amp;\gets D_y + v, \
D_{\operatorname{fa}(\operatorname{lca}(x, y))} &amp;amp;\gets D_{\operatorname{fa}(\operatorname{lca}(x, y))} - v.
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;在所有修改操作完成后，可以计算一次子树和，就能得到更新后的点权。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;倍增求LCA&lt;/h3&gt;
&lt;p&gt;首先第一遍DFS预处理数组，得到二维倍增数组 $fa$ 及 深度数组 &lt;code&gt;depth&lt;/code&gt;。&lt;code&gt;fa[u][i]&lt;/code&gt;表示节点&lt;code&gt;i&lt;/code&gt;往上走$2^i$步的父节点。&lt;/p&gt;
&lt;p&gt;接下来进行LCA查询，具体步骤：跳、跳、跳……然后就到LCA了。&lt;/p&gt;
&lt;p&gt;从最低节点出发，往上跳&lt;code&gt;diff&lt;/code&gt;步即可。具体操作：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (int i = 0; i &amp;lt;= LOG; i++)
    if (diff &amp;amp; (1 &amp;lt;&amp;lt; i)) // 若 diff 的二进制第 i 位为 1
        u = fa[u][i];
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;再两个点从同一高度出发，&lt;s&gt;一起蹦蹦跳跳&lt;/s&gt;直到两点相同。虽然使用&lt;code&gt;while&lt;/code&gt;循环可以优化一丢丢，但是这里还是给出&lt;code&gt;for&lt;/code&gt;循环的代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for (int i = 0; i &amp;lt;= LOG; i++)
    if (fa[u][i] != fa[v][i])
    {
        u = fa[a][i];
        v = fa[b][i];
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;$lca(u, v)$即为此时的$u = v $的父节点即$fa_{u,0}$。&lt;/p&gt;
&lt;h3&gt;树上差分&lt;/h3&gt;
&lt;p&gt;树上差分和一维差分略有不同。树上差分是子节点**&quot;在后续的累加过程中，要向它的父节点（以及自己）传递多少值&quot;**。&lt;/p&gt;
&lt;p&gt;例如对于树：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;graph TD
1/0 --&amp;gt; 2/0
1/0 --&amp;gt; 3/0
2/0 --&amp;gt; 4/0
2/0 --&amp;gt; 5/0
3/0 --&amp;gt; 6/0
3/0 --&amp;gt; 7/0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要给路径$2 \to 1 \to 7$加上 $1$ , 只需要给&lt;/p&gt;
&lt;p&gt;$$
D_7 \leftarrow D_7 + 1 \
D_2 \leftarrow D_2 + 1\
D_1 \leftarrow D_1 - 1\
$$&lt;/p&gt;
&lt;p&gt;如果 $$lca(u,v)$$ 不是根节点，则 $father(lca(u, v))$ 也需要自减。&lt;/p&gt;
&lt;p&gt;因为在$D_u$和$D_v$自增的过程中，$lca(u,v)$及其以上的所有节点的值都相应地减了两个$1$，因此给$D_{lca(u,v)}$及其父节点各自减一刚好可以抵消。&lt;/p&gt;
&lt;p&gt;在最后结束时，使用前缀和合并差分数组即可得出初始值。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;strong&gt;需要使用后序遍历（即左-&amp;gt;右-&amp;gt;根的顺序），因为根节点需要统计&lt;/strong&gt;所有&lt;/strong&gt;子节点的贡献（直接在递归子节点后加上子节点的值即可）。&lt;/p&gt;
&lt;p&gt;**提示：**在后序遍历之前记得先初始化节点值为差分值（因为也包括它自己的贡献）&lt;/p&gt;
&lt;h2&gt;示例代码&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;#include &amp;lt;bits/stdc++.h&amp;gt;
using namespace std;

const int LOG = 20;
const int MAXN = 5e4 + 10;

int fa[MAXN][LOG &amp;lt;&amp;lt; 2], depth[MAXN], D[MAXN], val[MAXN];
vector&amp;lt;int&amp;gt; tree[MAXN];

void dfs(int x, int father)
{
    fa[x][0] = father;
    for (int i = 1; i &amp;lt;= LOG; i++)
    {
        fa[x][i] = fa[fa[x][i-1]][i-1]; // 一分为二
    }
    for (auto child: tree[x])
    {
        if (child == fa[x][0]) continue;
        depth[child] = depth[x] + 1; // 深度+1
        dfs(child, x);
    }
}

int lca(int u, int v)
{
    if (depth[v] &amp;gt; depth[u]) swap(u, v);
    int diff = depth[u] - depth[v];
    for (int i = 0; i &amp;lt;= LOG; i++)
        if (diff &amp;amp; (1 &amp;lt;&amp;lt; i)) // 若 diff 的第 i 位为 1
            u = fa[u][i];
    if (u == v) return u;
    if (fa[u][0] == fa[v][0]) return fa[u][0];
    for (int i = LOG; i &amp;gt;= 0; i--)
        if (fa[u][i] != fa[v][i])
        {
            u = fa[u][i];
            v = fa[v][i];
        }
    return fa[u][0];
}

void accumulate(int x, int father)
{
    val[x] = D[x];
    for (auto child: tree[x])
    {
        if (child == father) continue;
        accumulate(child, x);
        val[x] += val[child];
    }
}

signed main()
{
    int n, k;
    cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; k;
    for (int i = 1; i &amp;lt; n; i++)
    {
        int u, v;
        cin &amp;gt;&amp;gt; u &amp;gt;&amp;gt; v;
        tree[u].push_back(v);
        tree[v].push_back(u);
    }

    dfs(1, 0); // 根节点的爸爸是 0

    for (int i = 1; i &amp;lt;= k; i++)
    {
        int s, t;
        cin &amp;gt;&amp;gt; s &amp;gt;&amp;gt; t;

        int l = lca(s, t);

        ++D[s];
        ++D[t];
        --D[l];

        if (fa[l][0])
            --D[fa[l][0]];
    }

    accumulate(1, 0);

    int ans = -0x3f3f3f3f;
    for (int i = 1; i &amp;lt;= n; i++)
    {
        ans = max(ans, val[i]);
    }

    cout &amp;lt;&amp;lt; ans &amp;lt;&amp;lt; &apos;\n&apos;;

    return 0;
}

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item></channel></rss>