[转]浅谈ACM ICPC的题目风格和近几年题目的发展

斯坦福大学 王颖

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

时间: 2024-08-09 14:48:29

[转]浅谈ACM ICPC的题目风格和近几年题目的发展的相关文章

浅谈Verilog HDL代码编写风格

消失了好久,没有写文章,也没有做笔记,因为最近再赶一个比赛,时间很紧,昨天周六终于结束了,所以趁着周末这会儿有时间,写点东西,记录下来.首先我学习FPGA才一年多,我知道自己没有资格谈论一些比较深层次的问题,对于这个行业来说可能我才是一直脚踩在门外面.所以这篇文章是写给一些刚开始学习FPGA.Verilog HDL的同学,我看过一些大神写的代码,然后尽量模仿大神写法,经过好几个大神的影响和自己的习惯摸索,最终算是总结出了一套自己的代码书写风格,当然我的代码风格还是一直在进化中.现在将自己的一些经

ACM/ICPC算法训练 之 数学很重要-浅谈“排列计数” (DP题-POJ1037)

这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列计数 的方法,虽然排列计数的思路简单,但却是算法中一个数学优化的点睛之笔. Poj1037  A decorative fence 题意:有K组数据(1~100),每组数据给出总木棒数N(1~20)和一个排列数C(64位整型范围内),N个木棒长度各异,按照以下条件排列,并将所有可能结果进行字典序排序 1.每一

【ZOJ】3785 What day is that day? ——浅谈KMP应用之ACM竞赛中的暴力打表找规律

首先声明一下,这里的规律指的是循环,即找到最小循环周期.这么一说大家心里肯定有数了吧,“不就是next数组性质的应用嘛”. 先来看一道题 ZOJ 3785 What day is that day? Time Limit: 2 Seconds      Memory Limit: 65536 KB It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days? Input There are multiple tes

辛星浅谈PHP的混乱的编码风格

我们都知道,各种编程语言都有自己的风格,即使是像C和C++那样一脉相承的语言(C++本意完全兼容C的语法),编程风格上还是有些差别,比如很典型的就是C++风格的单行注释和C风格的多行注释. 而虽然Java在很大程度上借鉴了C的语法,但是不可否认,Java的经典的大括号是左大括号是在类名或者函数名等同一行的,而C++风格的则是大括号另起一行,可能有些Java程序员和C++程序员这两种风格都用,但是如果大家多看看大师的编码风格,会发现其实大括号另起一行是典型的C++的风格,大括号不另起一行是典型的J

浅谈Kotlin(二):基本类型、基本语法、代码风格

浅谈Kotlin(一):简介及Android Studio中配置 通过上面的文章,在Android Studio中我们已经可以进行Kotlin编程了,接下来开始学习Kotlin的基本类型及语法. 一.基本类型 在 Kotlin 中,所有变量的成员方法和属性都是一个对象. 一些类型是内建的,它们的实现是优化过的,但对用户来说它们就像普通的类一样.   注意,第一个字母大写,Kotlin 区分大小写 主要是以下几种字面值常量: --数型: 123 --长整型要加大写 L : 123L --16进制:

浅谈欧洲算法——模拟退火

初听说退火这个名词感觉就很(zhuang)帅(A__CDEFG...) 直到学了退火之后,我才发现: 退火不只是帅,而且非常万能 甚至比 D (大) F (法) S (师)还要万能 简直就是骗(de)分神器啊 简介 作为一个计算机算法,它竟然在百度上有物理词条! 当时我看了就懵了,你说计算机一个算法,跟冶炼金属有什么关系啊? 后来我看了算法的词条... 是不是更懵了... 方便大家理解(变得更懵),我搬了百度上的定义: Simulate Anneal Arithmetic (SAA,模拟退火算法

《ACM/ICPC 算法训练教程》读书笔记一之数据结构(堆)

书籍简评:<ACM/ICPC 算法训练教程>这本书是余立功主编的,代码来自南京理工大学ACM集训队代码库,所以小编看过之后发现确实很实用,适合集训的时候刷题啊~~,当时是听了集训队final的意见买的,感觉还是不错滴. 相对于其他ACM书籍来说,当然如书名所言,这是一本算法训练书,有着大量的算法实战题目和代码,尽管小编还是发现了些许错误= =,有部分注释的语序习惯也有点不太合我的胃口.实战题目较多是比较水的题,但也正因此才能帮助不少新手入门,个人认为还是一本不错的算法书,当然自学还是需要下不少

2014 ACM/ICPC Asia Regional Guangzhou Online Wang Xifeng&#39;s Little Plot HDU5024

一道好枚举+模拟题目.转换思维视角 这道题是我做的,规模不大N<=100,以为正常DFS搜索,于是傻乎乎的写了起来.各种条件限制模拟过程 但仔细一分析发现对每个点进行全部八个方向的遍历100X100X100^8 .100X100个点,每个点在走的时候8中选择,TLE 于是改为另一个角度: 以符合要求的点为拐弯点,朝两个垂直的方向走,求出最远的距离.这样只要对每个点各个方向的长度知道,组合一下对应的就OK. 避免了每个点深搜. PS:搜索的时候x,y写反了,导致构图出现问题,以后用[dy][dx]

HDU 5014 Number Sequence(2014 ACM/ICPC Asia Regional Xi&#39;an Online) 题解

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5014 Number Sequence Problem Description There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules: ● ai ∈ [0,n] ● ai ≠ aj( i ≠ j ) For sequence a and sequ