Stanford(原中山大学)的王颖浅谈ACMICPC的题目风格和近几年题目的发展(转载)

 
ACM ICPC 的比赛形式一般是五个小时八个题目 , 综合考察选手的数学能力、算法能力、 coding 能力和 debug 能力 , 还有团队配合能力 . 数学方面主要强调组合数学、图论和数论这三个方面的能力 ; 而算法的覆盖范围很广 , 涉及了大部分经典的算法 , 和少量较前沿的算法 . 由于每道题目都需要通过所有的测试数据才能得分 , 并且需要精确解 , 这限制了 Approximation algorithm 在一些 NP-hard 的题目中的运用 , 从而使得搜索和剪枝策略对于 NP-hard 的题目非常重要 .
 
Final 的题目和 Regional 题目的比较
ACM ICPC 官方的正式比赛可分为 World Final Regional Contest 两种 . Final 的题目更加正统和严谨 , 强调算法的综合运用 , 一个题目往往需要几种算法的结合 . 从这几年的 final 的题目看 , final 加大了题目的代码量 , 对代码能力的要求有所增强 . Regional 的题目则更加灵活 , 同时每个赛区也有自己的出题风格 . 欧洲赛区的题目以高质量出名 , 对算法和数学的强调甚至超过了 World Final ; 美国的赛区较多模拟题 , 强调代码量 . 而亚洲则介于两者之间 , 同时由于每年都有一些新的赛区 , 所以并没有很固定的模式 .
下面浅谈一下近几年 ACM ICPC 的题目的覆盖面 . 一些常规的算法和题型没什么好讲的 , 下面主要侧重一些新颖的知识点或题型 , 或是一些较前沿的内容 .
 
数学的新题型
除了一些基本的组合数学和组合数论的问题 , 近年来概率和 Combinatorial Game Theory 的题目逐渐增多 . 很多有趣的题目都是以 Markov Process 为背景 , 需要用到一些相关的知识 .
去年国内杭州赛区的一个很有趣的题目是 , 给出一个字符集 ( 比如 {A,B,C} ) 和一个字符串 T ( 比如 ACBBCAC ), 现在从一个空串 S 开始 , 每次等概率的添加 A,B,C 中的一个字符 , 直到 T S 的一个子串 . 问得到的字符串 S 的长度的期望 . 这是一个典型的 Markov Process , 其解可以用生成函数很优美的算出来 . 一个更有趣的版本是 , 假如还有另一个字串 R , S 中出现 T 或者 R 就终止 , 问终止在 T R 的概率各是多少 . 这个问题在 Graham,Knuth, Patashnik 合著的 Concrete Mathematics 里面有详细的分析 , 并有着一个优美的结论 .
Game theory 方面 , 主要是经典的 combinatorial game theory 而比较少 Zero-sum game Nash equilibrium 的内容 . 以前甚少选手知道的 Sprague-Grundy Value 现在已几乎成了必备的知识 . 虽然大部分题目都是 two-person perfect information impartial game , 基本都可以用 Sprague-Grundy Theorem 解决 , 但也出现过 misere play 的情况 . 还有一些题目则是通过找规律和归纳解决 .
Graph theory 方面 , 上海赛区在多年前就出了一道 Chordal graph recognition 的题目 , 使得许多选手投入弦图和区间图的学习 , 并了解到完美图理论 ; IPSC 有一年出了 consecutive ones problem , 从而引起了选手们对 PQ 树和平面图判定的关注 .
除此之外 , 还有一些零散的 non-trivial 的题目 , 甚至是一些非常 involved 的题目 . 如刘汝佳给达卡赛区出的一道 unbreakable tiling 的题目 . 其中我非常喜欢的一个题目是四年前东北欧赛区的一个 floodlight problem : 平面上给出 n 个点代表 n 盏灯 , 每个灯可以照亮圆心角为 2*∏/n 的一个扇形区域 . 问怎样控制这些灯的角度 , 使得可以照亮整个平面 .
还有一些数学题则考验创造能力 . 比如有一题 : 给出 n , 要求找出一个 n*n 的方阵 , 其中每个元素都是 1 n 之间的整数 , 并且两两不等 , 同时使得每行、每列还有两个对角线的和两两不等 . 这题的构造颇为繁琐 , 最简单的方法是直接随机生成再判定是否具有这个性质 .
近年来几乎每年的 final 都有一道考察选手微积分能力的题目 . 而微分方程类题目较少 . 大型线性方程组、复杂的矩阵代数、和特征值求解方面的题目较少 .
 
