这章的数据结构题很真实
T1 排队 bzoj 1699
题目大意:
求静态一些区间的最大值-最小值
思路:
ST表裸题
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #define ll long long 10 #define inf 2139062143 11 #define MAXN 100100 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 int n,q,g[MAXN],mn[MAXN][20],mx[MAXN][20]; 21 int main() 22 { 23 n=read(),q=read();int a,b,t; 24 for(int i=1;i<=n;i++) mn[i][0]=mx[i][0]=g[i]=read(); 25 for(int j=1;j<20;j++) 26 for(int i=1;i+(1<<j)-1<=n;i++) 27 mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]),mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]); 28 while(q--) 29 { 30 a=read(),b=read(),t=b-a+1,t=(int)log2(t); 31 printf("%d\n",max(mx[a][t],mx[b-(1<<t)+1][t])-min(mn[a][t],mn[b-(1<<t)+1][t])); 32 } 33 }