暑假训练总结



社会实践调查报告

 

 

 

 

 

 

 

 

题目:关于暑假ACM训练的实践与总结

专业班级:数学与应用数学专业1班

姓名:李双智 学号:20164249

 

 

2017 8 25

 

 

 

 

 

【摘要】 3

1.树状数组和图论 4

2.二分三分以及单调队列 5

3.树状数组与单调队列 5

4.总结 6

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

【摘要】本文主要总结了这个暑假ACM实践的主要内容,以及综述了一些小的经验教训等等。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.树状数组和图论

这个假期的训练从7月31号开始到今天算是接近尾声了。回想起来每天都很充实,从日常的训练,到周二,周四打比赛,从一开始的活力满满,到现在甚至感觉有些疲惫,但是还是快乐的,因为大家在一起努力,这个假期也算是没有浪费。

这次训练的一开始复习了搜索和图论的相关的内容,我们大致熟悉了一下很长时间没有摸的代码。对于搜索这方面,大致分为两块的内容,第一方面是dfs,第二方面是bfs,dfs就是深度优先搜索,顾名思义就是一搜到底,一般这种搜索的目的是搜最终的结果,dfs里面大部分题目有固定的搜索次数,而搜索的次数就是递归的过程,也就是常见的dfs(int t)这种类型,当t达到某个值的时候判断这个结果是否有效(也就是符合最终的结果,比如到达某个点,或者是找到的是否符合条件),然后回溯回到上一个状态(回溯的过程需要恢复到搜索前的状态,若不恢复,就会造成混乱),在进行下一个状态的搜索。而bfs则是广度优先搜索,顾名思义就是状态平等,层层下搜,用队列储存状态,并依次出队,而后搜索下一个状态,若满足,就进队,进行下一轮的搜索。这种搜索一般是处理路径查找问题或者最短路径的问题,基本模板就是queue<>qq;while(!Qq.empty());诸如此类。也就是一个队列,当队列不空开始出队和入队的判断,如果最短路径,搜到结果直接终止。

  而对于图论的相关内容,大致分为两大块,一种是最短路径的三大算法(以及一个算法的优化--spa算法)。另外一种就是最小生成树的两大算法。最短路径的第一个算法就是佛洛依德算法,简单暴力的三重循环查找,要领就是第一重循环代表了中介点,二三层表示起始点,判断路径的大小关系,不断进行更新即可。最短路径的第二个算法是一个速度极其快的算法,但是不能用来处理负环的相关问题,这种算法的基础就是点的松弛技术,是一种单源的最短路径的算法,思路就是以一个点为起点,开始更新,找到到这个点距离最小的点,然后查找这个点能到达的所有点,若距离缩短,则进行更新,更新完之后再进行下一轮的查找。最短路径的第三大算法就是spa算法,这个算法的思路也是更新,距离变小则入栈,出栈更新其他点,如此往复。这个算法的特殊用法就是判断负环是否存在(也就是判断一个点是否入栈次数大于n)。而对于最小生成树的第一个算法,也是用点更新距离,与最短路径第二个算法的不同之处,就是加不加原本的那段距离。最小生成树的第二个算法的思想则是利用的并查集的思想,一开始将边按照边的权值排序,小的在前面,然后进行搜索,若边的首尾不属于同一个区域,那么合并两个点的“祖宗”,total++。结束条件就是total=n-1。

