给定一个数字序列,查询任意给定区间内数字的最小值。
输入包含多组测试用例,每组测试用例的开头为一个整数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