暑假集训总结

暑假集训这就结束了,这个暑假算是上学以来最充实的一个暑假了,一个暑假除了休息的两个周之外,都在好好的学习,虽然每天从早坐到晚,一直在电脑面前冥思苦想,一遍遍的问自己“我到底错在哪了”,但还是有好多的收获,学习到了知识,提高了自己写代码的能力,锻炼了思考问题的能力,而且还提前体验一把码农的感觉,近一个月的时间,沉浸在学习中无法自拔。不知不觉,到了总结的时候了,总结一下整个集训的收获。

这次集训,先是复习了搜索、图论、二分的知识,之后又学习了单调队列、单调栈、树状数组。所有知识分成几个专题,做题目熟悉这些知识。总结这次集训学到的新知识,再给自己加深一次印象。首先是搜索、最小生成树、最短路径、二分:搜索可是老知识了,从上学期就在学习,这个暑假又能有机会在通过题目来熟悉搜索的题型,做搜索的时候,首先要审清题意,尽可能发现隐藏的条件,判断好深搜与广搜,深搜与广搜在用图上很大的区别,深搜一条路走到黑,一般用于寻找多个解,做深搜题目要判断好剪枝,可一有效的优化代码,同时判断好剪枝的范围和题目的要求,判断返回条件。广搜常用于寻找单一的最短路线,或者最小规模的路径搜索,广搜是一层一层的往下搜,保证当前搜到的都是最优解,不需要回溯,找到最优值可以直接结束输出。

图论最后的知识是在上学期最后一节课的时候学习的,当时学的比较浅,这次集训好好的学习了一下,并且通过题目熟悉了最短路径的各种算法。

最小生成树:联通图G的一个子图如果是一棵包含G的所有顶点的树,则该子图称为G的生成树生成树是联通图的极小连通子图。所谓极小是指:若在树中任意增加一条边,则将出现一个回路;若去掉一条边,将会使之编程非连通图。生成树各边的权值总和称为生成素的权。权最小的生成树称为最小生成树,常用的算法有prime算法和kruskal算法。prime算法基本思想就是先清空生成树,任意取一个定点加入生成树。然后在那些一个端点在生成树里,另一个端点不在生成树里的边中,取一条权值最小的边,将它和另一个端点加进生成树。一直重复二步骤,知道所有的顶点都放进了生成树中为止,到此生成树就是最小生成树。最短路径问题是在寻找图中两节点之间的最短路径。常用的算法有floy算法、dijkstra算法、bellman-ford算法、spfa算法。不同算法之间有各自的优缺点:

floy算法是最简单的最短路径算法,可以计算任意两点之间的最短路径,算法复杂度是O(N^3),而且适应于出现负边权的请况。算法的基本思想:通过三重循环,第一层循环中间点k,第二、第三层循环起点和终点i、j,如果点i到k的距离加上点k到点j的距离小于原先点i到点j的距离,那么就用新的路经长度来更新原先点i到点j的距离,当循环完毕之后任意两点之间的距离都被更新为两点之间的最短路径。用floy算法要注意的是初始化时把不相连的点距离设为很大的数,其次floy算法虽然很容易理解,但算法复杂度较高。

dijkstra算法用来计算一个点到其他所有点的最短路径的算法,是一种单源最短路径算法,只能计算起点只有一个的情况,算法复杂度是O(N^2),它不能处理存在负边权的情况。算法的主要思想:开始将起点到起点的距离标记为0,然后进行n次循环,每次找出一个到起点距离最短的点,将此点标记,然后枚举其他点到此点的距离,其他点到此点距离加上此点储存的距离值如果更小,更新此点距离值,至循环结束,求得起点到每个点的最短路径。学习dijkstra算法结合图来学习,会更加的简单易懂。

