【重要】ACM相关资料 2008年12月15日

时间:2022-06-27 12:55:04
注:办公室我的笔记本内桌面有ACM目录,内有相关资料(电子书、题解等),需要的同学可以随时去copy。我们的周末讨论暂定用 《算法艺术与信息学竞赛》学习指导作为教材

问:现在(第三学期)如何准备ACM?
答:先看数据结构,再看算法设计与分析。如果C++基础较好,可直接开始看 《算法艺术与信息学竞赛》学习指导 (完全针对竞赛,内含数据结构和算法及数学相关内容)

======================================

重点推荐
一本书: 算法艺术与信息学竞赛  (就是网上说的“lrj”,也称“黑皮书”,此书针对中学阶段的国家信息学奥赛,可用作ACM入门)
    pdf电子书: http://download.csdn.net/source/438429
    学习指导电子书: http://download.csdn.net/source/828907  强烈建议先看学习指导

一个网站: http://www.oibh.org/bbs/


其他书籍:

ACM 程序设计培训教程

数据结构书可以看清华严蔚敏那本(C语言就可以,旧书很多,数据结构在第4学期开课),数据结构网上资料 http://student.zjzk.cn/course_ware/data_structure/web/main.htm  (或在谷歌搜索“数据结构自考”)

新编实用算法分析与程序设计

国际大学生程序设计竞赛例题解 一共四本
    电子书(一)数论、计算几何、搜索算法专集: http://download.csdn.net/source/243043
    电子书(二) 广东省大学生程序设计竞赛试题 http://download.csdn.net/source/704716


其他网站:
http://www.nocow.cn/

浙大在线测试ZOJ:http://acm.zju.edu.cn/
    离线题库:http://download.csdn.net/source/829282
    题解:http://download.csdn.net/source/829343
北大在线测试POJ: http://acm.pku.edu.cn/


==================================

关于ACM-ICPC竞赛

  概况

  ACM国际大学生程序设计竞赛(ICPC)的历史可以上溯到1970年,当时美国德州A&M大学举办了首届竞赛,主办方是UPE计算机科学荣誉协会Alpha分会。作为一种发现和培养计算机科学这一新兴领域顶尖学生的全新方式,竞赛很快得到了美国和加拿大多所大学的积极响应。

  总决赛整个竞赛为5个小时10道题,由计算机出题,3人一组的参赛队伍必须现场作答。经由裁判评判,根据破解试题数目的多少对参赛队伍进行排名,解题数在中等以下的队伍会得到确认但不会进行排名。根据排名将最终确定全球总决赛铜奖4名、银奖4名、金奖4名,金奖中第1名为此次比赛的全球总冠军。每届ACM/ICPC竞赛都是精英荟萃、新才辈出,因而倍受全球著名信息企业的高度关注,在过去几年中,APPLE、AT&T、MICROSOFT和IBM分别担任了竞赛的赞助商。

   ACM/ICPC是世界各地计算机程序设计者大显身手的舞台,也是世界一流大学展现教育成果的最佳窗口。*高校从1996年开始参加ACM国际大学生程序设计竞赛亚洲预赛,上海交通大学作为最早参加的高校之一,曾七次进军ACM/ICPC全球总决赛,并在2002年赢得了在夏威夷举办的第27届ACM/ICPC全球总决赛冠军,这是中国大学的第一次夺冠,更是亚洲高校的第一次夺冠。上海交大还于2005年获得由上海交大承办的第29届ACM的冠军。

   1 背景与历史
   1970年在美国texas a &m大学举办了首次区域竞赛,从而拉开了国际大学生程序设计竞赛的序幕。1977年,该项竞赛被分为两个级别——区域赛和总决赛,这便是现代acm竞赛的开始。在亚洲、美国、欧洲、太平洋地区均没有区域赛点。1995至1996年,来自世界各地的一千多支s代表队参加了acm区域竞赛。acm大学生程序设计竞赛由美国计算机协会(acm)举办,旨在向全世界的大学生提供一个展示和锻炼其解决问题和运用计算机能力的机会,现已成为全世界范围内历史最悠久、规模最大的大学生程序设计竞赛。

  2  竞赛组织
   竞赛在由各高等院校派出的3人一组的队伍间进行,分两个级别。参赛队应首先参加每年9月至11月在世界各地举行的“区域竞赛(regional contest)”。各区域竞赛得分最高的队伍自动进入第二年3月在美国举行的“决赛(final contest)”,其它的高分队伍也有可能被邀请参加决赛。每个学校有一名教师主管队伍,称为“领队”(faculty advisor),他负责选手的资格认定并指定或自己担任该队的教练(coach)。每支队伍最多由三名选手(contestant)组成,每个选手必须是正在主管学校攻读学位并已读完至少一半时间的学生。每支队伍最多允许有一名选手具有学士学位(就是说至少有两个还没有取得学士学位),已经参加两次决赛的选手不得再参加区域竞赛。

  3 竞赛形式与评分办法
   竞赛进行5个小时,一般有6—8道试题,由同队的三名选手使用同一台计算机协作完成。当解决了一道试题之后,将其提交给评委,由评委判断其是否正确。若提交的程序运行不正确,则该程序将被退回给参赛队,参赛队可以进行修改后再一次提交该问题。程序运行不正确是指出现以下4种情况之一:
   (1)运行出错(run-time error);
   (2)运行超时〔time-limit exceeded);
   (3)运行结果错误(wrong answer);
   (4)运行结果输出格式错误(presentation error)。
   竞赛结束后,参赛各队以解出问题的多少进行排名,若解出问题数相同,按照总用时的长短排名。总用时为每个解决了的问题所用时间之和。一个解决了的问题所用的时间是竞赛开始到提交被接受的时间加上该问题的罚时(每次提交通不过,罚时20分钟)。没有解决的问题不记时。美国英语为竞赛的工作语言。竞赛的所有书面材料(包括试题)将用美国英语写出,区域竞赛中可以使用其它语言。总决赛可以使用的程序设计语言包括pascal,c,c++及java,也可以使用其它语言。具体的操作系统及语言版本各年有所不同。

  4 竞赛奖励情况
  总决赛前十名的队伍将得到高额奖学金:第一名奖金为12000美元,第二名奖金为6000美元,第三名奖金为3000美元,第四名至第十名将各得到l500美元。除此之外还将承认北美冠军、欧洲冠军、南太平洋冠军及亚洲冠军。

