Ошибка сегментации C ++ при построении дерева сегментов - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь построить дерево сегментов, чтобы вычислить подмассив с максимальной суммой в заданном интервале массива ... (для каждого запроса)

Я получаю ошибку сегментации в функции "voidbuild () "Я проверил с размером массива .... это нормально работает, когда размер маленький ... но ошибка сегментации происходит для большего размера массива ..

заранее спасибо:)


success test case:
3 
-1 2 3
1
1 2
2

seg fault test case:
90
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
324 3 23 -234 32 -4 324 435 -5775
9
1 4
3 5
5 9
1 40
2 50
5 90
10 40
50 90
30 50
<pre><code>
#include<iostream>
#include<limits.h>
#include<math.h>
using namespace std;

typedef struct node node;
struct node{
    long int sum;
    long int lbest;
    long int rbest;
    long int max;
};


void build(node *tree , long int n , long int start , long int end , long int *ar ){
    if(start == end){
        tree[n].sum = tree[n].lbest = tree[n].rbest = tree[n].max = ar[start];
        return ;
    }
    else{
    long int mid = (start + end)/2;
    build(tree , (2*n) +1 , start , mid , ar);
    build(tree , (2*n) +2 , mid+1 , end , ar);

    tree[n].sum = tree[2*n+1].sum + tree[2*n+2].sum;
    tree[n].lbest = max(tree[2*n+1].lbest , tree[2*n+1].sum + tree[2*n+2].lbest);
    tree[n].rbest = max(tree[2*n+2].rbest , tree[2*n+2].sum + tree[2*n+1].rbest);
    tree[n].max = max(tree[n].sum , max(tree[n].lbest , tree[n].rbest));
 //     cout<<start<<" "<<end<<" -- "<<n<<" ";
 //     cout<<" else "<<endl;

    }

}

long int query(node *tree , long int  n , long int l , long int r , long int start , long int end){
    if(l > end || r < start)return INT_MIN;
    if(start >= l && end <= r)return tree[n].max;
    long int mid = (start + end)/2;
    return max(query(tree, (n*2)+1 , l , r , start , mid) , query(tree , 2*n+2 , l , r, mid +1 , end));
}




int main(){
    // ios_base::sync_with_stdio(false);
    // cin.tie(NULL);
    // cout.tie(NULL);


    long int n , q;
    scanf("%ld" , &n);

    long int ar[n];
    for(long int i = 0 ;i< n ; i++)cin>>ar[i];

    long int nn = n*2;
    node tree[nn+1];
    build(tree, 0 ,0,n-1 ,ar);

    scanf("%ld" , &q);

    while(q--){
        long a , b ;
        scanf("%ld %ld" , &a ,&b);
            a-- ;b--;
        printf("%ld\n" ,query(tree, 0 , a , b, 0 , n-1));
    }



    return 0;
}




1 Ответ

0 голосов
/ 09 июня 2018

Минимальный размер дерева сегментов должен быть 2 ^ (ceil (log (n)) + 1) -1, где n - количество элементов в массиве.


Просто увеличьте размер дерева сегментовдо 3 * n.

Источник: https://www.geeksforgeeks.org/segment-tree-set-1-range-minimum-query/

...