RMQ(log2储存方法)
RMQ |
难度级别:B; 运行时间限制:1000ms; 运行空间限制:256000KB; 代码长度限制:2000000B |
试题描述 |
长度为n的数列A,以及q个询问,每次询问一段区间的最小值。 |
输入 |
第一行,一个整数n |
输出 |
针对每个询问,输出结果。每个结果占一行。 |
输入示例 |
5 |
输出示例 |
2 |
其他说明 |
数据规模:n, q, Ai<=100000 |
1 #include<iostream> 2 3 #include<cmath> 4 5 using namespace std; 6 7 int f[100010][20]; 8 9 void rmq(int num) 10 11 { 12 13 for(int j=1;j<20;j++) 14 15 for(int i=1;i<=num;i++) 16 17 if(i+(1<<j)-1<=num) 18 19 f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]); 20 21 } 22 23 int main() 24 25 { 26 27 int i,j,n,t,m; 28 29 scanf("%d",&n); 30 31 for(i=1;i<=n;i++) 32 33 { 34 35 scanf("%d",&f[i][0]); 36 37 } 38 39 rmq(n); 40 41 int s,p,maxl,minl; 42 43 cin>>m; 44 45 while(m--) 46 47 { 48 49 scanf("%d%d",&s,&p); 50 51 int k=(int)((log(p-s+1))/log(2.0)); 52 53 minl=min(f[s][k],f[p-(1<<k)+1][k]); 54 55 printf("%d\n",minl); 56 57 } 58 59 }
你——悟到了么?