poj 3264 Balanced Lineup
题目大意:对给定的区间求区间的最大最小值之差,利用RMQ,时间复杂度可降为O(nlog(n))
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <stack> #include <queue> #include <vector> #include <cmath> using namespace std; const int maxn=200000+10; int n,q; int hmin[maxn][20],hmax[maxn][20]; int l,r; inline int Min(int &a,int &b) { return a<b?a:b; } inline int Max(int &a,int &b) { return a>b?a:b; } void init() { int k=(int)(log(n*1.0)/log(2.0)); //printf("n->%d k->%d\n",n,k); for(int j=1;j<=k;j++) { for(int i=0;i+(1<<j)<=n;i++) { hmin[i][j]=Min(hmin[i][j-1],hmin[i+(1<<(j-1))][j-1]); hmax[i][j]=Max(hmax[i][j-1],hmax[i+(1<<(j-1))][j-1]); //printf("i->%d j->%d min->%d max->%d\n",i,j,hmin[i][j],hmax[i][j]); } } } int main() { //freopen("in.txt","r",stdin); while(~scanf("%d%d",&n,&q)) { for(int i=0;i<n;i++) { scanf("%d",&hmin[i][0]); hmax[i][0]=hmin[i][0]; } init(); int l,r,k,ans1,ans2; while(q--) { scanf("%d%d",&l,&r); l--,r--; k=(int )(log((r-l+1)*1.0)/log(2.0)); ans1=Min(hmin[l][k],hmin[r-(1<<k)+1][k]); ans2=Max(hmax[l][k],hmax[r-(1<<k)+1][k]); printf("%d\n",ans2-ans1); } } return 0; }
不为失败找借口,只为成功找方法