Codeforces 序列优化三题:滑动窗口、双指针与二分查找
很多序列题看起来都在“枚举一段区间”,但区间的性质不同,最合适的工具也不同:长度固定时维护窗口和,约束单调时移动左右边界,查询阈值时在有序数据上二分。
本文选择三道 Codeforces 官方题目,把它们放在同一条学习路径上。重点不是记住三份代码,而是学会通过题目结构选择数据移动方式。
1. 先判断区间属于哪一种模型
flowchart TD
A[题目要求处理连续区间] --> B{区间长度固定吗}
B -- 是 --> C[固定滑动窗口]
B -- 否 --> D{加入元素后代价单调增加吗}
D -- 是 --> E[双指针维护可行窗口]
D -- 否 --> F[考虑前缀和、二分或其他结构]
A --> G{是独立阈值查询吗}
G -- 是 --> H[排序后 upper_bound]
三种方法都在避免重复工作:窗口复用上一次的和,双指针保证边界只向前移动,二分则利用有序性排除一半范围。
2. 363B Fence:固定长度窗口的最小和官方题目:363B Fence · ...
Codeforces 入门四题:把题意翻译成判断、计数与模拟
刚开始做算法题时,最困难的部分往往不是语法,而是把一段自然语言压缩成几个明确条件。Codeforces 的 800 分题很适合训练这项能力:代码通常不长,错误却能准确暴露题意理解、下标和边界处理上的问题。
本文选择四道官方入门题,不复述完整题面,而是专注于“怎样从要求得到判断式”。每题标题都链接到 Codeforces 官方页面,建议先独立阅读和尝试,再回来对照分析。
1. 通用翻译流程面对一道短题,可以先写出四行草稿:输入是什么、输出是什么、每个条件怎样判断、最小边界在哪里。
flowchart LR
A[阅读输入与输出] --> B[圈出必须满足的条件]
B --> C[把条件写成布尔表达式]
C --> D[用最小值和临界值测试]
D --> E[再开始编码]
不要急着寻找“算法名称”。如果题目只需要扫描、计数或判断,直接实现就是正确算法。
2. 4A Watermelon:必要条件与充分条件官方题目:4A Watermelon · 难度 800 · 官方标签:math、brute force
核心要求把一 ...
个人知识地图:用分类、标签与链接组织长期写作
文章数量增加以后,博客很容易变成一个按时间倒序排列的文件柜。旧文章并没有消失,却越来越难被再次发现;新文章也常常重复解释以前写过的背景。
解决这个问题不需要一开始设计庞大的知识体系。只要让分类、标签和文章链接各自承担清晰职责,博客就会从时间线逐步长成一张能够探索的知识地图。
知识地图不是一次规划完成的目录,而是内容在持续连接中显露出的地形。
1. 三种结构不要混在一起分类、标签和链接看起来都在做整理,但它们回答的是不同问题。
结构
回答的问题
合适的数量
典型例子
分类
这篇文章主要属于哪个长期方向
少而稳定
AI 工程、数据分析、音乐随笔
标签
它涉及哪些可以横向交叉的概念
适度增长
RAG、可观测性、聆听指南
链接
阅读前后还需要哪些具体上下文
随内容自然增加
搭建文章连接到评测文章
一个简单原则是:分类像书架,标签像索引,链接像路。书架频繁改变会让人迷路,索引过多会失去区分度,没有路则会让每篇文章成为孤岛。
2. 分类负责长期承诺好的分类通常对应愿意持续写几年的主题,而不是某次短期兴趣。判断一个名称是否适合作为分类,可以问三个问题:
...
古典音乐中的主题变形:四个音怎样长成一首曲子
一首规模很大的作品,常常不是由无数互不相关的旋律堆起来的。作曲家更像是在观察一颗种子:改变它的速度、重音、方向、光线和生长环境,让一个短小动机在不同场景中继续保持身份。
理解主题变形之后,听音乐会多出一条线索:我们不再只等待“熟悉的旋律回来”,而是开始辨认它换了怎样的步伐和语气。
一个短小动机可以沿着节奏、和声与配器,逐渐展开成完整的声音世界。
1. 主题与动机有什么区别动机通常很短,可能只有几个音,最重要的是它有容易辨认的节奏或音程轮廓。主题则更完整,往往已经形成一句可以独立记住的音乐。
可以把它们理解成语言中的词根与句子:词根很小,却能在不同词语中保留意义;句子更完整,但依然可以拆回几个关键材料。
本文用一个抽象的四音动机来说明:先上行,再稍作停顿,最后回落。无需知道具体音名,只要记住它的“动作”。
2. 五种最常听见的变化改变节奏:同一句话换一种步伐音高顺序不变,只把均匀的四拍改成长短相间,动机就可能从平静变得犹疑,或从抒情变成舞蹈。聆听时可以暂时忽略音高,只用手指轻敲重音位置。
改变音程:保留方向,扩大张力原来相邻的两个音可以被拉远。旋律仍然“先上后下”,但 ...
RAG 知识库评测:从检索命中到可信回答
一个知识库“能回答”并不等于“回答得可信”。同一个错误结果,可能来自文档没有解析完整、文本块切得不合适、召回结果偏离问题,也可能是模型忽略证据后自行补全。只有把链路拆开评测,优化才不会变成反复调整参数。
本文承接 RAGFlow 知识库搭建实战,重点讨论上线前后怎样建立一套轻量、可复现、能够定位原因的评测体系。
评测的目标不是得到一个孤立分数,而是看清证据怎样抵达回答。
1. 先把“效果好”拆成四个问题一次完整问答至少包含四个可以独立检查的环节:
flowchart LR
Q[用户问题] --> R[检索候选文本块]
R --> S[重排与筛选]
S --> G[基于证据生成]
G --> A{证据是否充分}
A -- 是 --> C[回答并引用来源]
A -- 否 --> D[拒答或请求补充]
对应的四个问题是:
检索是否找到了证据:正确文本块有没有进入候选集合;
重排是否把证据放在前面:真正相关的内容是否获得更高优先级;
回答是否忠于证据:结论能否从引用片段中推出 ...
古典音乐入门:从七首作品开始建立聆听地图
古典音乐常被描述得很有门槛:要懂曲式、记住作曲家生平,还要分清作品编号。其实,进入它最自然的方法仍然是听。先对声音产生兴趣,再慢慢知道自己听见了什么,知识才会变成路标,而不是入场券。
这篇文章不追求列出一份“必听排行榜”,而是选择七首性格不同的作品。每一首只关注一个问题,七天之后,你会得到一张属于自己的初步聆听地图。
flowchart LR
A[巴赫<br/>秩序] --> B[莫扎特<br/>对话]
B --> C[贝多芬<br/>动机发展]
C --> D[肖邦<br/>呼吸与诠释]
D --> E[柴可夫斯基<br/>配器色彩]
E --> F[德彪西<br/>和声空间]
F --> G[拉威尔<br/>重复与变化]
第一天:听见秩序巴赫《G 大调第一无伴奏大提琴组曲》前奏曲,BWV 1007一把大提琴,没有乐队,也没有歌词, ...
从文档到可检索知识库:RAGFlow 搭建与调优实战
搭建 RAG 知识库并不只是“上传文档,再接一个大模型”。真正影响效果的环节包括文档解析、分块、向量化、混合检索、重排以及回答阶段的约束。RAGFlow 把这些环节放进一套可视化流程中,适合用于内部制度问答、产品手册检索、技术资料助手等场景。
本文以本地 Docker Compose 部署为起点,完成一个可以检索、测试和持续优化的知识库。示例不包含任何真实凭据。
1. 先理解数据怎样流动一份文档进入 RAGFlow 后,大致会经过下面这条链路:
flowchart LR
A[原始文件] --> B[版面解析与内容提取]
B --> C[按规则切分文本块]
C --> D[向量化与全文索引]
D --> E[关键词与向量混合检索]
E --> F{是否启用重排}
F -- 是 --> G[重排候选文本块]
F -- 否 --> H[选择相关文本块]
G --> H
H --> I[对话模型生成回答]
Docker Compose 默认还会启动若干 ...
Visual Studio 常用快捷键:编辑、调试与导航
快捷键的价值不在于一次记住全部组合,而在于把最常用的编辑、调试和导航动作逐步变成肌肉记忆。下面按使用场景整理 Visual Studio 常用快捷键。
常用编辑快捷键
注释代码:Ctrl + K, Ctrl + C
取消注释:Ctrl + K, Ctrl + U
代码格式化:
格式化整个文档:Ctrl + K, Ctrl + D
格式化选中内容:Ctrl + K, Ctrl + F
复制整行代码(无需选中):将光标放在行上,Ctrl + C
剪切整行代码:将光标放在行上,Ctrl + X
删除整行代码:Ctrl + Shift + K
撤销:Ctrl + Z
重做:Ctrl + Y 或 Ctrl + Shift + Z
查找:Ctrl + F
查找全部文件:Ctrl + Shift + F
替换:Ctrl + H
转到定义:F12
转到声明:Ctrl + F12
查找所有引用:Shift + F12
跳转到指定行:Ctrl + G
插入代码片段:Ctrl + K, Ctrl + X
切换书签:Ctrl + K, Ctrl + K
切换行注释(VS2022及以上):Ctrl + ...
Matplotlib 数据可视化基础:从画布到常见图表
数据可视化的重点不只是“把图画出来”,还包括选择合适的图形、控制画布结构,以及让标题、坐标轴和图例准确传递信息。这份笔记从 Matplotlib 的基础对象开始,逐步整理常见图表。
一、Matplotlib 概述常见的数据可视化工具包括 Matplotlib、Seaborn 和 Bokeh。Matplotlib 提供底层而灵活的绘图能力;Seaborn 在其基础上封装了更适合统计图形的接口;Bokeh 更侧重交互式图表。本文主要使用 Matplotlib。
为什么使用 Matplotlib使用Matplotlib实现数据图形化的优势是:
接口覆盖从快速绘图到精细布局的不同需求;
支持交互式探索,也适合生成静态报告图表;
文字和公式可以使用 LaTeX 风格排版;
可以控制坐标轴、图例、颜色与布局等细节;
支持 PNG、PDF、SVG 和 EPS 等常见格式。
二、创建简单图形(一)导入绘图模块1import matplotlib.pyplot as plt
(二)创建 Figure 对象12345678910111213141516171819202122import mat ...
NumPy 数据读写与常用统计方法
NumPy 不仅用于数组计算,也提供了轻量的数据读写、汇总统计和索引工具。本篇按“读写—统计—排序—去重—搜索”的路径组织常用方法,便于按任务快速查找。
一、NumPy 读取数据(一) 使用NumPy读写文本文件1.将1维或2维数组写入TXT文件或CSV格式文件 (1) 写入后缀名为txt或csv的文件
(2) 语法: numpy.savetxt(fname,array,fmt=’%.18e’,delimiter=None,newline=’\n’, header=’’, footer=’’, comments=’# ‘, encoding=None)
参数
解释
fname
文件、字符串或产生器,可以是.gz或bz2压缩文件
array
存入文件的数组(一维数组或者二维数组)
fmt
写入文件的格式,如:%d,%.2f,%.18e,默认值是%.18e
delimiter
分隔字符串,默认是任何空格,改为逗号
newline
值可以\n,换行
header
头部加入注释
...