一周学习总结3.15

这周主要学习树状数组和KMP算法

 

对于一般的数组a[1]…a[n],求和操作要O(n),修改的时间为O(1)。当重复进行m次修改再求和时,时间复杂度会达到O(m*n)。在m, n非常大的情况下是难以忍受的。

于是便产生了树状数组。利用一种很巧妙的方法使求和与修改都为O(logn)

基本操作包括求二进制数末尾0的个数lowbit(),修改plus(),求和sum()。具体就不描述了,百度或google

一般情况下树状数组可对一个点进行修改,对区域求和。经过变化之后可对区域修改,求一个点。可以方便的拓展到二维。代码短小精悍,是一种相当优美的算法。只是应用范围较窄,不及线段树。

 

至于KMP,大致明白了算法的原理与过程。但很不清晰。串处理的题目也不多,决定放一放。

 

这周做的题。

POJ 2352 STARS:树状数组的入门题。因为输入是按Y升序,所以没有比当前位置更高的,那就只要判断X坐标。存在一个逻辑数组a存储每个x0<=x<=32000)处的星星数。设输入的为x1,那么当前星星的level就是a[0]+…+a[x1]。用树状数组管理总数。每次输入求和并更新数组。最终的时间复杂度是O(N*log(32000))。值得注意的地方是输入的坐标可能等于0。而树状数组在下标为0的情况下会死循环。让我贡献了一次TLE。解决方法是将输入的坐标自加1。保证全部大于0

 

POJ 3321 Apple Tree:后面使用树状数组。关键是怎么把题目给的树转化成一个顺序存储的数组。要先使用深度优先算法(DFS)遍历树。

 

POJ 1195 Mobile phones:求二维数组一个矩形范围内的和。关键在于怎么加快速度。想了很久。在一维树状数组中,我们先计算一部分和以加快后面的求和过程。分段的依据是一维数组下标。二维其实也是相同的,先计算一部分矩形区域内的和,方便之后的求总。 直接将一维的坐标公式拓展到二维,对四个矩形区域分别求和,然后利用容斥原理就能得到所求矩形区域的和。重要的是不要被一般的二维数组给束缚了思路。二维树状数组在逻辑上与普通二维数组是完全不同的。

 

POJ 1298 The Hardest Problem Ever:貌似水题……很简单,就是一个凯撒密码问题,对输入的字符串进行位移操作再输出。

 

POJ 2155 Matrix:题目要求修改一个区域,然后求一个元素的值。貌似和树状数组的功能完全相反。但这题,应该说这个思路的精妙之处就体现在这里。我认为关键是要理解“树状”的概念。画一个一维的树状数组图形,就会发现所有的元素都会链接到2,4,8,16,32……这条“主干”上来。那么,修改了“主干”,其实就相当于修改了整个“树”。对于每个元素a,“主干”可以分为两个部分,Up(a) = { a1 = a, a2 = a1+ lowbit(a1), a3 = a2 + lowbit(a2), ... } Down(a) = { a1 =a, a2 = a1 -lowbit(a1), a3 = a2 - lowbit(a2), ... }。当然这里不是完全的对应主干上的每个元素。对于任意a<bup(a)down(b)的交集都只有一个元素。若要对[a,b]内的元素进行+n操作,只要down(a-1)的元素-n, down(b)的元素+n就好了。设a<=c<=b,查询c时则对up(c)进行求和。因为up(c)down(b)只有一个共同元素,所以可以完整的体现修改。以上是一维的情况。可以非常直接的推论到二维。只要对x, y坐标同时updown。理解了上面的思路,这题就迎刃而解了。

 

POJ 1163 The Triangle:没什么好说的,陶同学发现此题,他在完全不知道DP是什么的情况下AC了。而且用的就是DP的思路。说明DP还是很“亲民”的嘛~可是我还是完全不理解。

 

POJ 3176 Cow Bowling:和1163完全相同的……汗一个。把上面代码中数组的规模改一下就AC

 

基本上就是这样了。昨天参加了武大的预选赛,实话说题目不难,可成绩还是很不理想。觉得应该是基础的东西没掌握。接下来会把重心放在基本的算法与思想上。先动态规划,然后图论,数论。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值