标签:
题意:找到一段数字里最大值和最小值的差
水题
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 using namespace std; 8 const int maxn=550; 9 const int INF=0x3f3f3f3f; 10 int n,m,t; 11 const int MAXN = 50010; 12 int dpMAX[MAXN][20],dpMIN[MAXN][20]; 13 int mm[MAXN]; 14 int cow[MAXN]; 15 //初始化RMQ, b数组下标从1开始,从0开始简单修改 16 void initMAXRMQ(int n,int b[]) 17 { 18 mm[0] = -1; 19 for(int i = 1; i <= n;i++) 20 { 21 mm[i] = ((i&(i-1)) == 0)?mm[i-1]+1:mm[i-1]; 22 dpMAX[i][0] = b[i]; 23 } 24 for(int j = 1; j <= mm[n];j++) 25 for(int i = 1;i + (1<<j) -1 <= n;i++) 26 dpMAX[i][j] = max(dpMAX[i][j-1],dpMAX[i+(1<<(j-1))][j-1]); 27 } 28 //查询最大值 29 int rmqmMAX(int x,int y) 30 { 31 int k = mm[y-x+1]; 32 return max(dpMAX[x][k],dpMAX[y-(1<<k)+1][k]); 33 } 34 void initMINRMQ(int n,int b[]) 35 { 36 mm[0] = -1; 37 for(int i = 1; i <= n;i++) 38 { 39 mm[i] = ((i&(i-1)) == 0)?mm[i-1]+1:mm[i-1]; 40 dpMIN[i][0] = b[i]; 41 } 42 for(int j = 1; j <= mm[n];j++) 43 for(int i = 1;i + (1<<j) -1 <= n;i++) 44 dpMIN[i][j] = min(dpMIN[i][j-1],dpMIN[i+(1<<(j-1))][j-1]); 45 } 46 //查询最大值 47 int rmqMIN(int x,int y) 48 { 49 int k = mm[y-x+1]; 50 return min(dpMIN[x][k],dpMIN[y-(1<<k)+1][k]); 51 } 52 int main() 53 { 54 int i,j,k; 55 #ifndef ONLINE_JUDGE 56 freopen("1.in","r",stdin); 57 #endif 58 int q; 59 while(scanf("%d%d",&n,&q)!=EOF) 60 { 61 for(i=1;i<=n;i++) 62 { 63 scanf("%d",&cow[i]); 64 } 65 initMAXRMQ(n,cow); 66 initMINRMQ(n,cow); 67 for(i=1;i<=q;i++) 68 { 69 int a,b; 70 scanf("%d%d",&a,&b); 71 printf("%d\n",rmqmMAX(a,b)-rmqMIN(a,b)); 72 } 73 } 74 return 0; 75 }
标签:
原文地址:http://www.cnblogs.com/cnblogs321114287/p/4354812.html