【算法·倍增】忠诚(区间最值问题 ST表)

阅读: 评论:0

【算法·倍增】忠诚(区间最值问题 ST表)

【算法·倍增】忠诚(区间最值问题 ST表)

Problem

题目描述
老管家是一个聪明能干的人。他为财主工作了整整10年,财主为了让自已账目更加清楚。

要求管家每天记k次账,由于管家聪明能干,因而管家总是让财主十分满意。但是由于一些人的挑拨,财主还是对管家产生了怀疑。

于是他决定用一种特别的方法来判断管家的忠诚,他把每次的账目按1,2,3…编号,然后不定时的问管家问题,

问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是一次问多个问题。

Solution

这显然是一个区间最值问题,我们需要使用 S T ST ST算法来解决。

我们设 f [ i ] [ j ] f[i][j] f[i][j]表示区间内第 i i i个位置往后 2 j 2^j 2j个位置,即在位置 [ i , i + 2 j − 1 ] [i,i+2^j-1] [i,i+2j−1]的最小值。

则有: f [ i ] [ j ] = m a x ( f [ i ] [ j − 1 ] , f [ i + 2 j − 1 ] [ j − 1 ] ) f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1]) f[i][j]=max(f[i][j−1],f[i+2j−1][j−1])
即将一个长度为 2 j 2^j 2j的区间划分为两个 2 j − 1 2^{j-1} 2j−1的区间。

根据换底公式,我们可以知道j的上限就是 l o g ( n ) / l o g ( 2 ) log(n)/log(2) log(n)/log(2)。

对于区间查询 [ L , R ] [L,R] [L,R]的最小值,我们则可以用两个长度大于 ( R − L + 1 ) / 2 , (R-L+1)/2, (R−L+1)/2,小于 R − L + 1 R-L+1 R−L+1的 2 2 2的区间进行覆盖,重复也没有关系,同样可以根据换底公式得到这一个区间大小= l o g ( R − L + 1 ) / l o g ( 2 ) log(R-L+1)/log(2) log(R−L+1)/log(2)。

这是不重不支持区间修改的区间最值查询算法,可以用线段的 b u i l d build build的 a s k ask ask来代替,但是因为代码量小、实现方便,而且作为一个算法,是我们必须要掌握的。

#include <bits/stdc++.h>
using namespace std;
int n,k;
int a[200000];
int f[200000][50];
vector<int>ans;
int main(void)
{freopen("input.in","r",stdin);freopen("output.out","w",stdout);scanf("%d %d",&n,&k);for (int i=1;i<=n;++i) scanf("%d",a+i);for (int i=1;i<=n;++i) f[i][0]=a[i];int t=log(n)/log(2);for (int j=1;j<=t;++j)for (int i=1;i<=n-(1<<j)+1;++i)f[i][j]=min(f[i][j-1],f[i+(1<<j-1)][j-1]);for (int i=1;i<=k;++i){int l,r;scanf("%d %d",&l,&r);int k=log(r-l+1)/log(2);ans.push_back(min(f[l][k],f[r-(1<<k)+1][k]));}for (int i=0;i<ans.size();++i) printf("%d%c",ans[i],(i == ans.size()-1 ? 'n' : ' '));return 0;
}

本文发布于:2024-02-05 00:41:09,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170720121461385.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:Luogu P1816 忠诚
标签:区间   算法   忠诚   ST
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23