mirror of
https://gitcode.com/Zengtudor/alg2025.git
synced 2025-09-11 18:40:00 +00:00
feat: 添加基于稀疏表的区间最值查询功能
实现一个使用稀疏表数据结构的算法,用于高效查询区间最大值和最小值 包含预处理阶段构建稀疏表和查询阶段处理多个区间查询
This commit is contained in:
parent
ee9687d88b
commit
5746fd6999
47
src/9/6/libre10123.cpp
Normal file
47
src/9/6/libre10123.cpp
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#include <algorithm>
|
||||||
|
#include <cmath>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <iostream>
|
||||||
|
#include <istream>
|
||||||
|
#include <vector>
|
||||||
|
using ll = int64_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
int main(){
|
||||||
|
std::iostream::sync_with_stdio(false);
|
||||||
|
std::cin.tie(nullptr);
|
||||||
|
ll n,q;
|
||||||
|
std::cin>>n>>q;
|
||||||
|
std::vector<ll> lg(n+1);
|
||||||
|
for(ll i=2;i<=n;i++){
|
||||||
|
lg[i]=lg[i/2]+1;
|
||||||
|
// printf("lg2[%lld]=%lld\n",i,lg[i]);
|
||||||
|
}
|
||||||
|
std::vector<std::vector<ll>> bmax(n+1,std::vector<ll>(lg[n]+1)),bmin(n+1,std::vector<ll>(lg[n]+1));
|
||||||
|
for(ll i=1;i<=n;i++){
|
||||||
|
std::cin>>bmax[i][0];
|
||||||
|
bmin[i][0]=bmax[i][0];
|
||||||
|
}
|
||||||
|
for(ll j=1;j<=lg[n];j++){
|
||||||
|
for(ll i=1;i+(1ll<<(j-1))<=n;i++){
|
||||||
|
bmax[i][j]=std::max(
|
||||||
|
bmax[i][j-1],
|
||||||
|
bmax[i+(1ll<<(j-1))][j-1]
|
||||||
|
);
|
||||||
|
bmin[i][j]=std::min(
|
||||||
|
bmin[i][j-1],
|
||||||
|
bmin[i+(1ll<<(j-1))][j-1]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while(q--){
|
||||||
|
ll l,r;
|
||||||
|
std::cin>>l>>r;
|
||||||
|
ll range=r-l+1;
|
||||||
|
ll max = std::max(bmax[l][lg[range]],bmax[r-(1ll<<(lg[range]))+1][lg[range]]);
|
||||||
|
ll min = std::min(bmin[l][lg[range]],bmin[r-(1ll<<(lg[range]))+1][lg[range]]);
|
||||||
|
// printf("max=%lld, min=%lld\n",max,min);
|
||||||
|
std::cout<<max-min<<"\n";
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user