莞中OI集训游记
Written BY Jum Leon.
I
又是一载夏,本蒟蒻以特长生考入莞中,怀着忐忑的心情到了8月,是集训之际。怀着对算法学习的向往心情被大佬暴虐的一丝恐惧来到了莞中。
这里真是个好地方啊,座居莞城*,聚集四方灵气。伙食好,我们学习自然好。(廖老师超级友好的
正文
II
感悟
首先感觉在莞中学习真的十分幸运,这里学习的环境、氛围都很好。我们可以互相帮助,互相帮忙讲解不理解的题目,或是分享自己的方法。有廖老师带我们飞(强,组织我们讲解题目,重点难点廖老师会亲自给我们讲解。我觉得廖老师是一个很有耐心,很好的老师,他不仅仅帮我们细致的讲课,在我们做题时遭遇困难时会亲自帮忙讲解,审查代码,发现并且指出我们具体的学习上的错误,十分有利于我们对自己进一步的优化与学习。
在莞中每天早出晚归,觉得莞中的早餐大包特别好吃;清晨校门假山前的莲花锦鲤好看;傍晚南区的天空云彩十分灿烂;三尺讲台上的廖老师十分友爱。
收获
收获如秋日果园中累累硕果般。有好几方面的。
首先是学习上的。对于提高组的题目,题型有了一个更加完全的了解。
巩固了许多基础的数据结构。栈,队列,堆,链式前向星等数据结构。还有提高组十常用并且高效的并查集,哈希表等。还学习了C++特有的STL:动态vector数组,优先队列,重定义运算符等。
除了数据结构,我们主要学习的就是算法了,重新熟悉了深搜,广搜,在广搜专题中学习了特殊广搜题型的状态压缩,有关二进制的位运算,还有STL的queue应用,提高了我们对算法的认知。
学习并巩固了许多学过和没有学过的图论算法,最基础的最小生成树开始,了解了Prim和Kruskal的算法工作原理,以及哪个适用于稠密图,哪个适用于稀疏图。
三种常见的最短路算法,Floyd,Dijkstra,SPFA。从单源点到多源点。在结合题目的练习中总结了最短路算法的应用,还有vector应用于邻接链表的结构,在某些题目中单向边和反向边的应用。 用SPFA处理图中负边权和环的情况。
学习了堆的原理,操作和维护一个堆的方法,以及在最小生成树Prim算法和单源最短路Dijkstra算法中如何用堆优化时间效率。学习了并查集的原理和并查集的优化方法,以及在最小生成树Kruskal算法中应用并查集优化时间效率。还有拓扑思想和拓扑中的关键路径。
动态规划方面同样收获颇丰。从大量的题目中了解到了基础的动态规划算法的变形,如背包问题的变形,最大连续子序列和,最长不下降序列,最长公共子序列的变形。以及区间动态规划的巩固掌握,附加值动态规划的预处理,还有树形动态规划的初步。
最后就是离散思想的空间优化和高效,还有初等数论的学习。
期许
这段时间是我学习OI的好机会,期望自己在高一的NOIP中拿到一等奖。对于集训期间自己的表现满意,每天认真的Coding,在不懂的地方找同学老师讨论,理解透彻。对自己的期许就是在OI路上继续走下去,参加各大比赛,GDOI、GDKOI等,提高自己的思维高度,学习更多的算法,不止步于联赛。对于自己的许多不足,数论方面的薄弱,以及许多更高级数据结构,Splay,平衡二叉树等还需继续加油学习。
III
算法总结
注:超链接为内网链接,大部分的题可以在JoyOI或者洛谷等其他的OnlineJudge上找到
Day1:线性表
栈结构:先进后出。
习题:GZOI 1097 括号匹配的检查(初等栈),GZOI 1098 表达式计算(个位数的运算式)(进阶)。
高精度:原理特别简单,模拟手工运算。把模板背熟也很OK啊。
习题:GZOI 1008 【高精度与数制转换】求X的p次方(不知道算不算高精度)。
归并排序:拆分再拆分,最后组合。效率挺高
习题:GZOI 3427求逆序对
卡特兰数:递推实现,有可能会有高精度。第N个卡特兰数为
综合习题:GZOI 2273 number序列
Day2:深搜基础
深搜知识点:状态的传递,DFS剪枝
习题(较水):GZOI 3429 营救 ,GZOI 1214 排序集合
习题(进阶):GZOI 1027 驾车旅游, GZOI 1208 关路灯
Day3:广搜基础
广搜知识点:学会使用STL的queue
难点:广搜结合状态压缩,位运算
习题(较水):GZOI 1056 倒水,GZOI 1058 翻硬币
习题(进阶):GZOI 1240 黑白棋游戏 (状态压缩&位运算),GZOI 2268 这不是错误,而是特点(搜的比较复杂)
Day4:哈希与广搜
哈希知识点:%一个素数作为地址,将大化小,节省空间,查找效率高。
哈希模板题:Hash(理论基础)
值得一做的题:GZOI 2182师生树,GZOI 3730 马步问题,GZOI 3494树的最远距离
毒瘤题:GZIO 1241 魔板
Day5:最小生成树
最小生成树知识点:
- Prim算法:以一个点为中心,将所与之相连的边存入数组(可用堆或优先队列优化),再找出所有边中的最短边,扩张点,标记,在将与所有点相连未存入数组的边存入,重复扩张操作。
- Kruskal算法:将所有边按照边权为关键字排序,从小到大判断边的两段点是否连通。(可用并查集优化算法)
(掌握堆以及STL的优先队列的用法)
值得一刷的题:GZOI 3250 高速公路,GZOI 3723 Arctic Network,GZOI 3546 Truck History,GZOI 3547 Building Roads。
Day6:堆与并查集基础
堆知识点:堆排序:建立一个大根堆或者小根堆,将所有元素依次所有入队并且Shiftdown,输出时每次取堆顶元素,将堆底元素提到堆顶并且Shiftup。重复操作。
并查集知识点:查找操作&优化:从当前节点出发到父亲节点,将当前节点的父亲赋值给经过的节点的父亲。合并:将A和B合并,只需将B的根节点赋值给A的根节点的父亲即可。(详见GZOI 1520)
习题(堆):GZOI 1502 促销,GZOI 1503 序列和的前n小元素 。
习题(并查集):GZOI 1520 家族(理论基础)(模板题),GZOI 1521 银河英雄传说(noi2002)(毒瘤题)。
Day7:最短路
最短路基础算法dijkstra, floyd, bellman-ford, spfa.
关于最短路的题,要水的就很水,要难的也很毒瘤,但是A了以后就会感觉都是水题。
模板题:GZOI 1043&1044 dijkstra& floyd。
水题:GZOI 1454 哈利波特与魔法石,GZOI 1903 灾后重建,GZOI 3257 母牛跨栏。
稍微不水的题:GZOI 2103 消息传递问题,GZOI 3630 Party,GZOI 3509 邀请卡片。
值得一做的题:GZOI 3507 虫洞(SPFA),GZOI 2202 佳佳的魔法药水,GZOI 2277 时间与空间之旅。
Day8:拓扑排序与关键路径
拓扑知识点:在一个图中将入度为0的点依次剔除,并且将与之相连的边删除。(模板在GZOI 2240)
习题(普通拓扑):GZOI 2240 单挑排名(模板),GZOI 2281 烦人的幻灯片。
习题(关键路径):GZOI 3320 杂务,GZOI 2151 新校园
Day9:动态规划初步
知识点:背包问题,求最大连续子序列和,求最长不下降序列,求最长公共子序列。
Day10:经典动规问题
知识点:基础动态规划的变形以及理解
Day11:动规加强
知识点:区间DP,树形DP初步。
值得一做的题:GZOI 1084 糖果盒,GZOI 1088 邮局(IOI2000),GZOI 1089 多米诺骨牌(GDKOI2000),GZOI 1090 过桥问题(GDKOI2001),GZOI 1333 能量项链。
值得一做的树形DP:GZOI 2184 聚会的快乐
Day12:离散思想
知识点:点坐标,位置的离散化。
习题:GZOI 1562 矩形面积,GZOI 1561 幻灯片,GZOI 1563 Shaping Regions形成的区域,GZOI 1564 水塔水位。
不怎么毒瘤的毒瘤题:GZOI 1504 轮廓线(洛谷上的数据有误,我的代码GZOI上15ms)
Day13:初等数论(蒟蒻最怕
初等数论基础知识,素数问题,容斥原理,勾股定理,同余定理,其它数论基础。
Day14:完结撒花!!!