• 士兵杀敌(三)


    士兵杀敌(三)
    时间限制: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;
    }
    

      

  • 相关阅读:
    Bootstrap导航条
    Bootstrap导航
    Bootstrap输入框组
    Bootstrap按钮式下拉菜单
    Bootstrap按钮组
    Bootstrap下拉菜单
    Bootstrap辅助类
    Bootstrap栅格系统
    Bootstrap学习目录
    Bootstrap图标
  • 原文地址:https://www.cnblogs.com/-xiangyang/p/9220249.html
Copyright © 2020-2023  润新知