zoukankan      html  css  js  c++  java
  • 《白书》上线段树RMQ的实现

    白书上的线段树RMQ实现,自己重写了一遍:

    #include <bits/stdc++.h>
    
    using namespace std;
    const int MAXN=1<<17;
    int n,dat[MAXN*2-1];
    
    //把所有的值设为MAXN
    void init(int _n)
    {
        n=1;
        while(n<_n)n*=2;
        for(int i=0;i<2*n-1;i++)
        {
            dat[i]=MAXN;
        }   
    }
    //把第k个值(0-index)更新为a
    void update(int k,int a)
    {
        k=n-1+k;
        dat[k]=a;
        //由下往上更新
        while(k>0)
        {
            k=(k-1/2);
            det[k]=min(det[k*2+1],det[k*2+2]);
        }
    }
    //求[a,b)的最小值
    int query(int a,int b,int k,int l,int r)
    {
        //如果[a,b)和[l,r)不相交,返回MAXN
        if(r<=a||l<=b)return MAXN;
        //如果[a,b)完全包含[l,r),返回当前值
        if(a<=l&&b>=r)return det[k];
        else
        {
            //返回左右儿子更小的那个
            int lval=query(a,b,2*k+1,l,(l+r)/2);
            int rval=query(a,b,2*k+2,(l+r)/2+1,r);
            return min(lval,rval);
        }
    }
    
    
  • 相关阅读:
    架构设计
    第七章
    第六章
    第五章
    第四章
    第三章
    第二章
    第一章
    链表中环
    实现链表中的部分翻转
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9386915.html
Copyright © 2011-2022 走看看