摘要: 以poj 1330为例,因为这道题只是询问一次,还不至于使用st算法,只是在这里说一下怎么做问题的转化,在一个树的深搜过程中,每个点都会被访问到两次,这样形成了一个欧拉序列,假设两个点a,b的最近公共祖先是c那么在深搜的时候,按照顺序访问,如果要从a转到b那么必定会经过一次c节点,从c节点转到b所在的子树上,也就是说,c节点是这个从a到b的所有经过的节点之中,深度最小的一个,我们只需要在第一次出现a和第一次出现c的序列之间去找深度最小的即为其最近公共祖先。即为区间最值问题,rmq问题View Code 1 #include<stdio.h> 2 #include<string 阅读全文
posted @ 2012-05-12 19:48 zhenhai 阅读(246) 评论(0) 推荐(0)
摘要: st算法是解决区间最值问题比较有效的算法,把每一段查询区间分为两部分,用nlogn的预处理求出dp[i][j]从第i个数开始到i+2^j-1之间的最值,如果要查询[a,b]的最值,则可分为[a,a+2^k-1],[b-2^k+1,b-2^k+1+2^k-1]即[b-2^k+1,b]两个区间每次查询的时间为o(1)其中k=(int)(log(b-a+1)/log2)(换底公式)View Code 1 #define N 100005 2 int dp[N][18]; 3 int v[N]; 4 int max(int a,int b) 5 { 6 return a>b?a:b; 7 }.. 阅读全文
posted @ 2012-05-12 15:54 zhenhai 阅读(190) 评论(0) 推荐(0)