nyoj119 士兵杀敌(三)
1 #include<iostream> 2 #include<cstdio> 3 #define N 100010 4 using namespace std; 5 struct node{ 6 int l,r; 7 int max,min; 8 }tree[3*N]; 9 int num[N]; 10 int Max,Min; 11 void build(int l,int r,int i) 12 { 13 tree[i].l=l; 14 tree[i].r=r; 15 if(l==r){ 16 tree[i].max=tree[i].min=num[l]; 17 return; 18 } 19 int mid=(l+r)>>1; 20 build(l,mid,i<<1); 21 build(mid+1,r,(i<<1)+1); 22 tree[i].max=max(tree[i<<1].max,tree[(i<<1)+1].max); 23 tree[i].min=min(tree[i<<1].min,tree[(i<<1)+1].min); 24 } 25 void query(int l,int r,int i) 26 { 27 if(l==tree[i].l&&tree[i].r==r){ 28 Max=max(Max,tree[i].max); 29 Min=min(Min,tree[i].min); 30 return; 31 } 32 int mid=(tree[i].l+tree[i].r)>>1; 33 if(r<=mid) query(l,r,i<<1); 34 else if(mid<l) query(l,r,(i<<1)+1); 35 else{ 36 query(l,mid,i<<1); 37 query(mid+1,r,(i<<1)+1); 38 } 39 } 40 int main() 41 { 42 int i,a,b,n,q; 43 scanf("%d%d",&n,&q); 44 for(i=1;i<=n;++i) 45 scanf("%d",&num[i]); 46 build(1,n,1); 47 while(q--){ 48 Max=0; 49 Min=100000000; 50 scanf("%d%d",&a,&b); 51 query(a,b,1); 52 printf("%d\n",Max-Min); 53 } 54 return 0; 55 } 56 //跟士兵杀敌4差不多,就是稍微改造了一点
贴下别人的最优代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 using namespace std; 5 const int MAX=100010; 6 int FMAX[MAX][20],FMIN[MAX][20]; 7 8 int main() 9 { 10 int n,q,a,b,v; 11 cin>>n>>q; 12 for(int i=1;i<=n;++i) 13 { 14 scanf("%d",&FMAX[i][0]); 15 FMIN[i][0]=FMAX[i][0]; 16 } 17 for(int i=1;i!=20;i++) 18 for(int j=1;j<=n;j++) 19 if(j+(1<<i)-1<=n) 20 { 21 FMAX[j][i]=max(FMAX[j][i-1],FMAX[j+(1<<(i-1))][i-1]); 22 FMIN[j][i]=min(FMIN[j][i-1],FMIN[j+(1<<(i-1))][i-1]); 23 } 24 for(int i=0;i!=q;++i) 25 { 26 scanf("%d%d",&a,&b); 27 int len=(int)(log(b-a+1.0)/log(2.0)); 28 printf("%d\n",max(FMAX[a][len],FMAX[b-(1<<len)+1][len])-min(FMIN[a][len],FMIN[b-(1<<len)+1][len])); 29 } 30 }