树状数组维护区间最大值

树状数组维护区间最大值,这个只支持末尾插入修改,每一次维护和查询的时间复杂度都是O((logn)^2),但这是满打满算的时间复杂度。假设是要维护和查询区间的最大值(最小值将max改成min 就好了)这个算法和树状数组维护和查询区间和的方法很相似:

一、数组的含义

1、在维护和查询区间和的算法中,h[x]中储存的是[x,x-lowbit(x)+1]中每个数的和,

2、在求区间最值的算法中,h[x]储存的是[x,x-lowbit(x)+1]中没个数的最大值。

求区间最值的算法中还有一个a[i]数组,表示第i个数是多少。

树状数组维护区间最大值_第1张图片

void change(int r)
{
    c[r]=a[r];
    for(int i=1;i

 


int getmax(int l,int r)
{
    int ret=a[r];
    while(l<=r){
        ret=max(ret,a[r]);
        for(--r;r-l>=lowbit(r);r-=lowbit(r)){
            ret=max(ret,c[r]);
        }
    }
    return ret;
}

 对应习题:蒜头君的任务

这道题输入输出数据量大,需全部使用scanf


#include

using namespace std;

typedef long long LL;

const int maxn=200001;

LL m,d,len,tr[maxn+50],t,a[maxn+50];

LL lowbit(LL x)
{
    return x&(-x);
}

LL query(LL l,LL r)
{
    LL ret=a[r];
    while(l<=r){
        ret=max(ret,a[r]);
        for(--r;r-l>=lowbit(r);r-=lowbit(r)){
            ret=max(ret,tr[r]);
        }
    }
    return ret;
}

void modify(LL l)
{
    tr[l]=a[l];
    for(LL i=1;i

 

你可能感兴趣的:(树状数组)