zoukankan      html  css  js  c++  java
  • 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 } 
  • 相关阅读:
    经典SQL语句大全
    jQuery.fn.extend与jQuery.extend到底区别在哪?
    JQuery.Ajax()的data参数类型
    浅谈数据库去重
    .net Session 详解
    50个必备的实用jQuery代码段
    jQuery 选择器大全
    细说static关键字及其应用
    OVER(PARTITION BY)函数用法
    eos超时 锁表问题 网友办法
  • 原文地址:https://www.cnblogs.com/shihuajie/p/2635993.html
Copyright © 2011-2022 走看看