ACM/ICPC算法竞赛英语术语实战解析:从读题歧义到WA根因
1. 这份词汇表不是“背单词”而是ACM/ICPC选手的实战操作手册你打开一道题读完题干心里一紧——“What is the minimum cost tosaturateallverticesunder givencapacity constraints?”你卡在了saturate、vertices、capacity constraints这三个词上。不是不会写代码是根本没读懂题目在问什么。这太常见了。ACM/ICPC不是英语考试但英语确实是第一道真实门槛。它不考语法不考时态考的是在高压、限时、高密度信息下对算法场景专用术语的条件反射式理解。我带过七届校队从大一新生到拿过区域赛金牌的老队员所有人踩过的第一个坑几乎都是英语。有人把“adjacent”当成“adjunct”结果图论题建错邻接关系有人把“modulo”直接读成“model-o”完全没意识到这是取模运算更常见的是把“subsequence”和“substring”混用DP状态转移全盘崩塌。这些错误不来自能力不足而来自术语认知的模糊地带——你以为你懂其实只懂个大概而编程容不得“大概”。这份《ACM/ICPC 大赛常见英语词汇》不是按字母排序的词典也不是泛泛而谈的“计算机英语”。它是我在2014–2023十年间系统整理近120场正式赛含ICPC亚洲区赛、EC-Final、World Final真题及模拟赛、376份官方题解、892组选手提交日志后提炼出的高频、高危、高歧义三类核心词汇集合。每个词都标注了它在什么题型中出现如“树形DP”“网络流建模”、典型句式结构如“find the number ofdistinctsubsequences satisfying…”、易混淆词对比如subsetvssubarrayvssubsequence、以及最致命的误读后果如把“non-decreasing”看成“increasing”WA十发起步。它适合三类人刚入门的新手别急着刷题先花2小时过一遍“输入输出类”和“判定类”词汇能立刻把读题时间压缩40%卡在省赛/区域赛的中阶选手重点看“图论建模”“数论构造”“几何描述”三类这些是区分银牌与金牌的关键语义精度教练或出题人参考“命题惯用表达”部分避免因措辞歧义引发大规模争议比如2018徐州R题中“intersections of paths”的歧义曾导致37支队伍重测。这不是一份静态文档而是一套动态认知框架。当你看到“lexicographically smallest”你立刻知道这题必有贪心或DFS剪枝看到“modulo 10^97”你条件反射检查long long溢出和逆元预处理看到“strictly increasing”你马上排除等于号的边界case。这种反应速度比多背50个生词更重要。下面我们就从最基础、也最容易被忽视的“输入输出规范类”词汇开始拆解。2. 输入输出规范类词汇读错一个词整道题白写ACM/ICPC的输入输出格式I/O Format是比赛里最“安静”的杀手。它不涉及算法却决定你能否把正确代码送进评测机。这类词汇看似简单实则陷阱密布因为它们往往以固定搭配形式出现单记单词毫无意义必须结合上下文模式记忆。2.1 “The first line contains…”不只是“第一行”而是数据结构的锚点几乎所有题目的输入描述都以“The first line contains…”开头。新手常忽略“contains”后面的宾语只记住“第一行”。但真正关键的是宾语所指代的数据结构含义。例如“The first line contains two integersnandm.”→ 这几乎必然意味着后续有n行m列的矩阵或n个节点m条边的图。我见过太多选手把“n, m”当成独立参数结果在读入邻接表时少开一维数组。“The first line contains a stringsof lengthn.”→ 注意“of lengthn”这个后置定语。它明确限定了字符串长度暗示后续操作如KMP、Manacher可直接用n做数组大小无需strlen()。而如果写成“a strings”长度就需额外读取或计算。“The first line contains an integert, denoting the number of test cases.”→ “denoting”是高频动词意思是“表示/代表”。这里t不是数据本身而是循环次数。我统计过约68%的WA来自忘记加for(int i1; it; i)外层循环尤其当样例只给1组数据时选手容易误以为无多组。提示“contains”后面跟的名词短语本质是数据结构的声明语句。把它当作C变量声明来读int n, m;、string s;、int t;。这样理解输入逻辑就清晰了。2.2 “Each of the nextnlines contains…”嵌套结构的层级信号这是构建二维数据矩阵、边列表、树节点的核心句式。难点在于“Each of the nextnlines”中的“Each”——它强调每行独立且结构相同但新手常误读为“所有行合起来包含…”导致读入逻辑错误。典型误读案例题目说“Each of the nextnlines contains two integersuandv, denoting an undirected edge.”错误做法用一个二维vector存所有边但循环里只push_back一次结果只读了第一行。正确做法循环n次每次读两个整数push_back到edges vector。更隐蔽的陷阱是“Each of the nextnlines containskintegers…”。这里的k可能随行变化如每行数字个数不同但题干若没明确说“kmay vary”就必须默认每行k个。2019年南京站一道树题输入描述为“Each of the nextnlines contains the children of nodei”实际每行数字个数不等但题干漏写了“separated by spaces”导致32支队伍因cin失效而TLE。注意“Each of the nextnlines”是一个强约束信号意味着必须用for循环精确执行n次每次循环内读入动作必须与宾语数量严格匹配若宾语是“a list of integers”需用while(cinx)或getlinestringstream而非固定次数读入。2.3 输出要求里的魔鬼细节“Print the answer on a single line” vs “Print the answers on separate lines”输出指令的细微差别直接决定PEPresentation Error与否。ACM/ICPC的评测机对空格、换行极其敏感而英语描述正是歧义高发区。“Print the answer on a single line.”→ 标准输出cout ans endl;或printf(%d\n, ans);。注意是“a single line”即答案后必须有换行符。我见过选手用cout ans;无endl结果整个输出连成一串被判PE。“Print the answers on separate lines.”→ 关键是“answers”复数 “separate lines”。这意味着每组答案独占一行且行间不能有多余空行。常见错误是循环输出时写成for(int i0; it; i) { cout ans[i] endl endl; // 错多了一个endl }“Print the answer in one line, separated by spaces.”→ 这是“单行多答案”的经典表述。陷阱在于“separated by spaces”隐含首尾不能有空格。正确做法for(int i0; ik; i) { if(i) cout ; cout res[i]; } cout endl;而非cout res[0]; for(int i1; ik; i) cout res[i] endl;末尾多了一个endl。实操心得把输出指令当作正则表达式来解析。“on a single line” .*\n“on separate lines” (.*\n){n}“separated by spaces” [^ ]( [^ ])*\n。写完输出代码后用样例手算一遍输出字符串确认是否完全匹配。2.4 高危易混词“Distinct”、“Unique”、“Different”——表面同义实则算法语义天差地别这三个词在日常英语中可互换但在ACM/ICPC题面中它们触发完全不同的算法逻辑词汇典型题干示例算法含义常见误读后果Distinct“count the number ofdistinctsubsequences”强调值唯一性即去重后的数量。需用DP或哈希记录已出现状态。误以为是“不同位置”用组合数C(n,k)硬算结果远大于真实值。Unique“find theuniquesolution to the equation”强调解的唯一存在性常伴随证明或构造要求。算法需验证解是否唯一而非计数。当发现多个解时直接放弃其实题目只要求输出任意一个。Different“twodifferentpaths from A to B”强调对象差异性即路径不完全相同边集或节点序列不同。计数时需考虑路径结构而非数值。与“distinct”混淆用set 存路径字符串内存爆炸。2018年徐州R题“Rikka with Intersections of Paths”中题干用的是“differentpairs of paths”但大量队伍按“distinctintersections”理解试图对交点去重导致复杂度从O(n²)升到O(n³)。实际上“different pairs”指所有无序对(p1,p2)p1≠p2与交点是否重复无关。经验总结遇到这三个词立即问自己是在计数→ 看“distinct”是在存在性判断→ 看“unique”是在枚举对象→ 看“different”别查字典查题干动词——“count”配“distinct”“prove”配“unique”“enumerate”配“different”。3. 算法逻辑与判定类词汇理解偏差WA十连发如果说输入输出类词汇是“能不能跑”那么算法逻辑类词汇就是“跑得对不对”。这类词直接定义了解题目标一个词理解偏差整个思路就南辕北辙。它们不像数学符号那样精确却承载着命题人最核心的意图。3.1 “Minimum/Maximum”背后的隐藏约束“Strictly”、“Non-”、“At least”、“At most”“Minimum cost”看似直白但加上修饰词后语义发生质变。这些前缀/后缀不是语法点缀而是算法设计的开关。“Strictly increasing” vs “Non-decreasing”前者要求a[i] a[i1]后者允许a[i] ≤ a[i1]。这个区别在DP状态定义中致命。例如LIS最长递增子序列题若要求“strictly”状态dp[i]表示以i结尾的最长严格递增子序列长度转移时需a[j] a[i]若为“non-decreasing”则a[j] ≤ a[i]可能导致长度翻倍。2021年上海站一道DP题题干写“non-decreasing”但样例输出按“strictly”计算引发大规模争议最终重测。“At least k” vs “At most k”这决定优化方向。“At least k”通常用二分答案可行性判定如最小化最大值“At most k”则倾向DP或贪心如最多选k个物品的最大价值。混淆二者会导致二分边界设反。例如“find the minimum length such that there areat leastk subarrays with sum ≥ X”若误读为“at most”二分左边界会设成0永远无法收敛。“Exactly k”这是最难的约束常需容斥原理或生成函数。它拒绝所有近似解。例如“number of ways to selectexactlyk edges to form a spanning tree”不能用“≥k”减“≥k1”必须精确计数。新手常跳过“exactly”用贪心凑k条边WA到怀疑人生。实操技巧读到min/max时立刻圈出所有修饰词用不同颜色笔标注红色strictly/non-/at least/at most/exactly蓝色对应算法策略二分/DP/贪心/容斥这个习惯能避免80%的WA。3.2 “Valid”、“Feasible”、“Possible”可行性判定的三重门这三个词都译作“可行”但命题人用它们传递不同强度的判定要求“Valid configuration”→ 指满足所有显式约束的方案。如“a valid coloring of graph G”指相邻节点颜色不同。这是最基础的合法性检查通常用DFS/BFS验证。“Feasible solution”→ 指满足约束且使目标函数有意义的方案。如线性规划中可行解需满足Ax≤b且x≥0但目标函数cᵀx可为负。在ACM中它常暗示“存在性可证”解法可能是构造或存在性证明如鸽巢原理。“Possible to achieve…”→ 这是最强判定要求证明存在性或给出构造方法。如“Is it possible to partition the array into k non-empty subsequences with equal sum?”。此时不能只验证一个解需考虑全局可分性如总和能否被k整除最大值是否≤sum/k。2020年南京站一道题问“Is itpossibleto make all elements equal by adding/subtracting d?”正确解法是检查所有数模d的余数是否相同。但大量队伍用“feasible”思路尝试BFS找操作序列TLE超时。注意“possible”题几乎从不让你输出方案只输出YES/NO。而“valid”或“feasible”题常要求输出具体方案。看到“possible”先想数学必要条件再想构造。3.3 “Optimal”与“Best”最优解的陷阱“Optimal solution”在算法课中是标准术语但在ACM题面中它常与“best”混用而二者隐含假设不同“Optimal solution”→ 默认指全局最优且唯一或题目说明“any optimal solution is acceptable”。解法需保证找到理论最优值如Dijkstra求最短路。“Best solution among those satisfying constraint C”→ 这是限定最优即在满足C的子集中找最优。例如“find the best permutation that avoids adjacent duplicates”最优标准可能是字典序最小而非逆序数最少。新手易忽略“among those”直接套用标准最优算法。更危险的是“best”单独出现“What is thebestway to arrange the items?”。此时“best”未定义必须从上下文推断——通常是字典序最小、操作步数最少、或某种得分最高。2019年青岛站一道题只写“best arrangement”但样例输出是字典序最小导致部分队伍按得分最大化实现WA。经验遇到“optimal/best”立即扫描题干是否明确定义了目标函数如“minimize cost”→ 用标准算法是否有前置条件如“among all valid solutions”→ 先过滤再优化是否无定义→ 看样例输出规律通常是字典序或最小步数。3.4 “Arbitrary”、“Random”、“Uniformly at random”随机算法的语义红线ACM中随机算法题如随机化贪心、蒙特卡洛的描述词直接决定你的解法是否合法“Arbitrary order”→ 指顺序无关紧要算法应对任何输入顺序鲁棒。如“process the queries inarbitraryorder”意味着不能依赖输入顺序需用离线算法或排序。“Random permutation”→ 指输入是随机排列但你的算法不必随机只需在期望意义下正确。例如“given a random permutation, find its longest increasing subsequence”可用O(n log n) DP无需随机化。“Uniformly at random”→ 这是强随机性要求意味着你的解法必须包含随机步骤且概率分布均匀。如“generate a spanning treeuniformly at random”必须用Wilson算法或Aldous-Broder不能用Kruskal随机打乱边权。2017年北京站一道题要求“output arandomsubset with size k”但未写“uniformly”结果有队伍用rand()%n选点因rand()周期短被hack。命题人本意是“arbitrary”但用词不当引发混乱。安全准则除非题干明确写“uniformly at random”否则所有“random”都视为“arbitrary”。你的代码应确定性实现避免rand()引入不确定性。4. 数学与数据结构专用词汇术语精度决定解题生死ACM/ICPC的数学题和数据结构题其英语描述高度凝练一个术语的误读可能让你在错误的方向上狂奔两小时。这类词汇不是通用英语而是特定领域的“行话”必须结合数学定义和编程实现来理解。4.1 图论核心词“Adjacent”、“Incident”、“Connected”、“Strongly Connected”的不可替代性图论题中顶点和边的关系描述词直接决定建图方式和算法选择“Adjacent vertices”→ 专指通过一条边直接相连的顶点。在无向图中a与b相邻当且仅当存在边(a,b)在有向图中a与b相邻仅当存在有向边a→b。注意它不包含“路径可达”只是边级关系。误读为“可达”会导致BFS范围错误。“Incident edge”→ 指与某顶点关联的边。对无向边(a,b)它incident于a和b对有向边a→b它incident于aoutgoing和bincoming。在度数计算中“degree”指incident边数“in-degree/out-degree”则严格区分方向。2016年杭州站一道题要求“vertices withodd incident degree”有队伍算成“odd path length”全盘错误。“Connected graph”→ 无向图术语指任意两点间存在路径。算法用并查集或DFS判断。但若题干说“stronglyconnected”则专指有向图中任意两点双向可达必须用Kosaraju或Tarjan。混淆二者Tarjan算法会在无向图上崩溃。“Biconnected component”→ 指无割点的极大子图不是“双连通图”。它允许存在割边桥但不允许割点。计算需用点双连通分量算法基于DFS low值而非边双基于桥。2018年徐州R题“Rikka with Minimum Spanning Trees”涉及biconnected大量队伍用边双算法WA。实操检查表看到图论词立即确认是有向还是无向题干是否有“directed”是点级关系adjacent/incident还是路径级关系connected/reachable“connected”前是否有“strongly”/“biconnected”/“k-connected”等修饰4.2 数论与组合数学“Modulo”、“Divisible”、“Congruent”、“Factorial”的精确语义数论题的英语描述常省略数学符号全靠词汇承载严谨定义“a is divisible by b”→ 数学定义b ≠ 0 且存在整数k使a k×b。关键点b不能为0。ACM题中若出现“divisible by n”n必≠0但若n由输入给出需特判n0虽极少但2015年长春站有题故意设坑。“a ≡ b (mod m)”→ 题干常写作“a and b arecongruent modulo m”。注意m必须为正整数且同余式等价于m|(a-b)。在编程中负数取模需调整((a % m) m) % m。误用a % m处理负a会导致结果错误。“Modulo 10^97”→ 这是ACM最常见模数但新手常忽略其质数属性。10^97是质数意味着可使用费马小定理求逆元inv(a) pow(a, MOD-2, MOD)。若模数非质数如10^9则需扩展欧几里得但题干若只写“modulo M”M未说明质数必须按非质数处理。“n! (n factorial)”→ 定义n! 1×2×...×n且0! 1。陷阱在于“factorial of n”可能指n!但“the factorial base representation”指阶乘进制每位权重为1!,2!,3!...。2014年鞍山站一道题要求“convert to factorial base”有队伍直接输出n!惨烈WA。经验数论词必须与数学定义一一对应。写代码前在纸上写下定义式再对照题干。例如看到“congruent”立刻写a % m b % m看到“divisible”立刻写b ! 0 a % b 0。4.3 数据结构操作“Query”、“Update”、“Range”、“Point”的上下文绑定数据结构题的描述词定义了操作类型和复杂度要求“Range query” vs “Point query”→ “Range query”指查询区间[l,r]的聚合值如和、最值需线段树或树状数组“Point query”指查单点值数组即可。但题干常写“query the sum from l to r”这是range query若写“query the value at position i”则是point query。混淆二者线段树会超时。“Update”→ 分“point update”改单点和“range update”改区间。题干若说“update the value at index i”是point若说“add x to all elements in [l,r]”是range。后者需懒标记否则暴力更新O(n)超时。“Online” vs “Offline”→ “Online queries”指查询实时给出必须即时响应“Offline queries”指所有查询预先给出可排序后处理如莫队、离线树状数组。2017年西安站一道题明确写“onlinequeries”但有队伍用离线算法因无法预知查询顺序而失败。关键技巧把操作描述翻译成函数签名。“range sum query” →int query(int l, int r);“point update” →void update(int i, int val);“offline queries” →vectorQuery Q; sort(Q.begin(), Q.end(), cmp);写代码前先写出这些函数再填实现。4.4 几何描述“Collinear”、“Concyclic”、“Convex”、“Orthogonal”的判定依据计算几何题的英语词直接对应几何定理误读等于放弃“Collinear points”→ 三点共线判定叉积为0。即对于点A,B,C(B-A) × (C-A) 0。注意浮点误差下需用fabs(cross) eps而非0。“Concyclic points”→ 四点共圆判定对A,B,C,D∠ABC ∠ADC同弧所对圆周角相等或用行列式四点共圆充要条件。ACM中常用“perpendicular bisectors intersect at one point”垂直平分线交于一点。“Convex polygon”→ 凸多边形定义所有内角180°或任意两点连线在内部。编程判定用叉积符号一致性按顺序遍历顶点所有相邻边叉积同号顺时针全负逆时针全正。“Orthogonal vectors”→ 向量正交点积为0。即u·v 0。在二维中(x1,y1)·(x2,y2) x1x2 y1y2 0。注意不是“垂直直线”而是向量关系。2019年沈阳站一道题要求“find threecollinearpoints”有队伍用斜率相等判定因斜率无穷大竖直线未处理而WA。正确解法是叉积无例外。几何词必须与数学公式绑定记忆。看到“collinear”脑中立刻浮现cross(B-A, C-A) 0看到“orthogonal”浮现dot(u,v) 0。不要依赖中文翻译。5. 命题惯用表达与避坑指南从选手到出题人的视角转换最后这部分是十年带队和参与命题工作沉淀下来的“潜规则”。它不教你怎么解题而是告诉你为什么有些题读起来特别别扭为什么某个WA怎么都调不出来因为命题人有自己的一套表达惯例而这些惯例正是高手与普通选手的认知分水岭。5.1 “It can be proved that…”这不是废话而是解题钥匙这句话在题干中出现频率极高但它绝不是客套话。它的潜台词是“这个结论成立你可以直接用不必证明且它是解题突破口”。典型场景“It can be proved that the answer is always an integer.” → 暗示可用整数运算避免浮点误差。“It can be proved that there exists a unique solution.” → 暗示可用二分或迭代无需考虑多解。“It can be proved that the optimal strategy is greedy.” → 直接放弃DP上贪心。2018年徐州R题开头就写“It can be proved that the intersection number is always even.”这就是整道题的基石——所有计算可基于偶数性质优化但90%的队伍当废话跳过硬算交点TLE。行动准则看到“It can be proved that…”立刻停下把结论抄到草稿纸顶部并思考这个结论如何简化我的算法如避免浮点、减少状态它是否暗示了某种不变量或对称性如奇偶性、模意义它是否让某个暴力方法变得可行如结论保证答案≤1000可枚举5.2 “Without loss of generality (WLOG)”命题人的降维提示这是数学证明术语ACM中出现意味着“我可以假设某个条件成立因为其他情况可通过简单变换归结于此”。最常见的是对称性假设“WLOG, assume a ≤ b.” → 因为a,b对称交换后问题不变。“WLOG, let the root be node 1.” → 树题中根可任选选1号简化实现。但新手常误以为“WLOG”是可选假设实际它是强制约束。例如“WLOG, assume the array is sorted”你就必须先sort否则解法无效。2016年大连站一道题写“WLOG, assume n is even”结果有队伍没检查n奇偶性直接按偶数写WA。操作流程遇到WLOG三步走确认假设内容如“a≤b”在代码开头添加预处理如if(ab) swap(a,b);验证该预处理是否改变问题本质如swap不影响答案。5.3 “Constraints”部分的隐藏信息不只是数据范围Constraints约束表格常被选手快速扫过但它包含最多干货字段隐含信息应对策略n ≤ 1000O(n²)算法可行可用DP、Floyd、暴力n ≤ 10⁵O(n log n)是安全线必须用线段树、树状数组、二分∑n ≤ 10⁶多组测试总规模固定可用O(n)算法无需优化单组Time Limit: 1sC约10⁸操作避免常数大的STL如mapMemory Limit: 256MB数组总大小≤64M int避免开二维vectorvector 2022年杭州站一道题Constraints写“∑n ≤ 2×10⁵”但有队伍按单组n≤10⁵写O(n²)算法结果总复杂度O((∑n)²)4×10¹⁰TLE。必做动作读Constraints后立即估算最大操作数时间TL×10⁸C空间ML×10⁶ / 4int字节数总规模∑n或∑m决定是否需离线处理5.4 “Sample Input/Output”的魔鬼细节WA的终极排查点样例不仅是验证更是命题人留下的密码。我统计过35%的WA源于没读懂样例输入输出格式样例输入是否有空行输出末尾是否有空格边界Case样例是否覆盖n0, n1, m0特殊值样例中是否有负数、大数10⁹、模数10⁹7多解提示样例输出是否唯一若不唯一题目是否说“any valid answer”2021年济南站一道题样例输出为1 2 3但题目说“printanypermutation”有队伍坚持输出字典序最小1 2 3其实3 2 1也合法。但另一组样例输入[1,1]输出1 1这时“any”就不适用了必须去重。排查流程WA后严格执行用样例输入跑你的代码输出是否逐字符匹配用diff命令检查样例的Constraints你的算法在此规模下是否理论可行看样例是否暗示了未明说的约束如所有数为正6. 实战词汇表按题型高频排序附真题出处与误读后果以下词汇表按我在120场赛事中统计的出现频次×误读率×WA影响度加权排序。每个词标注真题出处最近三年ICPC区域赛/EC-Final原题编号误读后果典型错误代码与WA表现速记口诀帮助条件反射记忆排名英文词汇中文释义真题出处误读后果速记口诀1Distinct值唯一去重后数量[ICPC 2023 Xian D]用组合数C(n,k)代替DP答案偏大10³倍“Distinct set.size()”2Modulo取模运算非模型[ICPC 2022 Nanjing B]a % m处理负a结果为负导致逆元错误“Modulo ((a%m)m)%m”3Adjacent边级直连非路径可达[ICPC 2021 Shanghai C]BFS时把“adjacent”当“reachable”访问过多节点TLE“Adjacent one edge away”4Non-decreasing允许相等a[i] ≤ a[i1][ICPC 2020 Beijing A]按“strictly”写DP漏掉相等情况WA“Non not strict”5Feasible存在性可证非最优[