P4868 Preprefix容疑者

ポータル

かなり明白な問題がありますか。クエリの変更、接頭辞や接頭辞配列の1つのポイント

フェンウィックツリーを維持することができます

元の配列ドルのために、問い合わせ位置が$ X $を設定されているの寄与に対応する各調査位置を検討[I] $ $ Iの特定の位置を$、それが寄与$(X-I + 1)* [I意志] $

すなわち、$ X * [I] - (I-1)* [I] $、ツリー直接2つの部分を維持するために、2つの配列を係合しています

詳細なbit_1を問うための$ $メンテナンスの$ A [i]は$、$ BIT_2 $メンテナンス$ A [i]は*(I-1)$、$ X $を提唱しています

BIT_2.query(X)$ - 答えは$ BIT_1.query(X)* xは

長い$ \長さ約$に注意してください。

#include <iostreamの> 
する#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath>
 使用して 名前空間STD。
typedefの長い 長いLL。
インラインint型リード()
{ 
    int型のx = 0、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1CH =getchar関数(); }
     一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。}
     戻りのx *のF。
} 
のconst  int型 N = 2E5 + 7 INTのN、M。
構造体BIT { 
    LLのT [N]。
    インラインボイドは、追加(INT X、LL V){ 一方(X <= N)T [X] + = V、X + = X& - X。} 
    インライン(ASK llの整数 X){LL RES = 0同時に(X)RES + = T [x]は、x軸= X&-x。リターンのres; } 
} T1、T2。
INT [N]。
INT ()は、メイン
{ 
    N =読み取る()、M = 読み取ります();
    以下のためにint型 I = 1 [I] = iが++; iが<= N) )(読み取ります。
    int型 I = 1を T1.add(I、[i])と、T2.add(I、1LL * [I] *(I-; iが<= N iが++)1 ))。
    チャー S [ 7 ]。INT X、Y。
    以下のためにint型 I = 1 ; I <= M; iは++ 
    { 
        scanf関数(" %sの"、S); X = リード()。
        もし(S [ 0 ] == ' Q '){のprintf(" %LLDする\ n "、T1.ask(X)* X-T2.ask(X)); 続け; } 
        、Y =読み取り()。T1.add(X、YA [X])。T2.add(X、1LL×(YA [X])*(X- 1 ))。
        [X] = yと、
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/LLTYYC/p/11505808.html