神犇求解…树状数组能求区间最值吗?时间复杂度是多少啊?…还有就是树状数组在求解啥问题上更有优势?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神犇求解…树状数组能求区间最值吗?时间复杂度是多少啊?…还有就是树状数组在求解啥问题上更有优势?相关的知识,希望对你有一定的参考价值。

其实树状数组是可以求区间最值的。区间最值问题一般称作RMQ问题,有树状数组算法,S-T算法,以及线段树算法。对于树状数组,修改的复杂度都是O(nlogn),查询是O(logn)其优势相对于线段树,代码风格整齐,简短,相对于S-T,可以进行修改,是一种比较好用的数据结构。
void modify(int p,int v)
for(int i=p;i<=N;i++)
for(int j=i;j<=N;j+=lowbit(j))
idx[i]=max(idx[i],seq[i]);




int query(int l,int r)
int ans=seq[r];
while(1)
ans=max(ans,seq[r]);
if(l==r) break;
for(r-=1;r-l>=lowbit(r);r-=lowbit(r))
ans=max(ans,idx[r]);


return ans;

seq[]是数列,idx[]为索引数组,维护的是一段区间内的最大值。
参考技术A 树状数组是用来算静态序列区间子段和的,不能用来求最值,静态序列求区间最值得话应该用Rmq,与此相关的算法还有线段树(这个前面说的都能求,而且可以动态维护)。追问

额……那么请问树状数组在求解什么问题上更有优势?只有求前缀和吗?

追答

就我看来,树状数组除了代码短,常数小,没别的优势了,基本上能用树状数组的一定能用线段树。

本回答被提问者采纳

以上是关于神犇求解…树状数组能求区间最值吗?时间复杂度是多少啊?…还有就是树状数组在求解啥问题上更有优势?的主要内容,如果未能解决你的问题,请参考以下文章

ST算法

树状数组从入门到弃疗

模板st表

线段树及其基本操作

树状数组维护区间最值

树状数组维护区间最值