摘要: 这个题昨天做过,但是今天使用的是RMQ_ST算法,网上关于RMQ还有中笛卡尔树的算法,今天我用的是ST算法,这个算法很给力,在初始化之后可以在O(1)的时间内求出最大值和最小值。先简要介绍一下ST算法,ST算法需要辅助数组f[i][j]表示从第i个元素开始连续2^j个元素中的最大值(这里以最大值举例),有:1.初始 f[i][0]=a[i]2.对于f[i][j] j>0 有f[i][j]=max( f[i][j-1] , f[i+2^(j-1)][j-1] ),当然每次比较之前必须保证i+2^(j-1)<=n中在初始化的过程中 j:1--m 这样保证f[1][1]=max(f[1] 阅读全文
posted @ 2012-07-12 19:10 pushing my way 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 昨晚写了一个线段树的程序,各种bug,最后硬是AC了,这个题的大意是这样的:给n个数字,然后在给出一些区间范围(s,e),求出在这个区间范围内的最大值和最小值,总结一下这个题,我一共有5个bug1.建立线段树时,类似完全二叉树,一开始我开的数组是最大数字个数的2倍多一点,然后开始悲剧,每当程序执行到Build_Tree()时就死了,一开始百思不得其解,后来自己用手模拟了一下建树的过程,发现虽然类似完全二叉树,但还不都是。完全二叉树只有最底层是叶子节点,但是线段树不一定,比如对(1,6)建树,模拟一下就会知道,最后改成开成3倍就OK了,纠结啊。2.第二个问题是编程基础不好导致的,我在初始化时就对 阅读全文
posted @ 2012-07-12 18:52 pushing my way 阅读(208) 评论(0) 推荐(0) 编辑