POJ 3277

来源:互联网 发布:雀斑遮瑕膏 知乎 编辑:程序博客网 时间:2024/05/22 18:23

POJ 3277

狂汗的一道题。本来这算是线段树入门级题目了,但是以下是我这个菜鸟的做题情况:

3277

看了下用时最短的只有32MS,相形之下,我的前三次可以算做是TLE了。后来网上找了个代码改了改,时间才缩短到172MS

我看了下我们的线段树构造主要有以下两个区别:

1.  我的线段树只存了每段的高度。其左边界和有边界在调用函数时写出来,即为以下形式:

insert(p,l,r,a,b){

   if(l==a&&r==b){...return;}

   m=(l+r)/2;

   if(b<=m)insert(2*p,l,m,a,b);

   else if(a>=m)insert(2*p+1,m,r,a,b);

   else{

      insert(2*p,l,m,a,m);

      insert(2*p+1,m,r,m,b);

   }

}

而它的则采用结构体的形式,初始建树就将线段树左右边界及中间点保存起来,以后做insert操作时不必再计算。

2.  我的线段树结点的高即为其真实的高。若左子树与右子树高不等,记其高为-1。而他的线段树的高并非其真实的高,当父节点的高大于子树的高时,子树的高即为父节点的高;当子树的高大于父节点时子树的高即为自身的高。也就是说一条从根到叶结点的路径中最大的高即为叶子结点的高。故统计时必须计算到叶结点。

以下是我先后提交的代码:

不知道到底是哪种原因造成了如此惊人的差距,我也懒得测试了。总之学会了线段树的另一种构造方法,算是不错的收获吧。

原创粉丝点击