From 5746fd6999933d7d01ed1feb41696562e57f6a51 Mon Sep 17 00:00:00 2001 From: Zengtudor Date: Sat, 6 Sep 2025 14:02:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E5=9F=BA=E4=BA=8E?= =?UTF-8?q?=E7=A8=80=E7=96=8F=E8=A1=A8=E7=9A=84=E5=8C=BA=E9=97=B4=E6=9C=80?= =?UTF-8?q?=E5=80=BC=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 实现一个使用稀疏表数据结构的算法,用于高效查询区间最大值和最小值 包含预处理阶段构建稀疏表和查询阶段处理多个区间查询 --- src/9/6/libre10123.cpp | 47 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/9/6/libre10123.cpp diff --git a/src/9/6/libre10123.cpp b/src/9/6/libre10123.cpp new file mode 100644 index 0000000..268a5fd --- /dev/null +++ b/src/9/6/libre10123.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include +#include +#include +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 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> bmax(n+1,std::vector(lg[n]+1)),bmin(n+1,std::vector(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<