📜  如何为ACM – ICPC做准备?

📅  最后修改于: 2021-06-26 18:14:14             🧑  作者: Mango

ACM ICPC(A ssociation对于C omputing中号achinery –国际电信联盟çollegiate P AGC软件Çontest)是一个全球性的年度多层次的编程大赛正在组织了超过13年。比赛由IBM赞助。

本文重点讨论对竞争性编程重要的所有主题,尤其应该研究哪些主题,以便为即将到来的ACM-ICPC竞赛训练自己。

竞赛规则-2017年世界决赛规则请点击此处

印度参与者– Codechef负责所有印度地区的活动。单击此处了解团队组成,报销等信息

CodeChef编写的ICPC for Schools –该竞赛是学生与印度各地举行的ICPC大学参加者一起参加ACM ICPC竞赛的门户。这是CodeChef构思并得到Amrita大学支持的想法。

ICPC问题样本:常见的ICPC问题具有以下特征:

  1. 问题陈述:描述问题以及要生成的输出。
  2. 输入:请确保您已仔细阅读本节,因为遗漏任何次要细节可能会使您陷入错误的答案区域。
  3. 输出:就像上面一样,这一点也应该仔细阅读。
  4. 约束:这些约束可以包括对输入,时间,内存,代码大小等的约束。
  5. 时间限制:查看您的算法是否可以在此范围内工作。如果没有,那就该改变了!
  6. 内存限制:如果您喜欢为每件小事分配内存,那么现在是更改内存的好时机。

准备ACM-ICPC

首要步骤:实践–以下是在实践ACM-ICPC竞赛和问题时可以参考的资源。对于所有这些OJ,首先要解决提交量最大的问题,然后检查其他解决方案以检查您可以如何改进。参加他们的每月竞赛以保持最高水平。

  • ACM-ICPC过去的问题– ICPC存档,Codechef的实践
  • TopCoder –通过逐步增加问题级别来进行
  • Codeforce-问题集列表
  • Codechef –初学者可以从Codechef初学者开始,并进一步进行
  • SPOJ –从容易的问题转变为棘手的问题
  • USACO –优秀的培训资源
  • uvaOnline法官–大量问题
  • Hackerrank –明智地练习问题并参加预备系列
  • Hackerearth –参加预备系列
  • 练习–适合初学者。遇到的问题从难度级别学校到困难。
  • 全年在线提供各种竞争性编程竞赛的列表

要学习什么?

对于ACM ICPC的追求者而言,仅了解编程的基本知识将无法取得丰硕的成果。人们还需要对所使用的高级算法有透彻的了解。后续主题列出了必定必须知道的必要主题和算法,以提高并在实际竞争中有机会。

竞争性程序设计

基本数据结构:要开始竞争性编程,必须掌握数据结构。以下是最常用的数据结构列表:

  • 大批
  • 队列
  • 细绳
  • 杂凑
  • 广泛的数据结构清单

先进的数据结构
优先级队列,联合查找集,(增强的)间隔树,(增强的)平衡BST和二进制索引树

  • 二叉索引树或Fenwick树
  • 段树(RMQ,范围总和和延迟传播)
  • KD树(请参阅插入,最小值和删除)
  • 联合查找不相交集(循环检测以及按等级和路径压缩)
  • 尝试
  • 间隔树

更高级的数据结构。

排序和搜索:集中精力学习基本概念,并熟悉所有可用的库函数。

  • 二元搜寻
  • 快速排序
  • 合并排序
  • 订单统计

字符串操作:字符串也会使编程问题变得有趣且困难,这可能就是在此类比赛中广泛使用它们的原因。实际上,学习String的库函数非常有帮助(C++:请参见Java的String)。

  • KMP算法
  • 拉宾·卡尔普
  • Z的算法
  • Aho Corasick字符串匹配

选择正确的语言:到目前为止,在编程竞赛中,C++是最受欢迎的语言,其次是Java ,但是您应该始终选择自己喜欢的语言。对任何一种语言保持自信是最重要的。