算法的新题型
算法方面的增强主要体现在新的数据结构不断被选手所熟悉 , 和一些新领域的题目出现在 ACM ICPC .
数据结构方面 , 一些特殊性质的平衡树逐渐被大家掌握 , splay tree , leftist tree 等等 . Interval tree 则被广泛用于计数 . 字符串方面 , 较容易实现的后缀树组也逐渐被接受 .
一些算法 : 网络流方面 , 不少选手开始掌握 push-relabel 算法而放弃了经典的 ford-fulkerson 算法 ; 刘汝佳的书广为传阅后 , 不少选手又掌握了 fractional programming dinkelbach 算法 . 目前能熟练实现 linear programming 的选手较少 , 但可以预计过一段时间这也会成为必备的技能 .
计算几何一直是 ACM ICPC 里面的难题 . 不仅编程困难 , 更由于精度问题导致非常难做对 . 计算几何往往是在比赛时被放弃的题目 . 即使算法并不非常难 , 选手也不敢随意去做 .
一些零散的经典内容也被拿出来考察 , stable marriage , fft .
 
总结和一些预计
基本上 , 实现起来不算太复杂的多项式时间复杂度的算法都可以出成一道 ACM ICPC 的题目 . 而出题者知识面的不停增长 , 也使得越来越多这样的算法被包括 . 另一方面 , 随着算法的发展 , 一些原本没有简单算法的题目也出现了新的解法 , 这样的题目也被加入到 ACM ICPC . ACM ICPC 经过多年的积累有着大量的题目 , 其覆盖面也是非常之广 .
可以预见一些新的优秀的算法将陆续出现在 ACM ICPC . 比如由于任意图匹配的 Edmonds-Carp 算法实现起来非常繁琐 , 使得 ICPC 中一直不出现任意图匹配的题目 ( 即使有也是规模非常小 ). Vijay Vazirani 的论文 <<matching is as easy as matrix inversion>> 中给出了一种通用的通过矩阵求逆而求各种匹配的算法 , 虽然该算法实现起来有一个难点 , 但相信将会被一些选手采用 , 从而出现一些任意图匹配的题目 , 甚至更困难的 exact match( 该问题目前没有 deterministic polynomial-time algorithm, 但用上面的方法可以得出一个概率算法 ).
而一些新的领域也必将给 ACM ICPC 的出题者带来灵感 . 例如已有越来越多 Bio-informatics 的题目在 ICPC 中出现 . 一些有着多项式算法的好题目 , inversion distance of signed permutations, 则由于其理论的复杂而尚未出现在题目中 .
图论中还有数不胜数的好的题目 , 比如 linear time minimum cut, 还有 Gomory-Hu tree 的应用 , 这些也必将在不久的将来出现在 ICPC 题目中 .
我认为将发生的另一个趋势是 , 随机算法 , 概率算法和近似算法会在 ACM ICPC 中占更大的比重 , 至于对于算法能力和代码能力考验的平衡 , 我个人非常喜欢数学和算法 , 我希望 Final 的题目能向中欧赛区的题目靠拢 .
ACM ICPC 考察的不仅仅是对经典算法的理解和掌握 , 创造算法的能力同样非常重要 . 学那么多算法 , 必须从中有所领悟 , 才能在赛场上有灵感去解决实际的问题 .
如果大家有兴趣的话我可以找几个具体的问题详细分析 , 或是讨论一些具体的算法理论 . 同样的我也乐意分享一些 ACM 赛场上的经验 , 和在各大算法比赛中认识的一些有趣的人 , 和经历过的一些有趣的事 . 匆匆写完此文 , 疏漏之处在所难免 , 逻辑上也不甚连贯 , 希望大家见谅 .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值