给定一个数字序列,查询任意给定区间内数字的最小值。
输入包含多组测试用例,每组测试用例的开头为一个整数n(1<=n<=100000),代表数字序列的长度。
接下去一行给出n个数字,代表数字序列。数字在int范围内。
下一行为一个整数t(1<=t<=10000),代表查询的次数。
最后t行,每行给出一个查询,由两个整数表示l、r(1<=l<=r<=n)。
对于每个查询,输出区间[l,r]内的最小值。
5 3 2 1 4 3 3 1 3 2 4 4 5
1 1 3
#include<cstdio>
#define MAX 100010
int Getmin(int A[],int L,int R)
{
int min=0x7FFFFFFF;
int i;
for(i=L;i<=R;i++)
if(A[i]<min)
min=A[i];
return min;
}
int main(int argc,char *argv[])
{
int n;
int A[MAX];
int i,T,L,R;
int ans;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&A[i]);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&L,&R);
ans=Getmin(A,L,R);
printf("%d\n",ans);
}
}
return 0;
}
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAX 100010
typedef struct Node
{
int l,r;
int min;
}Node;
Node N[MAX*3];
int A[MAX];
int fmin(int a,int b)
{
return a<b?a:b;
}
void BuildTree(int left,int right,int u)
{
N[u].l=left;
N[u].r=right;
if(left==right)
{
N[u].min=A[left];
}
else
{
BuildTree(left,(left+right)>>1,2*u);
BuildTree(((left+right)>>1)+1,right,2*u+1);
N[u].min=(int)fmin(N[2*u].min,N[2*u+1].min);
}
}
int query(int left,int right,int u)
{
if(N[u].l==left&&N[u].r==right)
return N[u].min;
if(right<=N[2*u].r)
return query(left,right,2*u);
if(left>=N[2*u+1].l)
return query(left,right,2*u+1);
int mid=(N[u].l+N[u].r)>>1;
return (int)fmin(query(left,mid,2*u),query(mid+1,right,2*u+1));
}
int main(int argc,char *argv[])
{
int i,n,ans;
int T,L,R;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&A[i]);
BuildTree(1,n,1);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&L,&R);
ans=query(L,R,1);
printf("%d\n",ans);
}
}
return 0;
}
#include<cstdio>
#include<cmath>
#include<algorithm>
#define MAXN 100010
using namespace std;
int dp[MAXN][40];
void RMQ(int A[],int n)
{
int i,j;
for(i=1;i<=n;i++)
dp[i][0]=A[i];
for(j=1;j<=(int)(log(n*1.0)/log(2.0));j++)
for(i=1;i+(1<<j)-1<=n;i++)
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
int query(int L,int R)
{
int k=(int)((log(R-L+1)*1.0)/log(2.0));
return min(dp[L][k],dp[R-(1<<k)+1][k]);
}
int main(int argc,char *argv[])
{
int i,n,ans;
int A[MAXN];
int T,L,R;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
scanf("%d",&A[i]);
RMQ(A,n);
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&L,&R);
ans=query(L,R);
printf("%d\n",ans);
}
}
return 0;
}
原文:http://blog.csdn.net/u012736084/article/details/18939483