标准模板库:一个典型的库,特别是对于那些使用C++作为编码语言的库

  • 通过Topcoder上电C++ STL –第1部分,第2部分
  • C++魔术师– STL算法

动态编程

  • 最长公共子序列
  • 最长递增子序列
  • 编辑距离
  • 最小分区
  • 覆盖距离的方法
  • 矩阵中的最长路径
  • 子集总和问题
  • 游戏的最佳策略
  • 0-1背包问题
  • 装配线调度
  • 最佳二叉搜索树

所有DP算法

回溯

  • 迷宫中的老鼠
  • N皇后问题
  • 子集总和
  • m着色问题
  • 哈密顿环

有关回溯的更多文章

贪婪算法

  • 活动选择问题
  • Kruskal的最小生成树算法
  • 霍夫曼编码
  • 排序输入的有效霍夫曼编码
  • Prim的最小生成树算法

有关贪婪算法的更多文章

图算法:如果准备ACM – ICPC,则是不可忽视的最重要主题之一。

  • 广度优先搜索(BFS)
  • 深度优先搜索(DFS)
  • 从源到所有顶点的最短路径** Dijkstra **
  • 每个顶点到另一个顶点的最短路径**弗洛伊德·沃舍尔**
  • 最小生成树** Prim **
  • 最小生成树** Kruskal **
  • 拓扑排序
  • 约翰逊算法
  • 图形中的关节点(或切点)
  • 图中的桥梁

所有图算法

基础数学

算术程序员必须知道如何在内部表示整数和实数,并且应该能够对高精度数字进行编码。位操作技巧和了解数字基本算术的库函数将非常有帮助。

数论:了解其中一些概念可以节省比赛中的编程时间和精力。

  • 模幂
  • 模乘逆
  • 原始性测试|套装2(Fermat方法)
  • 欧拉的Totient函数
  • Eratosthenes筛
  • 凸包
  • 基本和扩展的欧几里得算法
  • 分段筛
  • 中国余数定理
  • 卢卡斯定理

组合法:虽然直接接缝可能并不重要,但是组合法对于估计算法的渐进复杂性很重要。

  • 算法分析
  • 组合博弈论|设置1(简介)

几何算法

  • 凸包
  • 格雷厄姆·斯堪
  • 线相交
  • 矩阵求幂与此
  • 在线构建3-D凸包
  • Bentley Ottmann算法列出n个线段的所有交点
  • 旋转卡尺技术
  • 矩形结合的面积/周长
  • 最接近的一对
  • 圆环联盟地区
  • Delaunay三角剖分的n点
  • 使用财富算法的n点Voronoi图
  • 指出多边形问题

网络流算法

  • Maxflow Ford Furkerson Algo和Edmond Karp的实施
  • 最小切
  • 稳定的婚姻问题
  • Dinic最大流量算法和Wiki
  • 最低成本流问题
  • 连续最短路径算法
  • 循环取消算法
  • 最大加权二分匹配(Kuhn Munkres算法/匈牙利方法)
    • 匈牙利算法Wiki
    • 分配问题的匈牙利算法
    • 最大二分匹配
  • Stoer Wagner最小割算法
  • 一般图中的最大匹配(开花收缩)
  • 果树-胡树
  • 中文邮递员问题(也请参阅此)
  • 用于最大匹配的Hopcroft–Karp算法

关于几何算法的所有文章

更高级的东西

位算法,随机算法,分支定界,数学算法,重光分解,A *搜索

您可能想阅读的内容丰富的文章

  • 竞争编程的绝妙清单– Codeforces
  • 解决比赛中所有C++问题所需的算法是什么? – Quora
  • 准备ACM-ICPC的最佳书籍和网站– Quora
  • 编程竞赛简介– Stanford.edu
  • ACM-ICPC的世界最终问题– icpc.kattis

参考:
编程营课程提纲

如果您希望与行业专家一起参加现场课程,请参阅《 Geeks现场课程》和《 Geeks现场课程美国》。