Binary indexed tree(BIT)をやった
これhttp://hos.ac/slides/20140319_bit.pdfを見ながら、これの基本問題をやった。
やり方はこれを見れば十分です。
問題設定はこちら。
N個の変数v_1, ..., v_n。
Q個のクエリ。
各クエリはv_a_jにw_jを加えるという操作。
answerは各クエリに対してv_1 + ... + v_aを求める。
クエリごとにどんどんv_1, ..., v_nは更新される。
入力は
N Q v_1 v_2 … v_N v_a_1 w_1 v_a_2 w_2 ... v_a_Q w_Q
という形で与えられるとする。
次のようなプログラムになる。
#x-1となっているのは、リストが0番目からになっているから。 #x&(-x)で2進数で表した場合の最も下位にある1の位置を取り出すことができる。 #例えば,10 = 1010なら10を返し、7 = 111なら1を返す。 N, Q = map( int, input().split()) V = list( map( int, input().split())) def add(A,a,w):#リストに値を追加する関数 x = a while x <= N: A[x-1] += w x += x&(-x) def sums(A,a):#k番目までの和 x = a S = 0 while x != 0: S += A[x-1] x -= x&(-x) return S A = [0]*N for i in range(1,N+1): add(A,i,V[i-1]) #for i in range(1,N+1): #確認用 # print(suma(A,i)) for _ in range(Q): v, w = map( int, input().split()) add(A,v,w) print(sums(A,v))
プログラムで気をつけることは、2進数で見たときの動きを意識すること。