zoukankan      html  css  js  c++  java
  • nyist 119 士兵杀敌三

    查找m----n个数中最值之差

    使用线段树构造一颗二叉树,

     typedef struct tree

    {

        int L;

        int R;

        int max;

        int min;

    }tree;

     

     

    并且给这个树中的最值赋值

    值保存在一个数组a[]

    void bulid(int t,int i,int j)

    {

     

        c[t].L=i;

        c[t].R=j;

        c[t].max = -N;

        c[t].min = N;

        if(c[t].L==c[t].R)

        {

            c[t].max = a[c[t].L];

            c[t].min = a[c[t].L];

            return ;

        }

     

            bulid(t*2,i,(int)(i+j)/2 );

     

            bulid(t*2+1,(int)(i+j)/2+1,j);

     

            c[t].max = ( c[t*2].max>c[t*2+1].max?c[t*2].max:c[t*2+1].max);

            c[t].min = ( c[t*2].min<c[t*2+1].min?c[t*2].min:c[t*2+1].min);

    }

     

    接着就是查找这个数中某个区间的最值之差

    这个分为两种情况

    1. 是这棵书中节点中有这个区间的m--n

    2. 是这区间跨了这个数的左右节点,就是有一半在左孩子中有一半在右孩子中。

    讨论这两种情况就好了

    最后得到这个区间的最值

    输出最值之差

     

    void print(int x,int y,int t)

    {

     

         if(c[t].L>=x&&c[t].R<=y)//

        {

           if(c[t].max>l_max) l_max = c[t].max;

           if(c[t].min<l_min) l_min = c[t].min;

            return ;

        }

        int xx =(c[t].L+c[t].R)/2;

        if(y<=xx)

        {

             print(x,y,t*2);

        }

        else if(x>=xx+1)

        {

            print(x,y,t*2+1);

        }

        else

        {

            print(x,xx,t*2);

            print(xx,y,t*2+1);

        }

    }

    完整代码:

    #include<stdio.h>
    #include<string.h>
    #define N 1000010
    typedef struct tree
    {
        int L;
        int R;
        int max;
        int min;
    }tree;
    tree c[N];
    int a[N];
    int l_max = 0,l_min = N*100 ;
    void bulid(int t,int i,int j)
    {

        c[t].L=i;
        c[t].R=j;
        c[t].max = -N;
        c[t].min = N;
        if(c[t].L==c[t].R)
        {
            c[t].max = a[c[t].L];
            c[t].min = a[c[t].L];
            return ;
        }

            bulid(t*2,i,(int)(i+j)/2 );

            bulid(t*2+1,(int)(i+j)/2+1,j);

            c[t].max = ( c[t*2].max>c[t*2+1].max?c[t*2].max:c[t*2+1].max);
            c[t].min = ( c[t*2].min<c[t*2+1].min?c[t*2].min:c[t*2+1].min);
    }
    void print(int x,int y,int t)
    {

         if(c[t].L>=x&&c[t].R<=y)//
        {
           if(c[t].max>l_max) l_max = c[t].max;
           if(c[t].min<l_min) l_min = c[t].min;
            return ;
        }
        int xx =(c[t].L+c[t].R)/2;
        if(y<=xx)
        {
             print(x,y,t*2);
        }
        else if(x>=xx+1)
        {
            print(x,y,t*2+1);
        }
        else
        {
            print(x,xx,t*2);
            print(xx,y,t*2+1);
        }
    }
    int main()
    {
    int n,m;
    scanf("%d%d",&n,&m);
        memset(a,0,sizeof(a));
        int i;
        for( i = 1; i <= n; i++ )
          {
              scanf("%d",&a[i]);
          }
        bulid(1,1,n);
        for(i = 1; i <= m; i++)
        {
            l_max = 0;
            l_min = N*100;
            int x,y;
            scanf("%d%d",&x,&y);
            print(x,y,1);
            printf("%d\n",l_max-l_min);
        }
        return 0;
    }

  • 相关阅读:
    Supreme(ง •̀_•́)ง
    基于VS快速排序的单元测试
    POST GET
    Go对比其他语言新特性1(字符类型、类型转换、运算符、键盘输入、for、switch)
    四则运算问题
    软件工程第三次作业!
    Servlet
    结对编程1
    Kafka技术原理知识点总结
    KafkaStream简介
  • 原文地址:https://www.cnblogs.com/yyroom/p/2794555.html
Copyright © 2011-2022 走看看