现在的位置: 首页 > 综合 > 正文

[毅周总结]数据结构(1)

2013年10月12日 ⁄ 综合 ⁄ 共 979字 ⁄ 字号 评论关闭

    这周重新开始学习算法,先从数据结构开始。这个星期学的主要还是基础的数据结构,做的题主要集中在线段树和树状数组这个方面,但也看了其他的一些高级数据结构的算法,希望下周能够做些题。

   讲讲这周给我印象比较深的题:

   NO.1  poj 2155 Matrix

   这个题实际上是一个实际模型向算法模型转换的问题,可以把问题简化为一维的条件。假设现在翻转[a,b],可以再数组上把位置(a-1)-1,位置b+1,这样看一个点被翻转了几次,只要统计数组从位置1到这个点的位置的和就可以了。用树状数组实现就可以有log(n)的时间复杂度。这实际上一个统计问题。

 

  NO.2  War Field Statistical System (华东师范oj 1246)

    我觉得这一题更加体现了建立模型的重要性。因为题目肯定不会考你裸的算法,你要把一个实际问题转到一个可以用已知算法可以解决的模型上去,然后用算法高效率解决。

譬如说这题,在[a,b]添加防御为c的士兵,完全可以当成添加一个(a,1,b,c)的矩形(前两个数位左下角坐标后两个为右上角),删除时把(a,1,b,c)这样的矩形删除就行了,中间用到了矩形切割。但是哥虽然知道这点居然写起了2维线段树,但没想到怎么实现。后来换用了四分树,虽写出来了,但超了内存。后来看高手的代码发现没必要用什么数据结构,只需要把每次添加的矩形记下来,删除的时候遍历已知的矩形就可以了,因为矩形的数量就不多。这个方法听起来确实很显而易见,但我却没想到。哎,智商还是硬伤啊。

   这种解决问题的方法让我想到codeforces round#136 div2的第四题也就是div1的第二题。也没有用什么高级的算法,直接求出来所有满足条件的数据,然后依次更新就行了,智商拙计啊。

   NO.3  spoj 61 brackets

    对于一个括号序列我可以用一对数来表示(a,b) a表示序列左侧未匹配的右括号,b表示右侧未匹配的左括号,用线段树来计算每一段的序列就行了。然后一个大序列就可以通过它的两个子序列更新来完成。

  通过这周的学习,我觉得线段树实际上二分法和倍增法思想的体现。我可以把一个实际问题分解为很多子问题,然后从这些子问题得到大问题的答案,在修改的时候我们只要修改某些子问题就可以了,然后通过不断地向上更新,的到最终的答案。

 树状数组在统计方面比较有优势

抱歉!评论已关闭.