==============

浅谈ACM /ICPC的题目风格和近几年题目的发展
作者:王颖    文章来源:ACM组委会    点击数:359    更新时间:2008-10-9

ACM ICPC的比赛形式一般是五个小时八个题目,综合考察选手的数学能力、算法能力、coding能力和debug能力,还有团队配合能力。数学方面主要强调组合数学、图论和数论这三个方面的能力;而算法的覆盖范围很广,涉及了大部分经典的算法,和少量较前沿的算法。由于每道题目都需要通过所有的测试数据才能得分,并且需要精确解,这限制了Approximation algorithm在一些NP-hard的题目中的运用,从而使得搜索和剪枝策略对于NP-hard的题目非常重要。

Final的题目和Regional题目的比较

ACM ICPC官方的正式比赛可分为World FinalRegional Contest两种。Final的题目更加正统和严谨,强调算法的综合运用,一个题目往往需要几种算法的结合。从这几年的final的题目看,final加大了题目的代码量,对代码能力的要求有所增强。而Regional的题目则更加灵活,同时每个赛区也有自己的出题风格。欧洲赛区的题目以高质量出名,对算法和数学的强调甚至超过了World Final;美国的赛区较多模拟题,强调代码量。而亚洲则介于两者之间,同时由于每年都有一些新的赛区,所以并没有很固定的模式。

下面浅谈一下近几年ACM ICPC的题目的覆盖面。一些常规的算法和题型没什么好讲的,下面主要侧重一些新颖的知识点或题型,或是一些较前沿的内容。

数学的新题型

除了一些基本的组合数学和组合数论的问题,近年来概率和Combinatorial Game Theory的题目逐渐增多。很多有趣的题目都是以Markov Process为背景,需要用到一些相关的知识。

去年国内杭州赛区的一个很有趣的题目是,给出一个字符集(比如{A,B,C})和一个字符串T(比如ACBBCAC),现在从一个空串S开始,每次等概率的添加A,B,C中的一个字符,直到TS的一个子串。问得到的字符串S的长度的期望。这是一个典型的Markov Process,其解可以用生成函数很优美的算出来。一个更有趣的版本是,假如还有另一个字串R,当S中出现T或者R就终止,问终止在TR的概率各是多少。这个问题在Graham, Knuth, Patashnik合著的Concrete Mathematics里面有详细的分析,并有着一个优美的结论。

Game theory方面,主要是经典的combinatorial game theory而比较少Zero-sum gameNash 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的方阵,其中每个元素都是1n之间的整数,并且两两不等,同时使得每行、每列还有两个对角线的和两两不等。这题的构造颇为繁琐,最简单的方法是直接随机生成再判定是否具有这个性质。

近年来几乎每年的final都有一道考察选手微积分能力的题目。而微分方程类题目较少。

大型线性方程组、复杂的矩阵代数、和特征值求解方面的题目较少。

算法的新题型

算法方面的增强主要体现在新的数据结构不断被选手所熟悉,和一些新领域的题目出现在ACM ICPC中。

数据结构方面,一些特殊性质的平衡树逐渐被大家掌握,如splay treeleftist tree等等。Interval tree则被广泛用于计数。字符串方面,较容易实现的后缀树组也逐渐被接受。

一些算法:网络流方面,不少选手开始掌握push-relabel算法而放弃了经典的ford-fulkerson算法;刘汝佳的书广为传阅后,不少选手又掌握了fractional programmingdinkelbach算法。目前能熟练实现linear programming的选手较少,但可以预计过一段时间这也会成为必备的技能。

计算几何一直是ACM ICPC里面的难题。不仅编程困难,更由于精度问题导致非常难做对。计算几何往往是在比赛时被放弃的题目。即使算法并不非常难,选手也不敢随意去做。

一些零散的经典内容也被拿出来考察,如stable marriagefft等。

总结和一些预计

基本上,实现起来不算太复杂的多项式时间复杂度的算法都可以出成一道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 timeminimum cut,还有Gomory-Hu tree的应用,这些也必将在不久的将来出现在ICPC题目中。

我认为将发生的另一个趋势是,随机算法,概率算法和近似算法会在ACM ICPC中占更大的比重,至于对于算法能力和代码能力考验的平衡,我个人非常喜欢数学和算法,我希望Final的题目能向中欧赛区的题目靠拢。

ACM ICPC考察的不仅仅是对经典算法的理解和掌握,创造算法的能力同样非常重要。学那么多算法,必须从中有所领悟,才能在赛场上有灵感去解决实际的问题。