POJ 3264 RMQ—ST
2016-05-02 15:25
351 查看
点击打开链接
题意:给出n个数的数列,m次询问,每次询问输出a~b的最大值与最小值之差
思路:用RMQ预处理,查询为O(1)的复杂度,很好的模版练习......,看的这篇博客学习的这一篇#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=50010;
int max1[maxn][20],min1[maxn][20],num[maxn];
void RMQ_init(int n){
for(int i=1;i<=n;i++)
max1[i][0]=min1[i][0]=num[i];
for(int i=1;(1<<i)<=n;i++){
for(int j=1;j+(1<<i)-1<=n;j++){
max1[j][i]=max(max1[j][i-1],max1[j+(1<<(i-1))][i-1]);
min1[j][i]=min(min1[j][i-1],min1[j+(1<<(i-1))][i-1]);
}
}
}
int RMQ(int le,int ri){
int k=0;
while((1<<(k+1))<=ri-le+1) k++;
int ans1=max(max1[le][k],max1[ri-(1<<k)+1][k]);
int ans2=min(min1[le][k],min1[ri-(1<<k)+1][k]);
return ans1-ans2;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=-1){
for(int i=1;i<=n;i++) scanf("%d",&num[i]);
int le,ri;
RMQ_init(n);
for(int i=0;i<m;i++){
scanf("%d%d",&le,&ri);
printf("%d\n",RMQ(le,ri));
}
}
return 0;
}
题意:给出n个数的数列,m次询问,每次询问输出a~b的最大值与最小值之差
思路:用RMQ预处理,查询为O(1)的复杂度,很好的模版练习......,看的这篇博客学习的这一篇#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=50010;
int max1[maxn][20],min1[maxn][20],num[maxn];
void RMQ_init(int n){
for(int i=1;i<=n;i++)
max1[i][0]=min1[i][0]=num[i];
for(int i=1;(1<<i)<=n;i++){
for(int j=1;j+(1<<i)-1<=n;j++){
max1[j][i]=max(max1[j][i-1],max1[j+(1<<(i-1))][i-1]);
min1[j][i]=min(min1[j][i-1],min1[j+(1<<(i-1))][i-1]);
}
}
}
int RMQ(int le,int ri){
int k=0;
while((1<<(k+1))<=ri-le+1) k++;
int ans1=max(max1[le][k],max1[ri-(1<<k)+1][k]);
int ans2=min(min1[le][k],min1[ri-(1<<k)+1][k]);
return ans1-ans2;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=-1){
for(int i=1;i<=n;i++) scanf("%d",&num[i]);
int le,ri;
RMQ_init(n);
for(int i=0;i<m;i++){
scanf("%d%d",&le,&ri);
printf("%d\n",RMQ(le,ri));
}
}
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)