其实,ST算法的思想,就是每次把要求的区间划分为两段!然后,看哪一段的关键字符合要求,取那一段的关键字! #include<stdio.h> #include<math.h> #define max 1000005 int fmin[max],fmax[max]; int dpmin[max],dpmax[max],a[max]; int n,k; int min_dp(int a,int b) { return a<b?a:b; } int max_dp(int a,int b) { return a>b?a:b; } void st() { int i,j; int temp=(int )((log((double)k))/(log(2.0))); if(temp==0) { for(i=1;i<=n;i++) { fmin[i]=a[i];fmax[i]=a[i]; } return; } for(i=1;i<=n;i++) { dpmin[i]=a[i];dpmax[i]=a[i]; } for(j=1;j<=(log((double)n)/(log(2.0)));j++) { for(i=1;i+(1<<j)-1<=n;i++) { dpmin[i]=min_dp(dpmin[i],dpmin[i+(1<<(j-1))]); dpmax[i]=max_dp(dpmax[i],dpmax[i+(1<<(j-1))]); } if(j==temp) { for(i=1;i<=n-k+1;i++) { fmin[i]=min_dp(dpmin[i],dpmin[i+k-(1<<temp)]); fmax[i]=max_dp(dpmax[i],dpmax[i+k-(1<<temp)]); } return ; } } } void pri_st() { int i; for(i=1;i<=n-k+1;i++)printf("%d ",fmin[i]);printf("/n"); for(i=1;i<=n-k+1;i++)printf("%d ",fmax[i]);printf("/n"); } int main() { int i; scanf("%d%d",&n,&k); for(i=1;i<=n;i++) { scanf("%d",&a[i]); } st(); pri_st(); }