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
赛场上的经验
,
和在各大算法比赛中认识的一些有趣的人
,
和经历过的一些有趣的事
.
匆匆写完此文
,
疏漏之处在所难免
,
逻辑上也不甚连贯
,
希望大家见谅
.