フェンウィックツリー[セクションは、クエリー間隔を変更]

おそらく、より良い読書体験

良いことは、あなたは、ツリーラインをヒットすることはできません

Benpianは、読者が1つのチェックを変更し、単一エリア検索を変更するには、地域で最も基本的な2本のフェンウィックの木になることを想定しました

違いを考える、値の範囲を維持する方法を考える
プレフィックスを行い、各位置の値を取得するために、調査グループの一部の
、その後、各間隔の場所に蓄積することの価値である
、定型話している
差分配列を設定されている\(C \)
の各位置の値
\(val_i = \和\ limits_
{J = 1} ^ ic_j \) 間隔\は([L、R] \ ) 値
\(S_ {L、R} = \和\ limits_ {I = L} ^ rval_i
\)は接頭辞の形で書き込まれ、減算され
(S_ {L、R} \ ^ {= \和\ limits_ {i = 1} ^ rval_i- \和\ limits_ {= 1、I}をL-1} val_i \)

見つけるのは難しいことではありませんが、違いの範囲の値は、実際のプレフィックスとプレフィックスと引き算の配列です

言い換えれば、限り、私たちは、プレフィックスとプレフィックスを維持し、最大フェンウィック木のメンテナンス間隔を使用することができる
プレフィックスとプレフィックスと維持する方法を検討するために
\を(S_P = \合計\ limits_ {I = 1} ^ P \合計\ limits_ { J = 1} ^ ic_j \)
各考える\(C_J \)発生数を得ることができる
\(S_P = \和\ limits_ {i = 1} ^ P \左(P-I + 1 \右)C_I = \左(P + 1 \右 )\和\ limits_ {i = 1} ^ pc_i- \和\ limits_ {i = 1} ^ PI * C_I \)

単純導出後、上記のように、限り、我々は維持するように\を(\和\ limits_ {I = 1} ^ pc_i \) と\(\和\ limits_ {I = 1} ^ PIは* C_I \) 二つのものとすることができる
前者対応する位置を掛け、アレイのメンテナンスの違い限り、インデックスを我々差配列であり、
我々は同じ方法フェンウィックツリーのメンテナンスによって間隔を変更、問い合わせの単一のポイントを維持することができるこれら二つの事が

int c1[maxn],c2[maxn];
int lbt (int x){ return x & -x; }
void modify (int l,int r,int v)//维护差分数组
{
    ++r;
    for (int i=l;i<=n;i+=lbt(i))    c1[i]+=v,c2[i]+=l*v;
    for (int i=r;i<=n;i+=lbt(i))    c1[i]-=v,c2[i]-=r*v;
}

私はその良いメンテナンス言うことではなく、理解していなかったこれらの2つの非常に始まり\(私はC_I \ *)それは、それがどのように書き出すための時間となり、\を(のL *のV \)\(R * V \)まで
お持ちの場合こうした疑問は、彼らが原則の原則フェンウィックツリーや思考のツリー状の配列あなたが忘れてしまったフェンウィックツリーを説明するにはあまりにも長い間プレーしませんでした

このことは、維持することである差動配列ではなく、接頭辞と差分配列を!

クエリーの場合

int query (int l,int r)
{
    int res=0;
    for (int i=r;i;i-=lbt(i))   res+=(r+1)*c1[i]-c2[i];
    for (int i=l-1;i;i-=lbt(i)) res-=l*c1[i]-c2[i];
    return res;
}

かなりそれをどこに置くか理解したり、エラーがあるない場合は、私を修正してください
あなたが好きならば、あなたはそれについて賞賛のコレクションを指すように望むこと

おすすめ

転載: www.cnblogs.com/Morning-Glory/p/11779230.html