当一道 timber 函数式编程思维题摆在你面前,读懂题面就花了 20 分钟,debug 时发现理解错了题意,这种痛苦相信每个 OIer 都懂。 HydroOJ 的题面往往承载着完整的背景故事,但对于初赛选手或是跨语言学习者来说,理解题意本身就是一道门槛

今天开源的 hydrooj-plugin-ai-reader(AI 题面理解助手),不是来抢走你 AC 的成就感的,而是帮你用最短的时间抓住题目的命门

痛点:题面太长,抓不住重点

以一道典型的 OI 题为例:

“Alice 和 Bob 在一张 n 个点 m 条边的无向图上玩游戏。每个点有一个权值……(500 字背景)……要求你输出一个最小的 k 使得对于所有满足……(数学定义)……的方案,都能……(条件判断)……”

读完这段文字,你的大脑需要:

  1. 过滤掉 Alice 和 Bob 的故事线
  2. 提取形式化定义:图、点权、阈值 k
  3. 识别约束条件:n105n \le 10^5 意味着什么?

这不仅耗时,还容易看错。特别是在多校训练中,时间宝贵,读懂题意就赢了一半。

解决方案:AI 题面理解助手

这个插件在 HydroOJ 的每道题目右侧新增一个"🤖 AI 题面理解"按钮。点击后,你会看到:

1. 极简题意概括

用 1-2 句话说明"给定什么,求什么",去掉所有背景故事。
*示例:*给定无向图,点带点权,求满足连通块最大值限制的最小删边代价。

2. 关键信息提取

  • 数据范围速查n105n \le 10^5 \Rightarrow 需要线性或线性对数算法
  • 隐藏约束:无重边、权值非负、保证有解等容易忽视的前提
  • 边界情况n=1n=1m=0m=0、权值相等时的特殊处理

3. 思考路径(苏格拉底式提问)

不会告诉你"用动态规划"或"建最短路",而是问:

  • “如果固定答案 k,能否快速检验可行性?”(暗示二分 or 贪心检验)
  • “观察数据范围,什么样的复杂度会 TLE?”(暗示算法复杂度选择)

这是一种启发式学习,既保护了解题乐趣,又避免了在错误的方向上浪费时间。

技术架构:与 HydroOJ 深度融合

域级开关控制(安全第一)

与市面上其他插件不同,默认全站关闭,需在「控制面板-域设置」中手动开启。这保证了:

  • 正式比赛期间可完全禁用,维护公平性
  • 不同训练域可灵活配置(入门域开启,高阶域关闭)
  • 防止非目标用户误用(如将 OJ 用于就业笔试时)

智能缓存机制

同一道题的 AI 分析只需生成一次,存储于 MongoDB,后续所有用户共享。减少 API 调用成本的同时,也保证了同一道题提供的思考角度具有共识性。

零侵入式集成

  • 前端:通过 NamedPage 注入侧边栏,符合 Hydro 原生 UI 风格(使用 Hydro 的卡片、按钮、排版系统)
  • 后端:独立路由 /p/:pid/ai,权限继承 Hydro 的 PRIV_USER_PROFILE
  • 风格统一:输出采用 Markdown + KaTeX,与题面渲染一致

提词工程(Prompt Engineering)

核心提示词设计遵循**“教渔不授鱼”**原则:

1
2
3
4
角色:资深 OI 教练
禁止词:动态规划、最短路、线段树、ST 表...
必做:将数学抽象描述为"是否具有某种性质"而非"使用某种数据结构"
必做:每个思考点以疑问句结尾

实际调用的 DeepSeek-V3 模型在此约束下,输出质量足以媲美教练手写 hint。

快速开始

安装

1
2
3
4
5
6
7
8
# 进入服务器
cd /path/to/hydrooj/addons
git clone https://github.com/your-repo/hydrooj-plugin-ai-reader.git
cd hydrooj-plugin-ai-reader

# HydroOJ 自动识别插件
hydrooj addon add $(pwd)
pm2 reload hydrooj

配置(管理员)

进入「控制面板-系统设置」,添加 AI 配置(支持 GitCode/OpenRouter/DeepSeek 等):

1
2
3
4
ai-summary:
apiKey: "sk-your-key"
model: "deepseek-ai/DeepSeek-V3.2-Exp"
apiUrl: "https://api-ai.gitcode.com/v1/chat/completions"

启用功能

进入「域设置-🤖 AI 题面理解设置」,勾选启用。此时该域下的所有题目右侧都会出现 AI 按钮。

实际效果对比

原题面片段(300 字):
小 K 是一位著名的嗜睡病患者,他每天都在与无垠的睡意作斗争。在这一天,他收到了 n 个任务,第 i 个任务有一个截止时间 d_i 和需要的时间 t_i……

AI 简化后:

题意:单资源调度问题,n 个任务有截止时间和耗时,求最大可完成的任务数。
关键n2×105n \le 2×10^5di,ti109d_i,t_i \le 10^9,暗示需 O(nlogn)O(n \log n) 或更优。
思考:“如果有个任务耗时很长但截止时间很晚,它是否一定比耗时短且截止时间早的任务优先级低?”(暗示贪心按截止时间排序)

价值:20 秒抓住题目是"带截止时间的调度",而非浪费 3 分钟去同情小 K 的嗜睡症。

使用建议 & 边界

适合开启的场景

  • 新手入门域:帮助初学者学习如何读题、提取形式化模型
  • 英文题面训练:快速获取中文题意概括,降低语言门槛
  • 题单复习:快速回顾题目核心,验证自己对题意的记忆是否准确

建议关闭的场景

  • 正式比赛期间:维护公平性(可在比赛配置中单独关闭)
  • 原创题校考:防止外校选手利用 AI 快速理解题意优势

局限性

  • 无法替代独立思考:不提供算法代码,不提供具体转移方程
  • 可能有幻觉:AI 可能对复杂题意理解有偏差,最终以原题面为准
  • API 成本:生成一次约消耗 1-2k tokens,请自行评估成本

结语

hydrooj-plugin-ai-reader 不是来帮你 AC 的,而是帮你更快地进入状态

OI 训练的本质是思维训练,而不是阅读理解题。当你能在 30 秒内通过 AI 摘要确认"这题是线段树维护区间众数",然后立即开始思考具体怎么维护,你的训练效率就已经超过了还在读背景故事的同学。

GitHub 地址github.com/your-repo/hydrooj-plugin-ai-reader
讨论/反馈:欢迎提 Issue 或加 HydroOJ 用户群交流

祝你在 AI 的辅助下,把更多时间花在真正的算法思考上。