• G


    思路:水题,线段树的基本操作即可。
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define MAXN 50010
    using namespace std;
    int n,q;
    struct  nond{
        int l,r,min,max;
    }tree[MAXN*4];
    void up(int now){
        tree[now].max=max(tree[now*2].max,tree[now*2+1].max);
        tree[now].min=min(tree[now*2].min,tree[now*2+1].min);
        return ;
    }
    void build(int now,int l,int r){
        tree[now].l=l;tree[now].r=r;
        if(tree[now].l==tree[now].r){
            scanf("%d",&tree[now].max);
            tree[now].min=tree[now].max;
            return ;
        }
        int mid=(tree[now].l+tree[now].r)/2;
        build(now*2,l,mid);
        build(now*2+1,mid+1,r);
        up(now);
    }
    int querymax(int now,int l,int r){
        if(tree[now].l==l&&tree[now].r==r)
            return  tree[now].max;
        int mid=(tree[now].l+tree[now].r)/2;
        if(r<=mid)    return querymax(now*2,l,r);
        else if(l>mid)    return querymax(now*2+1,l,r);
        else    return max(querymax(now*2,l,mid),querymax(now*2+1,mid+1,r));
    }
    int querymin(int now,int l,int r){
        if(tree[now].l==l&&tree[now].r==r)
            return tree[now].min;
        int mid=(tree[now].l+tree[now].r)/2;
        if(r<=mid)    return querymin(now*2,l,r);
        else if(l>mid)    return querymin(now*2+1,l,r);
        else return min(querymin(now*2,l,mid),querymin(now*2+1,mid+1,r));
    }
    int main(){
        scanf("%d%d",&n,&q);
        build(1,1,n);
        for(int i=1;i<=q;i++){
            int x,y;
            scanf("%d%d",&x,&y);
            printf("%d
    ",querymax(1,x,y)-querymin(1,x,y));
        }
    }
    细雨斜风作晓寒。淡烟疏柳媚晴滩。入淮清洛渐漫漫。 雪沫乳花浮午盏,蓼茸蒿笋试春盘。人间有味是清欢。
  • 相关阅读:
    方法重载的小demo
    面向对象的小demo
    直接选择排序
    冒泡排序
    杨辉三角用java实现
    从键盘输入成绩,找出最高分,并输出学生成绩等级。成绩>=最高分-10,为A,成绩>=最高分-20,为B,成绩>=最高分-30,为C,其余等级为D
    井号的含义
    svg snap 笔记
    jQuery 插件格式 规范
    工作遇到问题
  • 原文地址:https://www.cnblogs.com/cangT-Tlan/p/8468584.html
Copyright © 2020-2023  润新知