2.二分三分以及单调队列

  接下来的一段时间我们复习了有关于二分三分以及单调队列的有关内容。对于二分三分,可以优化连续的线性问题时间复杂度log2n。难点在于知道怎么查,查什么(一般比较难的题目会混杂着数学公式的推导,以及证明这个函数的单调性,然后进行二分或者三分的查找),找到mid的含义,理解什么时候l=mid(l=mid+1),什么时候r=mid(r=mid-1),以及什么时候终止(这一点尤为重要,若判断不准,会导致结果的不精确性)。而对于单调栈的相关内容,大概就是满足条件进栈,否则弹出,单调递增头最小,单调递减头最大。最常见的几种题型就是:

  1. 区间移动,求区间最值。(这种题目的解决方案就是模板加head处理,如果head的值小于区间的左端点,那么head++,一直到head的值属于这个区间,那么这个head下存的东西就是这个区间内的最大(最小)的值)

  2. 求某个数两边有多少个比他大的(小的)。(这种题目就从两个方向建立单调队列,利用的是单调队列的一个性质,就是存储的是上一个比他大的(小的)值的值或者位置)

  3. 也就是第二个的变式,主要利用的就是单调队列里所存元素的含义。

       3.树状数组与单调队列

      最后我们又进行了为期一周的树状数组和线段树的相关内容的学习。我们对这块知识点十分的陌生,而且树状数组和线段树相关题目的难度较大,无论从理解题目方面亦或是做题方面都比之前来的慢而艰难的多。总的来讲树状数组和线段树都是处理区间问题的一种工具,可以用来优化算法的时间的复杂度,使得一些本该超时的算法得以通过。

      对于树状数组而言,它的核心就是lowbit(int x)函数建树,树状数组的元素之间的联系都是建立在这一个简单的位运算上,也就是return x&(-x),然后用add函数和sum函数完成更新和查找的操作,树状数组可以用来处理以下四类问题(目前我见过的比较典型的四类问题)。第一类问题,也就是树状数组的使用的初衷,点的更新,区间求和,这类问题就是一种最简单的模板题,用上述三种函数就可以完成,这类问题最典型的就是敌兵布阵。第二类问题就是用树状数组求逆序数,这种问题一般比较难想到,但一旦想到,处理起来也是一类模板的简单的问题。如果数据范围较大(比如数据大小达到了十亿),需要对数据进行离散化处理(结构体存边的权值以及他的位置,按权值排序,再按位置存到一个新的数组里面,然后用模板即可)。第三类问题就是区间染色问题,这类问题也算是一种模板,可以扩展到多维,是树状数组的脑洞更新应用类型,这种题的思路就是直接用sum存点被涂色的次数。第四类问题就是dp的优化问题,这种问题千变万化,但是大都于区间难脱干系。

      而对于线段树,它也是一种区间工具,可以处理比树状数组更为广泛的区间问题,但是相对的,付出的空间的代价更大,线段树大致可以处理以下几种典型问题:

  1. 单点更新,区间和查询。这类问题是线段树的模板问题,主要用来强化建树的方法等等。

  2. 单点更新,区间最大值查询。这类问题也是线段树的模板问题,更改树存的内容就可以了。

  3. 区间更新,单点查询(lazy标记大法,思路就是查询到正好的左端点和右端点,就return,不进行下一步的更新,将要更新的内容存下来,等到下一次用到的时候在进行更新)。这类问题也是一种模板问题。

  4. Dp的优化,和树状数组基本类似。

        4.总结

      总的而言,我们对知识点的学习较快,做题较少,更需要对知识点的理解。以上我对知识点的理解之中,明显感觉到我的自学部分做的并不太好,显得有许多疏漏,有很多东西都没有做到,知识点的遍及面也欠缺了很多。但这次的训练是我第一次花了一个暑假的时间自己学习知识点的一次经历,觉得自己有了很大的进步,做了一件更像一个大学生应该做的事情,步入大学,就应该学会如何自学,而不是等待老师的总结。而这一缺陷更需要我在日后的训练中加以弥补,杨恒赛后补题,查缺补漏的习惯,学会通过比赛的正规题目查找到自己学习的知识点还欠缺哪些,还有哪些应该会的用法我依然不会。而后,我认为学习比较重要的是知识点的反复,反复是一个十分重要的过程,尤其在编程这种细节极多的项目中。最近几次的比赛反映出来的,就是模板大致记住,细节处理欠妥,但这是十分致命的,出不了题目是次要的,这种似懂非懂,反而会影响自己的心态,导致往后的比赛无法正常的进行。因此更需要反复,记住其中的细节所在,也就是细节决定成败这句话的含义。

      而对于中间我和队友打的几场比赛,我认为前几场的效果相对较差,但是后面几场还是有些配合的,所以做起题来顺利了好多。比赛是一种团队活动,需要的是对队友的一种信任,支持,理解,这是第一位的,而后就是沉着处事,冷静应对,不能因为几发wr就自乱阵脚,更不能一言不合就吵架,这都是不好的。一开始的几场比赛我认为差劲就在队友之间的不和谐,合作失调,但最后调整之下还是好了很多。

      假期虽然过去了,但acm之路远远没有结束,希望明年的今天,我能更加自信的面对自己,面对acm的比赛。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值