RMQ问题

就是区间询问问题,m次询问,问你[L,R]区间什么什么。。。。。

1,区间和

  这类问题都极好处理

  I、离线查询,直接sum[i]存储前缀和(sum[i]=sum[i-1]+a[i],即存储了前i个数的和),SUM(L->R)= sum[R] - sun[L-1]。

  II、在线查询,单点修改推荐树状数组,代码简单:  

int arr[MAXN];  //初始为0
inline int sum(int x){int res=0;while(x)res+=arr[x],x-=lowbit(x);return res;}  
inline void add(int x,int n){while(x<MAXN)arr[x]+=n,x+=lowbit(x);}  
inline int query(int x,int y){return sum(y)-sum(x-1);} 

 

   区间修改,推荐线段树

2,线段树理解

  递归的思想,用二叉树来实现。

  如果我们能用很少的运算通过[L,(L+R)/2],[(L+R)/2 + 1,R]计算出[L,R],那就可以用线段树了   

3,莫队算法(离线查询)理解

  将需要查询的m个区间排好序,通过对上一次查询的区间的两个端点的移动来得出本区间的答案,每一次查询的时间复杂度就是两个端点的移动次数和

  (例如从[1,10][2,15],左端点向右移1次,右端点向右移5次就ok了)

  如果我们知道区间[L,R] ,就能在比较短的时间内求出[L1,R],[L+1,R],[L,R1],[L,R+1] 的话,那就可以用莫队算法了。

  据说:莫队算法的实质是通过将询问排序,每个询问均由前一个询问(排序后的)转移得来,通过一定的排序优化时间复杂度。往往可以有O(N√N) 的效果

 

原文地址:https://www.cnblogs.com/lnu161403214/p/8168398.html