2013-12-09 166 views
0

我已经意识到树状数组,但是当我试图找到和上段有段错误11.分段故障

#include <vector> 
#include <iostream> 
using namespace std; 


class Fenwick{ 
public: 
    Fenwick(); 
    int sum(int l, int r); 
    void update(int pos, int value); 
    void print(int i); 
private: 
    vector<int> fentr; 
    int sum(int i); 
}; 
Fenwick::Fenwick(){ 
} 

void Fenwick::print(int i){ 
    cout<<fentr[i]; 
} 
int Fenwick::sum(int l, int r){ 
    return sum(r)-sum(l-1); 
} 
int Fenwick::sum(int i){ 
    int result=0; 
    // while(i>=0){ 
    // result+=fentr[i]; 
    // i=(i&(i+1))-1; 
    // } 
    for(int j=i; j>=0; j=(i&(i+1))-1){ 
     result+=fentr[j]; 
    } 
    return result; 
} 

void Fenwick::update(int pos, int value){ 
    while (pos<fentr.size()){ 
     fentr[pos]+=value; 
     pos=pos | (pos+1); 
    } 
} 


int main(){ 
    Fenwick a; 
    a.update(0, 1); 
    a.update(1, 2); 
    a.update(2, 3); 
    a.update(3, 4); 
    a.update(4, 5); 
    int j = a.sum(0,2); 
    cout<<j; 


} 

而且,我做了它的权利?我的意思是,我完全理解Fenwick树的想法,我只是无法找到我们必须做的初始数组?可能我需要作为Fenwik课的一个参数传递,然后和他一起工作?或者只是很多更新?先谢谢你。

+0

那么,你很可能会超出数组引用的范围。您不会向我们显示堆栈跟踪或哪条线路发生故障。 – OldProgrammer

回答

0

就我所见,您还没有初始化fentr向量。这在更新时不会失败,因为您正在循环到fentr.size(),但它会在拨打sum时发生段错误。