RMQ-ST求区间最值

二分果然是宇宙最强法则。。。

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 #include <string>
 5 #include <cstdio>
 6 #include <cmath>
 7 #define MAXN 2222222
 8 #define MAXM 11111
 9 #define lch(x) x<<1
10 #define rch(x) x<<1|1
11 #define lson l,m,rt<<1
12 #define rson m+1,r,rt<<1|1
13 using namespace std;
14 int mi[MAXN][22], mx[MAXN][22], w[MAXN];
15 int n, q;
16 void rmqinit()
17 {
18     for(int i = 1; i <= n; i++) mi[i][0] = mx[i][0] = w[i];
19     int m = (int)(log(n * 1.0) / log(2.0));
20     for(int i = 1; i <= m; i++)
21         for(int j = 1; j <= n; j++)
22         {
23             mx[j][i] = mx[j][i - 1];
24             if(j + (1 << (i - 1)) <= n) mx[j][i] = max(mx[j][i], mx[j + (1 << (i - 1))][i - 1]);
25             mi[j][i] = mi[j][i - 1];
26             if(j + (1 << (i - 1)) <= n) mi[j][i] = min(mi[j][i], mi[j + (1 << (i - 1))][i - 1]);
27         }
28 }
29 int rmqmin(int l,int r)
30 {
31     int m = (int)(log((r - l + 1) * 1.0) / log(2.0));
32     return min(mi[l][m] , mi[r - (1 << m) + 1][m]);
33 }
34 int rmqmax(int l,int r)
35 {
36     int m = (int)(log((r - l + 1) * 1.0) / log(2.0));
37     return max(mx[l][m] , mx[r - (1 << m) + 1][m]);
38 }
39 int main()
40 {
41     scanf("%d", &n);
42     for(int i = 1; i <= n; i++) scanf("%d", &w[i]);
43     rmqinit();
44     int l, r;
45     scanf("%d",&q);
46     while(q--)
47     {
48         scanf("%d%d", &l, &r);
49         printf("%d\n", rmqmin(l, r));
50     }
51     return 0;
52 }

代码君

时间: 2024-08-04 00:09:47

RMQ-ST求区间最值的相关文章

POJ - 3264 Balanced Lineup (RMQ问题求区间最值)

RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题. Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description For the daily

RMQ(求区间最值问题)

学习博客:https://blog.csdn.net/qq_31759205/article/details/75008659 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干次询问RMQ(i,j),返回数列A中下标在区间[i,j]中的最小/大值. 本文介绍一种比较高效的ST算法解决这个问题.ST(Sparse Table)算法可以在O(nlogn)时间内进行预处理,然后在O(1)时间内回答每个查询. 第一步:预处

TYVJ 1038忠诚 ST 求区间最值

已经不搞ACM了,就是最近随便做点题,就在这里存个代码 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int maxn = 100005; 5 int a[maxn][20]; 6 int x[maxn]; 7 void init(int n) 8 { 9 for(int i = 1;i<=n;++i)a[i][0] = x[i]; 10 int s = 1,r = 0; 1

RMQ st算法 区间最值模板

#include<bits/stdc++.h> const int N=1e6+5; const int Logn=20; int f[N][Logn],a[N],lg[N],n,m; int main(){ cin>>n>>m; rep(i,1,n) cin>>a[i]; lg[0]=-1; rep(i,1,n) fa[i][0]=a[i],lg[i]=lg[i>>1]+1; rep(j,1,Logn) for(int i=1;i+(1<

树状数组求区间最值

树状数组求区间最值 树状数组(Binary Index Tree)利用二进制的一些性质巧妙的划分区间,是一种编程,时间和空间上都十分理想的求区间和的算法,同样我们可以利用树状数组优美的区间划分方法来求一个序列的最值 约定以 num[]  表示原数组, 以 idx[] 表示索引数组, Lowbit(x)=x&(-x) 树状数组求和时通过构造数组 idx[] 使 idx[k]=sum(num[tk]), tk [k-Lowbit(k)+1,k], 使用同样的方法构造最值索引数组: 以最大值为例, 先

HDU6447 YJJ&#39;s Salesman-2018CCPC网络赛-线段树求区间最值+离散化+dp

目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:Portal传送门 ?原题目描述在最下面. ?1e5个点,问从(0,0)走到(1e9,1e9)的最大收益. ?当你从(u-1,v-1)走到(u,v)时,你可以获得点(u,v)的权值. Solution: ?十分详细了. ?直接线段树区间最值.当然也可以树状数组,不能st表. ?\(dp[i] = max(query\_max(0,dp[i]-1,1)+val[i] ,

hdu 5443 (2015长春网赛G题 求区间最值)

求区间最值,数据范围也很小,因为只会线段树,所以套了线段树模板=.= Sample Input3110011 151 2 3 4 551 21 32 43 43 531 999999 141 11 22 33 3 Sample Output1002344519999999999991 1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <algorithm>

线段树 --- (单点更新、求区间最值、模板题)

A - 敌兵布阵 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营 地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工 兵营地的人数都有可能发生

2016年湖南省第十二届大学生计算机程序设计竞赛---Parenthesis(线段树求区间最值)

原题链接 http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1809 Description Bobo has a balanced parenthesis sequence P=p1 p2…pn of length n and q questions. The i-th question is whether P remains balanced after pai and pbi  swapped. Note that questions ar

Codeforces 487B. Strip(求区间最值+线段树上的dp)

B. Strip time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Alexandra has a paper strip with n numbers on it. Let's call them ai from left to right. Now Alexandra wants to split it into some p