求大佬看看6.29蓝桥季度赛5题代码哪里有bu

import java.util.*;

public class Main {
    static final Scanner scan = new Scanner(System.in);
    public static void main(String[] args) {
        new SegmentTree(scan);
    }
}

class SegmentTree{
    private long[] max;
    private long[] min;
    private long[] data;
    public SegmentTree(Scanner scan){
        int n = scan.nextInt();
        int q = scan.nextInt();
        max = new long[4 * n];
        min = new long[4 * n];
        data = new long[n + 1];
        //data[i]就表示到当前节点的前缀和
        for (int i = 1; i <= n; i++) {
            data[i] = data[i - 1] + scan.nextInt();
        }
        build(1, n, 1);
        while(q-- > 0){
            int a = scan.nextInt() - 1, b = scan.nextInt() - 1, c = scan.nextInt(), d = scan.nextInt();
            long r = getMax(1, n, c, d, 1);
            long l = getMin(1, n, a, b, 1);
            System.out.println(r - l);
        }
    }

    public void build(int s, int e, int p){
        if(s == e){
            max[p] = min[p] = data[s];
            return;
        }
        int m = (s + e) >> 1;
        build(s, m, 2 * p);
        build(m + 1, e, 2 * p + 1);
        max[p] = Math.max(max[2 * p], max[2 * p + 1]);
        min[p] = Math.min(min[2 * p], min[2 * p + 1]);
    }

    //[s,e]是当前代表区间  , [l,r]是目标区间
    public long getMax(int s, int e, int l, int r, int p){       //[s, e]找最大
        if(s >= l && e <= r)
            return max[p];
        int mid = (s + e) >> 1;
        long ans = Integer.MIN_VALUE;
        if(l <= mid){
            ans = Math.max(ans, getMax(s, mid, l, r, 2 * p));
        }
        if(r > mid){
            ans = Math.max(ans, getMax(mid + 1, e, l, r, 2 * p + 1));
        }
        return ans;
    }

    //找最小
    public long getMin(int s, int e, int l, int r, int p){
        if(s >= l && e <= r)
            return min[p];
        int mid = (s + e) >> 1;
        long ans = Integer.MAX_VALUE;
        if(l <= mid)
            ans = Math.min(ans, getMin(s, mid, l, r, 2 * p));
        if(r > mid)
            ans = Math.min(ans, getMin(mid + 1, e, l, r, 2 * p + 1));
        return ans;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值