• 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) 的效果

     

  • 相关阅读:
    函数
    循环练习
    循环结构
    分支结构
    C语言关键字
    进制编码
    MAC/Xcode简单操作命令
    Hibernate
    Hibernate
    Hibernate
  • 原文地址:https://www.cnblogs.com/lnu161403214/p/8168398.html
Copyright © 2020-2023  润新知