zoukankan      html  css  js  c++  java
  • 士兵杀敌(三)

    士兵杀敌(三)
    时间限制:2000 ms | 内存限制:65535 KB
    难度:5
    描述
    南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果。

    所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少。

    现在,请你写一个程序,帮小工回答南将军每次的询问吧。

    注意,南将军可能询问很多次。

    输入
    只有一组测试数据
    第一行是两个整数N,Q,其中N表示士兵的总数。Q表示南将军询问的次数。(1< N <=100000,1< Q <=1000000)
    随后的一行有N个整数Vi(0<=Vi<100000000),分别表示每个人的杀敌数。
    再之后的Q行,每行有两个正正数m,n,表示南将军询问的是第m号士兵到第n号士兵。
    输出
    对于每次询问,输出第m号士兵到第n号士兵之间所有士兵杀敌数的最大值与最小值的差。
    样例输入
    5 2
    1 2 6 9 3
    1 2
    2 4
    样例输出
    1
    7

    题解: 使用线段树会两次查询会超时,因此将最大最小查询放在一起,可以卡着时间过去。
    以下是代码。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int Max,Min;
    struct node{
        int l,r,sum,Max,Min;
    }Tree[1000010*3];
    
    void PushUp(int o)
    {
        Tree[o].sum =Tree[o*2].sum +Tree[o*2+1].sum ;
        Tree[o].Max =max(Tree[o*2].Max ,Tree[o*2+1].Max );
        Tree[o].Min =min(Tree[o*2].Min ,Tree[o*2+1].Min );
    }
    
    void build(int o,int l,int r)
    {
        Tree[o].r =r;
        Tree[o].l =l;
        if(r==l)
        {
            int t;
            scanf("%d",&t);
            Tree[o].Max =Tree[o].Min =Tree[o].sum =t;
            return ;
        }
        int mid=(l+r)>>1;
        build(o*2,l,mid);
        build(o*2+1,mid+1,r);
        PushUp(o);  
    }
    void QueryMin(int o,int l,int r,int x,int y)
    {
        if(x==l&&y==r)
        {
            Max=max(Max,Tree[o].Max );
            Min=min(Min,Tree[o].Min );
        }
        else
        {
            int mid=(l+r)/2;
            if(mid>=y)
                 QueryMin(o*2,l,mid,x,y);
            else if(x>mid)
                 QueryMin(o*2+1,mid+1,r,x,y);
            else
            {
                QueryMin(o*2,l,mid,x,mid);
                 QueryMin(o*2+1,mid+1,r,mid+1,y);
            }   
        }
    
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        build(1,1,n);
        int a,b;
        for(int i=0;i<m;i++)
        {
            scanf("%d%d",&a,&b);
            Max=-1;
            Min=0x7ffffff;
            QueryMin(1,1,n,a,b);
            printf("%d
    ",Max-Min);
        }   
        return 0;
    }
    

      

  • 相关阅读:
    java web使用WebSocket
    solr的使用
    mybatis中模糊查询的实现方式
    Java反射的简单使用
    TCP/IP协议 资料整理
    Java单向链表的实现
    Spring boot使用JWT来做接口登录验证
    sql性能优化
    前端实践项目(四)使用koa搭建开发环境
    前端实践项目 目录
  • 原文地址:https://www.cnblogs.com/-xiangyang/p/9220249.html
Copyright © 2011-2022 走看看