touristgpt/finecf-COTs
收藏资源简介:
Codeforces Trace Dataset是一个合成推理轨迹数据集,基于9,413个Codeforces问题(难度评级范围800-3500)。每个问题包含结构化的错误路径探索、发现叙述、伪代码,以及对于难度评级≥1800的问题,还提供完整的可执行C++实现。该数据集旨在训练模型如何思考竞争性编程问题,而不仅仅是解决它们,通过模拟专家思考过程,包括尝试想法、遇到障碍、从失败中提取见解,并最终构建解决方案。
language: - 英语 license: MIT许可证 task_categories: - 文本生成 tags: - 竞赛编程(competitive-programming) - 推理(reasoning) - 代码(code) - Codeforces - 轨迹(traces) - 思维链(Chain-of-Thought) size_categories: - 1K<n<10K # Codeforces 轨迹数据集 这是一个基于9413道Codeforces竞赛题(难度评级800–3500)构建的合成推理轨迹数据集。每道题目均包含结构化的错误路径探索、发现叙事、伪代码,且对于评级≥1800的题目,还提供了可完全执行的C++实现。本数据集旨在教会模型**如何通过竞赛编程问题进行思考**,而非仅仅求解题目。 ## 是什么让本数据集与众不同 绝大多数竞赛编程数据集仅将题目与解法配对,而本数据集完整记录了**完整推理过程**: 1. **错误路径** — 详细探索无效的解题思路,包括其失败原因及可从每一次失败中汲取的经验 2. **发现叙事** — 以第一人称视角记录从失败思路转向正确解法的过程,并附带逐步骤的实操追踪 3. **伪代码** — 适用于直接实现的正确解法伪代码 4. **C++实现** — 完全可执行、符合竞赛规范的C++解法,与伪代码完全一致(仅针对≥1800评级的题目) 5. **新增题目** - 我们补充了来自最新数据集的题目,以及Open-r1数据集的全部题目。(我们已过滤掉缺少题解或其他重要字段的题目。) 本数据集模拟了**专家的思考过程**——尝试思路、遭遇瓶颈、从失败中提取洞见,并逐步构建出最终解法。 这正是本数据集的核心创新:我们将思考轨迹进行了高度结构化的建模,充分参考了程序员的真实思考路径:首先尝试看似合理的思路,经测试后发现其错误,这能够锻炼模型提出假设并通过推理验证思路的能力。 本质上,我们是在复现自然的思考过程,并将其拆解为多个组件,从而能够更便捷地访问思考过程的不同环节。 在轨迹的最后阶段,我们通过向模型提供**正确解法的提示**(而非直接给出答案,模型仍需通过推理得到解法),确保模型能够推导出正确的解决方案。 **每个题目对应的提示本身就是极具价值的数据集资源。** 对于评级≤1700的题目,我们未采用上述完整流程,而是直接要求模型求解题目并展示解题过程,我们发现这种方式在低难度题目上能取得更优效果。 *本数据集的一大优势在于其高度可扩展性:你可以根据需求,在正确路径探索前添加任意数量的错误路径探索。你也可以仅使用正确路径探索部分本身。* ## 数据集结构 每一行对应一道Codeforces题目。本数据集按难度分为两个等级: | 评级范围 | 题目数量 | 处理流程 | 包含内容 | |---|---|---|---| | ≤ 1700 | 4,579 | 简易流程 | 错误路径(描述)+ 简短思考轨迹 + 伪代码 | | ≥ 1800 | 4,834 | 完整(四阶段)流程 | 错误路径(完整探索)+ 发现叙事 + 伪代码 + C++实现 | ### 数据模式(共23列) #### 题目元数据 | 列名 | 数据类型 | 描述 | |---|---|---| | `problem_id` | str | Codeforces题目ID,例如`"1586/I"` | | `problem_name` | str | 题目标题 | | `rating` | float | Codeforces难度评级(800–3500,0代表未评级) | | `tags` | str | 逗号分隔的主题标签(例如动态规划、图论、数学等) | | `time_limit` | float | 时间限制(单位:秒) | | `memory_limit` | float | 内存限制(单位:MB) | | `description` | str | 完整题目描述 | | `input_format` | str | 输入格式说明 | | `output_format` | str | 输出格式说明 | | `interaction_format` | str | 仅适用于交互型题目 | | `note` | str | 额外说明/澄清 | | `examples` | list[dict] | 样例`{input, output}`对 | | `editorial_cleaned` | str | 清理后的官方Codeforces题解 | #### 生成的轨迹字段 | 列名 | 数据类型 | 覆盖范围 | 描述 | |---|---|---|---| | `s1_hint` | str | 98.9% | 指向正确解法的提示 | | `wrong_path_1` | dict | 100% | `{name, exploration}` — 第一种错误思路 | | `wrong_path_2` | dict | 100% | `{name, exploration}` — 第二种错误思路 | | `wrong_path_3` | dict | 43.5% | `{name, exploration}` — 第三种错误思路(如适用) | | `wrong_path_4` | dict | 4.4% | `{name, exploration}` — 第四种错误思路(如适用) | | `small_thinking_trace` | str | 仅适用于≤1700评级题目 | 发现正确解法的简短思考轨迹 | | `small_pseudo` | str | 仅适用于≤1700评级题目 | 正确解法的伪代码 | | `s3_narrative` | str | 仅适用于≥1800评级题目 | 第一人称的完整发现叙事 | | `s3_pseudocode` | str | 仅适用于≥1800评级题目 | 与叙事中变量命名一致的详细伪代码 | | `s4_cpp` | str | 仅适用于≥1800评级题目 | 与伪代码完全一致的可执行C++实现 | ### 错误路径格式 每个`wrong_path_N`均为包含两个键的字典: - **`name`** — 思路名称(例如 *"基于优先队列的贪心算法"*、*"暴力深度优先搜索"*) - **`exploration`** — 完整文本: - 对于**≤1700**评级的题目:思路的简短描述及其失败原因 - 对于**≥1800**评级的题目:第一人称的详细探索过程,展示解题者尝试该思路、碰壁并汲取经验的全过程 ### 发现叙事(≥1800评级) `s3_narrative`字段为第一人称的叙述,记录在所有错误路径探索完成后发现正确解法的过程,遵循固定结构: 1. 总结失败的思路及其问题所在 2. 通过顿悟时刻(例如"嗯……等等——")转换思路 3. 逐步推导正确的算法 4. 结合具体数值追踪完整示例 5. 以关键的结构性洞见收尾 ## 生成流程 本数据集通过四阶段流程使用DeepSeek V3.2生成: - **阶段1** — 给定题目及其官方题解,生成看似合理但错误的解题思路,以及指向正确解法的提示。本阶段还包含一个评判模型,用于评估思路的质量。 - **阶段2** — 针对每个错误思路,生成详细的探索过程,展示解题者尝试该思路、失败并从中学习的全过程 - **阶段3** — 基于错误路径的经验作为上下文,生成正确解法的发现叙事(首次调用)与伪代码(第二次调用) - **阶段4** — 将伪代码转换为完全可执行、符合竞赛规范的C++解法(仅针对≥1800评级的题目) 评级≤1700的题目使用更简单的单阶段流程,而非完整的四阶段流程。 ## 使用方法 python from datasets import load_dataset ds = load_dataset("YOUR_USERNAME/YOUR_DATASET_NAME") # 获取一道带有完整轨迹的高难度题目 row = ds["train"].filter(lambda x: x["rating"] >= 2400)[0] print(row["problem_name"]) print(row["wrong_path_1"]["exploration"]) # 贪心算法失败的原因 print(row["s3_narrative"]) # 正确解法的发现叙事 print(row["s3_pseudocode"]) # 实现用伪代码 print(row["s4_cpp"]) # 可执行的C++解法 python # 直接从Parquet文件加载 import pandas as pd df = pd.read_parquet("mega_dataset.parquet") # 筛选带有至少3条错误路径的题目 multi_path = df[df["wrong_path_3"].notna()] ## 统计数据 | 指标 | 数值 | |---|---| | 总题目数 | 9,413 | | 评级范围 | 800 – 3500 | | 带有完整叙事的题目(≥1800) | 4,834 | | 带有简短轨迹的题目(≤1700) | 4,444 | | 叙事平均长度(≥1800) | ~17,800 字符 | | 伪代码平均长度(≥1800) | ~3,200 字符 | | C++实现平均长度(≥1800) | ~2,300 字符 | | 带有C++实现的题目 | 4,833(占≥1800评级题目的99.98%) | | 带有2条错误路径的题目 | 100% | | 带有3条错误路径的题目 | 43.5% | | 带有4条错误路径的题目 | 4.4% | ## 预期用途 - **监督微调(SFT)**:用于竞赛编程领域的推理模型训练 - **过程监督**:训练模型进行探索、失败并恢复的能力 - **错误路径学习**:教会模型尽早识别死胡同(这对提炼推理过程至关重要) - **课程学习**:题目难度覆盖800至3500评级,可用于阶梯式训练 ## 局限性 - 135道题目的评级为0(特殊/未评级竞赛题目),这些题目大多来自愚人节竞赛,对数据集无实用价值,因此我们未将其纳入有效数据。 - 约1.8%的题目缺少`time_limit`(时间限制)与`memory_limit`(内存限制)字段。 - 叙事内容为合成生成,可能偶尔包含细微的数学误差。 - “错误路径”的设计目标是看似合理但实际错误——部分思路可能实际上是可行的替代解法。(我们已通过评判模型对每条错误路径进行评估,以尽量减少此类情况。)




