フェンウィックツリーのタイトル

上図の点を変更し、私はフェンウィックツリーの最も簡単な使用方法についてお話しましょう、と一定の間隔を求めると、


最初の関数;

X&( - x)は、物事の起源は言うことありません。グレーしばしば素晴らしいああ。

親ノードの変化点の値が得られる;;ような4×=、得ることができる8、 - (X)であれば、X + = X&

X- = X&( - X)、次いで、次の点間隔は、この点xの界部を支配し得ることです。

例えば、X = 7,6置換; 0~6の連続サイクルを順次取得することができます.. 4。

それらのすべては、セクション1 .... 7の管轄下に起こりました。


int lowbit(int x)  //这个函数主要是用来求的是某个点管辖范围
{  
    return x&(-x);  
}  

第二の機能


この関数は、木の配列を変更するために使用されます。

一般的なアルゴリズムは、ポイントを変更することによって変更することができる場合、フェンウィックツリーが変更されなければならないが、間隔変化点は、すべての管轄です。

そのような配列a [2] 1(= 16 N程度)だけデクリメントされ、すべての2点によって投与され4,8,16 1を減算有するべきです。

これは、関数の更新(2、-1)を呼び出すことです。


void update(int x,int num)  
{  
    while(x<=N)  
     {  
         d[x]+=num;  
         x+=lowbit(x);  
     }  
} 

第三の機能


この機能は、必要とされる範囲。例えばgetSum(7)は、次いで、見つけることである[1] + [2] + ... [7]。

徹底的に上記の原理のプロセスを理解しなければならないフェンウィックツリーを学ぶために、上記の最も基本的な使用方法です。

私たちは、オリジナルとD列の配列の違いを理解してください


int getSum(int x)  
{  
    int s=0;  
    while(x>0)  
     {  
         s+=d[x];  
         x-=lowbit(x);  
     }  
    return s;  
}  

アプリケーションフェンウィック木の変形


<1>各修飾は、ポイントある特定の間隔について求めています。

最良のケースを行います。poj2352星を言う、ポイント数が彼のポイントよりも小さいそれぞれの前に必要。

セットのみ配列[]、まず、0され、その後、変更するため、使用統計のポイントがあります。

この最も基本的なものは、上向き下向きの統計情報を変更することで、(基本的には...)


<2>はそれぞれ、必要な値が点について改質部です。

これは、典型的な対象HOJ1556色にボールを表します。

問題は、あなたが全体の範囲を変更するたびにあり、そして最後の回数各点の修正を求めています。


     上記の機能は、わずかに修正する必要があります。

ダウン変更するには、その背後にあるセクションでは、再び追加されます。

再び変更後、マイナス間隔不要修飾;

彼の親レコードで各ポイントを染色の数。

統計が必要な場合

void update(int x,int num)  
{  
    while(x>0)  
     {  
         d[x]+=num;  
         x-=lowbit(x);  
     }  
}

このような改変間隔、ポイントの数を変更しようとしている一方で、一般的に下向きに評価され、上向きの統計。

二次元の場合について、D [] []、D [i]は[J]のこの時点では、二次元に拡張一次元から自分の管轄範囲を有し、容易に理解することができます。

一次元は、期間範囲、二次元の長方形の管轄であり、かつ独立して各次元のとみなすことができる範囲の管轄内にあります。


int getSum(int x)  
{  
    int s=0;  
    while(x<=N)  
     {  
         s+=d[x];  
         x+=lowbit(x);  
     }  
    return s;  
}




公開された37元の記事 ウォン称賛12 ビュー6533

おすすめ

転載: blog.csdn.net/weixin_38960774/article/details/79405284