>

Hi there 👋

Welcome to my blog.

打造数据驱动的城市:利用 Python 整合住房、治安与社会剥夺指标

本文复盘了如何利用 Python、Geopandas 和 Folium 将住房规划、治安数据与社会经济指标融合,构建支持动态权重的城市决策可视化系统。

十二月 3, 2025 · 3 分钟 · 451 字 · Tategoto Azarasi

将我的大学课程表导入个人日历:一次手动 API 探索与 iCalendar 文件生成实践

本文详细介绍如何利用浏览器开发者工具分析大学课程表网站的内部 API,通过 Python 脚本将获取到的 JSON 格式课表数据转换为通用的 iCalendar (.ics) 文件,从而一键导入到任何个人日历应用中。

十一月 9, 2025 · 4 分钟 · 693 字 · Tategoto Azarasi

构建一个能应对复杂反爬机制的 TypeScript 视频下载器

记录了如何使用 TypeScript、Node.js 和 Playwright 从零开始构建一个能够应对复杂反爬机制、动态加载和网络竞态条件的健壮视频下载器。

十一月 9, 2025 · 3 分钟 · 637 字 · Tategoto Azarasi

Uol 2025 Wk3 && LeetCode Biweekly Contest 168 题解

Weak Vertices (弱顶点) 问题描述 在图论中,一个网络的结构强度通常可以通过识别其中的基本形状(如三角形)来分析。三角形能提供结构刚性,是许多应用中常见的母题。这个问题要求我们识别那些不属于任何三角形的顶点。一个顶点 i 被定义为属于一个三角形,如果它有两个不同的邻居 j 和 k,并且 j 和 k 彼此之间也是邻居。我们的任务是找出所有不满足此条件的顶点,问题将其称为“弱顶点”。图以邻接矩阵的形式给出。 我的代码 我的方法是对定义进行直接模拟。对每个顶点,我遍历其所有邻居对,并检查它们之间是否相连。 // 遍历从 0 到 n-1 的每个顶点 `i`,检查它是否是弱顶点。 for(int i=0; i<n; i++) { // 一个标志位,用于追踪顶点 `i` 是否属于任何三角形。 // 我们将其初始化为 true,假设 `i` 是弱顶点,直到找到反证。 bool flag = true; // 遍历 `i` 的所有邻居。 // 外层循环选择第一个邻居 `j`。 for(int j=0; j<siblings[i].size(); j++) { // 内层循环选择第二个邻居 `k`。 // 我们从 j+1 开始,以确保每对邻居只被考虑一次。 for(int k=j+1; k<siblings[i].size(); k++) { // 检查 `i` 的两个邻居,即 `siblings[i][j]` 和 `siblings[i][k]`, // 是否相互连接。 if(graph[siblings[i][j]][siblings[i][k]]) { // 如果它们相连,那么顶点 `i`、`j` 和 `k` 构成一个三角形。 // 因此,顶点 `i` 不是弱顶点。我们将标志位设为 false。 flag = false; // 既然已经找到了一个涉及 `i` 的三角形,我们可以停止对该顶点的检查。 break; } } // 如果标志位已被设为 false,我们也可以跳出外层的邻居循环。 if(!flag) { break; } } // 如果在检查完所有邻居对后,标志位仍然为 true, // 这意味着没有找到涉及 `i` 的三角形。因此,`i` 是一个弱顶点。 if(flag) { cout<<i<<' '; } } 我的解法及其正确性 这个问题要求我们识别给定无向图中所有不属于任何三角形的顶点。如果一个顶点满足这个条件,它就被认为是“弱”的。图的结构通过一个 $n \times n$ 的邻接矩阵给出,其中 $n$ 是顶点的数量。 ...

十月 25, 2025 · 16 分钟 · 3225 字 · Tategoto Azarasi

Uol 2025 Wk2 题解

