Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在寻找子阵的最大和时需要时间限制_Java_Arrays_Segment Tree - Fatal编程技术网

Java 在寻找子阵的最大和时需要时间限制

Java 在寻找子阵的最大和时需要时间限制,java,arrays,segment-tree,Java,Arrays,Segment Tree,这是我使用段树()查找给定数组的子数组的最大和的解决方案,但是我得到了TLE(超过时间限制的错误)。有人能建议对这段代码进行更多的优化吗 public class segmentTree { int st[]; segmentTree(int arr[], int n){ int x = (int)Math.ceil(Math.log(n)/Math.log(2)); int maxSize = (int)Math.pow(2, x)<&l

这是我使用段树()查找给定数组的子数组的最大和的解决方案,但是我得到了TLE(超过时间限制的错误)。有人能建议对这段代码进行更多的优化吗

public class segmentTree {
    int st[];

    segmentTree(int arr[], int n){
        int x = (int)Math.ceil(Math.log(n)/Math.log(2));
        int maxSize = (int)Math.pow(2, x)<<1 - 1;
        st = new int[maxSize];
        constructSTUtil(arr, 0, n-1, 0);
    }
    int getMid(int s, int e) {
        return s + (e - s)>>1;
    }

    int getSumUtil(int ss, int se, int qs, int qe, int si)
    {
        if (qs <= ss && qe >= se)
            return st[si];
        if (se < qs || ss > qe)
            return 0;
        int mid = getMid(ss, se);
        return getSumUtil(ss, mid, qs, qe, si<<1 + 1) +
                getSumUtil(mid + 1, se, qs, qe, si<<1 + 2);
    }
    int getSum(int n, int qs, int qe)
    {
        if (qs < 0 || qe > n - 1 || qs > qe) {
            return -1;
        }
        return getSumUtil(0, n - 1, qs, qe, 0);
    }
    int constructSTUtil(int arr[], int ss, int se, int si)
    {
        if (ss == se) {
            st[si] = arr[ss];
            return arr[ss];
        }
        int mid = getMid(ss, se);
        st[si] = constructSTUtil(arr, ss, mid, si<<1 + 1) +
                 constructSTUtil(arr, mid + 1, se, si<<1 + 2);
        return st[si];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(in.readLine().trim());
        int array[] = new int[n];
        String arr[] = new String[n];
        arr = in.readLine().split(" ");
        for(int i=0; i<n; i++){
            array[i] = Integer.parseInt(arr[i].trim());
        }
        segmentTree tree = new segmentTree(array, n);
        int m = Integer.parseInt(in.readLine());
        while(m-- > 0){
            String ind[] = new String[2];
            ind = in.readLine().split(" ");
            int x = Integer.parseInt(ind[0].trim());
            int y =Integer.parseInt(ind[1].trim());
            int maxSum = -999999999;
            for(int i=x-1; i<=y-1; i++){
                for(int j=x-1; j<=y-1; j++){
                    if(tree.getSum(n, i, j) > maxSum)
                        maxSum = tree.getSum(n, i, j);
                }
            }
            System.out.println(maxSum);
        }
    }

}
公共类分段树{
int st[];
分段树(int arr[],int n){
intx=(int)Math.ceil(Math.log(n)/Math.log(2));
intmaxsize=(int)Math.pow(2,x)1;
}
int getSumUtil(int-ss、int-se、int-qs、int-qe、int-si)
{
如果(qs=se)
返回st[si];
如果(seqe)
返回0;
int mid=getMid(ss,se);

return getSumUtil(ss、mid、qs、qe、siOn)您执行测试的数据量是多少?您使用什么C#编译器实现?元素数小于50000,而元素值介于-15007和15007之间,