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 } 

posted on 2012-08-13 10:57  小花熊  阅读(287)  评论(0编辑  收藏  举报

导航