Recount 问题描述 最近的学校董事会选举竞争异常激烈:提案内容包括互换中小学的上学时间,一项备受争议的禁止在校穿着运动服的新着装规定,以及一项旨在提高房地产税以资助新橄榄球训练设施的提案,诸如此类的议题层出不穷。现在,距离投票站关闭已过去数小时,但获胜者仍未揭晓! 在绝望之中,选举官员们求助于您,请您编写一个程序来统计选票! 输入 输入包含一个单一的测试用例,即一张已投选票的列表。输入中的每一行都包含一位被投票的候选人的名字。一个名字可能由多个单词组成,以空格分隔。单词包含字母或连字符,但不含其他标点符号。列表中至少有2张选票。选票列表以包含字符 *** 的单行结束。这一行不应被计入票数。最多可以有100,000张有效选票。 输出 如果某位候选人获得了简单多数或绝对多数的选票(即,票数超过任何其他候选人),则输出这位候选人的名字!如果没有候选人获得简单多数,则输出:“ Runoff!”(别忘了包含感叹号!) 代码 #include <iostream> #include <string> #include <unordered_map> #include <algorithm> // using namespace std; // 为简洁起见,在单个文件中可以如此使用 namespace recount { int main(istream &cin, ostream &cout) { // 使用 unordered_map 存储每位候选人的票数。 // 键是候选人的名字(字符串),值是他们的票数(无符号长整型)。 std::unordered_map<std::string, unsigned long> m = std::unordered_map<std::string, unsigned long>(); std::string line; // 逐行读取选票,直到遇到哨兵值 "***"。 while(std::getline(cin, line)) { if(line == "***") { break; } // 为当前行所指的候选人增加票数。 // 如果候选人尚不存在于哈希表中,则会以计票数为1被添加进去。 m[line]++; } // 初始化一个字符串来存放获胜者的名字,以及一个变量用于存放最高票数。 std::string ans = "***"; // 使用哨兵值来检查是否存在平局。 unsigned long max_vote = 0; // 第一遍遍历:找出所有候选人中的最高票数。 for(const auto &[k, v]: m) { max_vote = std::max(max_vote, v); } // 第二遍遍历:找出获得最高票数的候选人。 for(const auto &[k, v]: m) { if(v == max_vote) { // 如果 'ans' 不再是哨兵值,意味着我们已经找到了一个获胜者。 // 此时再找到一个说明存在平局。 if(ans != "***") { cout << "Runoff!"; return 0; // 在打印平局结果后退出。 } // 这是找到的第一个获得最高票数的候选人。 ans = k; } } // 如果循环完成且 'ans' 只被更新过一次,则打印获胜者的名字。 cout << ans; return 0; } } 题解 这个问题要求我们处理一个投票列表,其中每一票都是一个代表候选人姓名的字符串。我们需要找出得票最多的候选人。如果只有一位候选人得票最高,我们就打印他/她的名字。如果有两位或更多的候选人并列获得最高票数,我们必须宣布“Runoff! ”。投票列表以一个特殊的字符串 *** 结尾。 ...

十月 1, 2025 · 6 分钟 · 1145 字 · Tategoto Azarasi

发现 debtap 中一个“删库跑路”级 Bug

一篇对 Arch Linux 工具 debtap 的 Bug 调查,揭示了一个看似无害的拼写错误修复,是如何意外触发了删除当前目录下所有文件的“rm -rf”致命缺陷。

八月 6, 2025 · 4 分钟 · 745 字 · Tategoto Azarasi

解决 ThinkBook 16 G7+ ASP 在 Linux 系统下数字麦克风的顽固问题

记录了在联想 ThinkBook 16 G7+ ASP (AMD Ryzen AI 9) 笔记本上解决 Linux 系统下数字麦克风无声问题的详细过程,主要通过添加内核模块参数 options snd_sof_amd_common enable_pdm=1 实现

五月 24, 2025 · 6 分钟 · 1099 字 · Tategoto Azarasi

深入Anki卡片内部:反混淆技术与数据提取实践

深入解析复杂Anki卡片模板的反混淆技术,通过Puppeteer和JSDOM实现动态渲染内容的精准数据提取与迁移。

五月 16, 2025 · 2 分钟 · 273 字 · Tategoto Azarasi

用Tampermonkey和AI为在线作业批改减负

记录了如何使用Tampermonkey脚本和百度文心AI为在线作业批改(特别是简答题)提供自动化辅助,以减轻教师重复性评分和评语工作的负担。

五月 2, 2025 · 5 分钟 · 951 字 · Tategoto Azarasi

矩阵乘法性能测试:从三重循环到百 GFLOPS (AMD Ryzen AI + Radeon 平台实测)

深度对比11种矩阵乘法实现(从Naive到CPU SIMD、多核、BLAS及GPU加速如OpenCL/HIP/Vulkan)在AMD Ryzen AI + Radeon平台上的巨大性能差异与优化关键。

四月 19, 2025 · 14 分钟 · 2859 字 · Tategoto Azarasi