信息学竞赛网站清单:评测、检索、对拍与训练规划四层工具链

发布时间:2026/10/31 9:32:06
信息学竞赛网站清单:评测、检索、对拍与训练规划四层工具链 1. 先说清楚为什么一个 OIer 需要一份自己的网站清单信息学竞赛这个圈子里工具和信息源的效率差距很多时候比算法水平的差距更致命。同样一道题有人十分钟找到对应题单和同类模型有人翻半小时还在论坛里刨坟同样一个 WA有人三分钟定位到是爆栈还是没清空数组有人在评测记录里反复提交二十次。这份清单想解决的就是这件事——把“找资源”“查资料”“验代码”这些重复动作的时间成本压到最低。它面向的是刚入门、还在靠别人发的链接东拼西凑的选手也面向已经打了几年、但收藏夹乱成一锅粥的老选手。我下面会把网站按功能分层拆开讲每个类别讲清楚它是干什么的、什么时候该用、怎么用才不浪费时间顺带把那些文档里不会写、只有踩过才知道的坑一起交代。先说一个前提这篇里我不点具体站名只讲类型和用法。原因很实际——这类站点更新换代很快两年前好用的站点今年可能已经半死不活而死链对读者的伤害大于帮助。你按我说的“类型特征”去搜反而更稳。我会尽量把判断标准写死让你看到任何一个陌生站点都能在三分钟内判断出它值不值得留在收藏夹里。提示下面所有涉及“某某站”的说法都是指某一类平台不是特指某一个。请按类型去匹配你手上的资源。1.1 把“必备网站”拆成四层别混在一起我最开始做这份清单时是直接把链接往收藏夹里塞结果就是两个字混乱。后来我按“使用频次”和“使用阶段”两个维度重新分层效率立刻不一样了。四层是这样的层级用途使用频次典型场景第一层日常训练刷题、提交、看评测结果每天打开就写写完就交第二层知识检索查算法、查证明、查同类题每天多次卡题、想不出模型第三层验证工具对拍、造数据、画图、算样例每场练习写完代码自测第四层赛事与规划比赛日历、赛制信息、训练计划每周安排下周训练分层之后有个很直接的好处你不需要“最好的站”你只需要“每一层各一个够用的站”。第一层挑一个评测稳定、题目量够的第二层挑两个互补的一个偏题解一个偏理论第三层基本都是本地工具网页版只是补充第四层甚至不需要网站一个日历就够。我见过太多人卡在“挑平台”这件事上反复在几个平台之间横跳题目刷得零零散散做题记录散落在四五个账号里最后连自己做过哪些题都统计不出来。这就是典型的选型成本吃掉了训练成本。1.2 判断一个站点值不值得留的三个硬指标我现在看一个新站只问三个问题三分钟出结论。第一题目页打不打得开、加载快不快。这不是吹毛求疵。如果一个题目页要等五秒才渲染出来你一天开五十次就是四分钟的纯浪费更别提它打断你思路的节奏。很多老平台的页面确实是十年前的技术栈但只要首屏快、题面纯文本就比花里胡哨的现代前端好用。第二评测结果给得够不够细。只告诉你“错误”而不告诉你“第几个点错、错了几个点、是超时还是答案错”的平台基本可以直接淘汰。因为前者意味着你要靠猜后者意味着你可以直接定位。这条标准能筛掉一大批质量不高的平台。第三题目描述有没有完整的数据范围。数据范围是信息学竞赛里信息量最大的东西它直接决定了你能不能用某个复杂度。一份不写数据范围的题面等于没写。反过来有些东西我完全不看界面美观度、社区活跃度的绝对数值、有没有花哨的排行榜。这些跟训练效率没有直接关系很多时候还是干扰项——排行榜会让人不自觉地刷水题冲名次。2. 在线评测平台怎么挑怎么用怎么不被它坑在线评测平台是这份清单的第一层也是唯一一层你每天都在用的东西。它的本质是一个“自动判卷机”你把代码交上去它在后台用一组你看不见的数据跑你的程序然后把结果告诉你。听起来简单但里面的门道足够写一整章。2.1 三类平台的定位差异选错等于白刷按题目组织方式我把它分成三类用途完全不同。题库型平台核心资产是题量和分类标签。适合“我要练某个模型把同类题刷十道”。这类平台的题目往往按照算法标签归档你可以按标签筛选。优点是成体系缺点是训练容易变成“看标签做题”——你一看标签是“单调栈”思路立刻被框死了这不是真实比赛状态。比赛型平台核心资产是定期的线上赛和赛后题目归档。适合“我要模拟真实比赛压力”。这类平台的价值不在题目本身而在限时、无标签、有反馈延迟这三个特性。你在题库里做题随时能看题解在比赛里四小时封闭错了就是错了。这两种状态的训练效果差别极大缺一不可。训练计划型平台核心资产是“题单”——别人整理好的、有明确递进关系的题目序列。适合“我不知道下一步该练什么”。这类平台的价值完全取决于整理者的水平好的题单能省你半年弯路烂的题单就是一堆难度标注错误的题堆在一起。我的建议是三类各留一个题库型用来补模型比赛型用来练节奏题单型用来定方向。三个账号三个用途别混着用。2.2 评测机到底在判什么把“超时”这件事想明白很多新手对“超时”的理解是“我的程序跑太久了”。这个理解不够因为你不知道“太久”是多久也不知道评测机跑得比你快还是慢。一件必须知道的事评测机的性能和你本地电脑差别可能很大。你本地跑 0.3 秒的程序在评测机上可能是 0.8 秒也可能是 0.1 秒。这跟 CPU 主频、编译选项、是否开了优化、甚至机器当时的负载都有关系。所以正确的做法是不要盯着绝对时间要盯着时间限制的比例。如果你本地跑 0.3 秒限制 1 秒那你就有三倍余量比较安全如果本地跑 0.8 秒限制 1 秒那基本是在赌需要优化。一个粗略的经验值供你建立直觉在典型的评测环境下一秒能完成的运算量大约在10^8 次简单操作量级但这个数字浮动很大从 3×10^7 到 3×10^8 都有可能。我自己的习惯是按10^8估算然后留两到三倍余量。也就是说如果你的算法是 O(n log n)n 10^6那大约是 2×10^7 次操作稳过如果 n 10^7那就是 2×10^8有点悬得看常数。另外两个必须盯的隐藏限制栈空间。递归深度大的题目比如树上 DFS、线段树递归、并查集按秩合并的递归写法在某些平台上会爆栈。表现是“运行错误”或者直接“段错误”而不是答案错误。这时候你以为是算法错了其实是栈不够。排查方法把同样的代码在本地用一种能限制栈的方式跑一下或者干脆改成手写栈版本对比。规避方法深度不确定的递归一律提前改成迭代或者自己开一个大数组模拟栈。这是我最推荐的做法因为你无法控制评测机的栈大小。内存限制。有些平台的限制很紧比如 64 MB。这时候一个存 10^7 个 int 的数组就是 40 MB再加上别的数组直接超。算内存的方法很简单元素个数 × 每个元素字节数。int 是 4 字节long long 是 8 字节一个int[10000005]就是约 40 MB。养成习惯开大数组前先算一遍。2.3 一个被低估的能力把自己的提交记录当成数据集大部分平台都会保留你的历史提交。这个地方的价值被严重低估了。我的做法是定期回头翻自己的提交记录找三类东西反复错的题同一道题交了五次以上才过的说明这个模型没吃透、过了但很勉强的题时间是限制的一半以上的说明常数太大或者复杂度选错了、当时放弃的题现在回头看能不能想出来。这个复盘动作我坚持了很久效果比多刷二十道水题好得多。因为它针对的是你自己的薄弱环节而不是别人整理的通用题单。注意别迷信“通过率”。一道题通过率 20%可能是题太难也可能是题面有坑、数据有问题。判断一道题值不值得做看的是“它考什么模型”不是“多少人过”。3. 知识检索层怎么在十分钟内搞懂一个不会的模型卡题的时候最贵的成本不是“不会”而是“不知道自己不会什么”。这一层要解决的就是把模糊的困惑变成明确的搜索词然后找到能看懂的解释。3.1 搜什么把“不会”翻译成关键词新手最常见的检索失败是这样卡住了去搜题目原文。搜出来的全是题解而题解是给“已经会这个模型的人”看的你看完还是不懂。正确的检索顺序是先定位模型再搜模型最后回来看题解。怎么定位模型看数据范围、看输入输出形态。举几个例子数据范围是 n ≤ 2000多半是 O(n²) 的 DP那你就去搜“区间 DP / 序列 DP”的入门讲解。数据范围是 n ≤ 10^5有修改有查询多半是线段树或树状数组。输入是一个图问最短路边权有负数那就是贝尔曼-福特或者约翰逊算法不能上迪杰斯特拉。输入是一堆区间问最多选几个不相交那是贪心排序。这套“从数据范围反推模型”的功夫是检索效率的核心。它会让你搜的关键词从“这道题怎么做”变成“区间 DP 入门”后者能搜到的有效信息多十倍。3.2 看什么三种资料的可信度分级搜到东西之后怎么判断值不值得读我按可信度分三级。第一级带完整证明的教程。这类资料会告诉你“为什么这个算法是对的”而不只是“怎么用”。判断标志是里面有归纳法、有反证、有复杂度分析。这类资料读起来慢但读完是真的会了。第二级带例题的模板讲解。讲清楚板子怎么敲、边界怎么处理、常见变形有哪些。这类适合已经懂原理、需要快速回忆细节的时候。第三级纯题意翻译和代码。只能救急不能学到东西。我的原则是这类资料只在“确认自己思路正确、只想验证细节”的时候看。这里有个反直觉的经验先看原理再看模板比先看模板再看原理快。因为模板里的每一行代码都有存在理由你不懂原理就只能死记换个题就废而懂了原理模板忘了可以现场推。3.3 一个容易被忽略的检索技巧搜索引擎和站内搜索都支持一些限定语法用好了能省大量时间限定在某类站点内搜关键词 site:某域名后缀限定文件类型找讲义和课件关键词 filetype:pdf排除干扰词关键词 -无关词精确匹配短语给关键词加英文双引号这些语法看着基础但真的能把你从“翻了十页全是广告”变成“第一页就是讲义”。尤其是找课件的时候filetype:pdf这个限定几乎是必用的。另外很多培训讲义和题单是以在线文档形式流传的这类文档通常有“目录”结构读之前先扫一遍目录判断它覆盖的范围和你的需求对不对得上别一头扎进去读五页才发现讲的是另一个层级的内容。提示搜资料的时候给自己设个时间上限比如十分钟。超过十分钟还没定位到模型说明你的搜索词不对停下来重新拆题比继续翻页效率高。4. 验证工具层对拍、造数据、本地自测的完整流程这一层是我认为最能拉开差距的部分。很多人只会在平台上提交等着看结果而高手在提交之前就已经把自己的代码锤过一遍了。这套流程不复杂但需要动手搭一次。4.1 三件套暴力程序、正解、数据生成器对拍的核心思想极其朴素写一个肯定对但很慢的程序再写一个可能对但很快的程序用大量随机数据同时跑比对输出。只要有一次不一样就说明快的那个有问题。需要准备三个文件std暴力复杂度可以很差比如 O(n³)但逻辑必须绝对正确、绝对简单。它的作用不是通过评测而是提供“正确答案”。my待测你真正要提交的代码。gen数据生成器随机生成输入数据。先写暴力。写暴力的要点是故意写笨能暴力枚举就暴力枚举能不优化就不优化。因为你写的越简单出错概率越低作为“标准答案”的可信度就越高。我踩过的坑就是暴力写得自作聪明加了点小优化结果暴力本身有 bug对拍时报警告我折腾了两个小时才发现是标准答案错了。再写生成器。生成器的要点是覆盖边界不能只生成中间值必须故意生成极小值、极大值、全相同、已排序、逆序、有重复这些特殊形态。我一般会写一个“随机模式”加一个“边界模式”两个轮流跑。4.2 一份可直接抄的对拍脚本下面这个循环对拍脚本我在本地用了很久改动很小#!/bin/bash # 文件准备gen生成器已编译为可执行、std、my cnt0 while true; do cnt$((cnt1)) ./gen in.txt # 生成一组数据 ./std in.txt out1.txt ./my in.txt out2.txt if ! diff -q out1.txt out2.txt /dev/null; then echo 第 $cnt 组数据出现差异已保存到 in.txt break fi if [ $((cnt % 100)) -eq 0 ]; then echo 已对拍 $cnt 组暂未发现差异 fi done几个关键细节diff -q只判断是否相同不输出具体差异速度快。发现差异后再手动看in.txt。循环里必须有终止条件否则一旦你的程序死循环脚本会一直跑。上面这个版本是靠差异触发退出死循环情况下面建议加超时。加超时的版本timeout 2 ./my in.txt out2.txt if [ $? -ne 0 ]; then echo 第 $cnt 组程序超时或崩溃 break fitimeout 2表示超过 2 秒直接杀掉。这一句很重要因为死循环是对拍中最常见的情况之一没有它你只能干等。4.3 数据生成器的写法随机不等于随便很多人写的生成器长这样import random n random.randint(1, 1000) print(n) print(*[random.randint(1, 1000) for _ in range(n)])这个生成器的问题在于它只能生成“中间形态”的数据而绝大部分 bug 都藏在边界上。改进版本import random, sys def gen_case(n, mode): if mode 0: # 完全随机 a [random.randint(1, 10**9) for _ in range(n)] elif mode 1: # 全部相同 v random.randint(1, 10) a [v] * n elif mode 2: # 严格递增 a sorted(random.sample(range(1, 10**6), n)) elif mode 3: # 严格递减 a sorted(random.sample(range(1, 10**6), n), reverseTrue) else: # 极值只有 1 和最大值 a [random.choice([1, 10**9]) for _ in range(n)] return a seed int(sys.argv[1]) if len(sys.argv) 1 else 0 random.seed(seed) n random.choice([1, 2, 3, 10, 100, 1000, 10**5]) a gen_case(n, seed % 5) print(n) print(*a)用seed作为命令行参数好处是可复现。一旦对拍抓到一组差异数据你可以用同一个 seed 反复重跑精确调试。还要注意一个 Python 生成器的常见陷阱random要在seed之后才调用。如果你在设种子之前就调用了随机函数种子就被污染了复现会失败。4.4 压力测试把“大概能过”变成“确认能过”对拍验证的是正确性压力测试验证的是性能。做法是生成最大规模的数据跑一次计时。生成最大数据的时候要注意几点n 取到题目上限不要取上限减一有时候差一个就爆。数值范围也取满比如权值取到 10^9测试是否会溢出。如果是多组数据组数也要取满测试清空数组是否到位。然后本地计时。Linux 下直接time ./my big.txt /dev/null看 real 时间。Windows 下可以用 PowerShell 的Measure-Command。关键判断本地时间 × 2 到 3 倍 时间限制才算是稳。如果本地已经贴着限制了那就老老实实优化常数或者换复杂度更低的算法别赌。5. 数学与可视化辅助把想不清楚的东西画出来这一层不是必需品但用起来以后就很难戒掉。信息学竞赛里有一类错误特别典型代码没错是思路里的几何关系或者逻辑关系搞错了。这种情况盯着代码看一百遍也没用得把图画出来。5.1 几何题的验证叉积符号和精度平面几何题的调试是最折磨人的因为精度误差会让程序在“几乎正确”的地方翻车。我的习惯是写一个纯暴力的小脚本对极小的 n比如 n ≤ 6枚举所有点对用最朴素的方式算一遍再和主程序比对。判断点在线段的哪一侧用的是叉积cross(a, b, c) (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x)符号为正说明 c 在 ab 左侧为负在右侧为零共线。这里有两个坑一是叉积的结果可能溢出坐标到 10^9 时两个差值相乘是 10^18 量级必须用 64 位整数二是用浮点数算叉积等于自找麻烦能用整数就别用浮点。如果题目必须用浮点比如求交点、求角度那就要设一个误差阈值 eps。eps 取多少很讲究取太大本来不同的值被判定成相同取太小浮点误差被当成不同。经验值是1e-9值域在 1 附近时到1e-6值域在 10^6 附近时。原则是eps 要跟你计算的数值量级匹配而不是写死一个常数。5.2 图论和 DP 的手推纸比屏幕快这个话听起来老套但我还是要说复杂度超过三维的 DP一定要在纸上画表。我见过太多人试图在脑子里跑 DP 转移。人在脑子里能同时维护的变量大概是四到五个一个dp[i][j][k]加上转移条件、边界、循环顺序早就超了。表现出来就是“感觉对但写出来总差一点”。具体做法是找一张纸画一个表格把第一维当行、第二维当列手动填前三四行然后观察填表顺序。填表顺序决定了你的循环顺序这一步想清楚了代码几乎是机械翻译。如果是图上问题直接画一个五六个点的小图把每条边的权值标上手动跑一遍你的算法看结果对不对。这个方法对最短路、最小生成树、拓扑排序这类“过程型”算法特别有效。还有一个很实用的技巧手算样例并记录中间状态。特别是那种“输出方案”的题中间状态就是你的调试基准。程序跑出错误答案时你可以逐行打印中间变量和手算的对一遍立刻定位到哪一步开始分叉。6. 学习资料与社区如何避免“看了很多但什么都没学会”这一层最容易变成时间黑洞。老实说我在这一层踩过的坑最多。6.1 教程的选择宁缺毋滥网上的算法教程质量差异巨大而判断质量的方法很直接看它有没有讲“为什么是这个复杂度”和“为什么这样设计是对的”。举个例子讲 KMP 的教程如果只给你一个next数组的求法和一段代码你抄了也只能套模板如果它讲了“失配之后为什么要跳到这个位置”“这个位置的含义是什么”你才能自己推出来。后一种教程一篇顶十篇。我的做法是每个模型只认一篇教程找到那篇讲透的收藏其他的不看。因为看多篇不同风格的讲解会让你在几个版本的细节差异里反复纠结反而增加理解成本。另一个反直觉的建议不要追求“看懂”追求“讲出来”。你能用自己的话给一个完全不懂的人讲清楚这个算法的核心思想才算真懂。这个方法听着麻烦但它能立刻暴露你理解里的漏洞。6.2 社区的价值提问比回答更有用论坛、讨论区的价值我原来以为是“找答案”后来发现真正的价值在提问的过程。一道题卡住了你在心里想“我不会”这个状态是模糊的。但你如果要在论坛里发帖你必须写清楚题目在问什么、我的思路是什么、复杂度是多少、卡在哪一步、我怀疑哪里有问题。这个组织过程本身就能让你发现自己的问题在哪——很多时候帖子写到一半你自己就想通了。所以我现在遇到卡题先在本地写一份“求助稿”哪怕不发出去。这个动作本身就解决了大概三成的卡题情况。至于回帖我的建议是只看那些解释了原理的跳过那些只贴代码的。原因前面说过了。注意在社区提问有个基本礼貌就是先说明自己已经尝试过什么。这不仅是礼貌也是让别人愿意回答的前提——没人愿意回答“这题怎么做”这种需要从零讲起的问题。6.3 训练计划的组织用日历而不是待办清单第四层“赛事与规划”我最后简化成了一个东西日历。具体做法是把接下来两三个月的线上赛时间全部录进日历每周固定两到三个时间块作为“训练时段”然后在每个时段开始前决定练什么。待办清单那种“今天要做十道题”的形式我用了半年基本没完成过因为它没有约束力。日历不一样它是时间段到点就得坐下这个心理压力比清单有效得多。赛事信息这一块主要看两点赛制是限时赛还是长时间赛、能不能看题解、有没有部分分和难度定位这场的难度是不是和你现在匹配。打一场完全超出能力的比赛除了打击信心没什么用打一场全是水题的比赛也练不到东西。合适的难度是“能做出一半到三分之二”。7. 常见问题与排查这些坑我挨个踩过下面这些东西是我在带新人时被问得最多的整理成速查表遇到对应现象直接查。7.1 评测结果对照表你看到的结果最可能的原因第一步该查什么答案错误边界没处理、多组数据没清空、取模漏了手算小样例逐行打印中间量超时复杂度选错、常数过大、死循环先确认不是死循环再估算操作次数运行错误数组越界、除零、爆栈、空指针检查数组大小和递归深度内存超限数组开太大、多组数据重复分配手算总字节数格式错误行末多空格、少换行、多余空行用 diff 对比输出文件编译错误引用了不存在的头文件、变量名拼错看第一条错误信息别从最后一条看这张表里我最想强调“编译错误”那一行。编译器输出的错误信息经常是一长串新手从最后一条开始看越看越懵。正确做法是从第一条开始看因为后面的错误往往是第一条引发的连锁反应。7.2 那些不写进文档的实操禁忌禁忌一不要在提交前删调试输出。正确做法是用编译器开关或者宏来控制比如#ifdef DEBUG本地开、提交关。手动删容易删漏多删又可能删掉有用的东西。禁忌二不要用“多交几次试试”来调试。每次提交都有冷却时间而且频繁提交会让你失去对错误的敏感度。本地能测的一定本地测完再交。禁忌三不要在时间紧张时重构代码。比赛中途把写好的代码推倒重来是丢分最快的方式。正确做法是先保住当前版本能过部分分再在副本上尝试优化。禁忌四不要相信“样例过了就是对了”。样例是最弱的数据它只覆盖最典型的情况。样例过只能说明你没写错方向不能说明你写对了。禁忌五多组数据的题目清空一定要彻底。这是个老生常谈但永远有人踩的坑。我的做法是写一个专门的clear()函数把每个需要重置的数组列进去而不是零散地在各处写memset。这样至少不会漏。7.3 一份“提交前自检清单”我在正式比赛里养成了一个习惯交之前花三十秒过一遍清单数据范围看过了吗数组开到上限加五了吗多组数据的话所有全局变量清空了吗会不会溢出该开 64 位的地方开了吗取模题减法是(a - b mod) % mod吗递归深度会不会超过几万层要不要改迭代有没有残留的调试输出文件名、输入输出方式对了吗这七条我挨个踩过每一条都让我在比赛里丢过分。清单不长但它救回来的分数比多刷十道题多得多。8. 我的清单长什么样以及怎么维护它说回最实际的问题这四层加起来的链接怎么管我的做法是只留十二个左右的入口分四个分组每组三个。多一个都不加。这个数字不是随便定的是因为超过这个数量我就记不住什么在哪个位置了找链接的时间反而变长。维护频率是每季度清一次。清的时候做三件事删掉三个月没打开过的、替换掉打不开或者加载变慢的、把新发现的补进来。这个过程大概花二十分钟但能保证清单一直是活的。还有一个我自己觉得挺有用的小习惯每个入口后面写一行备注写清楚“我用它干什么”。比如“这个用来查区间 DP 的证明”“这个用来对拍”。别小看这一行字它能防止你打开一个站之后愣在那里想不起来自己为什么收藏它。最后分享一个体会。这份清单我前后改过四五版每次改的动力都来自同一个场景做题做到一半发现缺一个东西然后手忙脚乱去找。缺什么补什么补的东西自己用得上这比照着别人的推荐清单一键收藏要靠谱得多。别人的清单是别人的训练路径你抄过来多半水土不服。真正有用的那份一定是你自己在一次次卡题里长出来的。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询