bollman-ford算法是用来计算从一个点到其他所有点的最短路径的算法,也是一种单源最短路径算法,能够处理存在负边权的情况,但无法处理存在负权回路的情况,算法复杂度O(NE),N是顶点数,E是边数。bollman-ford算法基本思想和dijkstra算法差不多,但是要枚举所有边,不能枚点,而且bollman-ford,存在负权回路无法求出最短路径,但能够判断是否存在负权回路,在算法的两重循环完成后,还存在某条边使得:dis[u]+w<dis[v],那么就存在负权回路。最后一个sofa算法就是bellman-ford算法的一种队列实现形式,一个优化的算法,减少了不必要的冗余的计算。主要思想:将起点加入队列,每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将其入队。直到队列为空时算法结束。形式上和广搜类似,不同就在于光搜的时候一个点出了队列就不再放进队列,而spfa算法中一个点可以在出队之后再次被放进队列。

二分的知识和搜索一样上学期就已经学过,这次也是再熟悉个中题型,发现做二分题目时遇到的问题,做二分的时候主要就是要就是找到怎么应用二分,分的关键,确定判断的条件,以及两个端点的更新。做二分的时候有些问题要注意,精度的问题,精度的大小也会影响到答案的判断,做二分专题的时候很多题目总是tle,要注意输出的形式,用c输出还是c++各有特点,特别是对于保存小数的题目,有些题目用c输出会超时用c++再加上 iOS::sync_with_stdio(false);便能通过。二分判断的时候对等于情况下端点的修改需要注意。

单调队列,理解很简单,就是指队列中的元素单调,队首和队尾的元素可以进行出队操作,只有队尾可以进行入队操作。单调队列常用的操作:插入,若新元素从队尾插入后会破坏单调性,则删除队尾元素,直到插入后不再破坏单调性为止,再将其插入单调队列。获取最优值:访问队尾元素,获得最大或者最小值。单调栈与单调队列相似,栈是后进先出,单调性指的是严格的递增或者递减,单调栈的性质:若单调递增栈,则从栈顶到栈底的元素是严格递增的,若是单调递减栈,则从栈顶到栈底的元素是严格递减的;越靠近栈顶的元素越往后进栈。

单调栈与单调队列不同的地方在于栈只能在栈顶操作,一次一般在应用单调栈的地方不限定它的大小,否则会造成元素无法进栈。做单调栈与单调队列的问题,找好逻辑关系,特别是一些要求记录数组位置的题目,在位置处理上要仔细的推算,需要多想,多在纸上走几遍思路,搞清楚逻辑关系。

最后就是学习了一个周又做了一周题的树状数组,树状数组不太好理解,看了整整一周的博客,研究各种题型,搞明白代码的原理。树状数组是一个查询和修改复杂度为log(n)的数据结构,主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单的修改可以在log(n)的复杂度下进行范围修改,但是这是只能查询其中一个元素的值。树状数组基本可以分为几种题型:树状数组基本应用、标记数组,单调更新、区间更新,单点查询、单点更新,删除元素、区间更新,区间求和、二维树状数组区间更新,求和等等。二维数组可以说是一种优化手段,做二维数组问题需要先从其他方面考虑问题如何处理,形成思路后用树状数组处理优化。一般树状数组应用到归并排序求逆序、离散化处理、离线处理、dp、二分等技巧来处理题目。树状数组的题目做的基本题型比较多,专题里剩下的题目都是要考虑其他方面的问题再应用树状数组来优化的题目了,对于这方面还需要加强,应用树状数组来优化还没太头思路。

近一个月的集训,除了平时的联系还有好多训练赛,一次次练习赛也能看出自己有些进步,在处理问题的方面有进步,常见的一些问题能很快想到并解决。在集训期间还参加了一次ccpc网络赛打了个酱油,那一道题目因为一个小细节让难为了我们一下午,可见写代码的时候细节处理要注意。通过这次集训,体会到了码农的感觉,同时也学习了不少新的知识,关键是锻炼了写代码的能力,而且做题目时候遇到各种问题,锻炼了对问题的处理能力,也积累了很多处理问题的经验,见识了各种题型,熟悉了比赛的感觉,感觉自己收获很多。

暑假集训就要过去了,以后的不能像暑假这样一天扑在代码上,但依然不会懈怠,会好好听老师安排,学好各种知识。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值