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 } 

你可能感兴趣的:(OJ)