2020年4月3日午前12時35分23秒
問題の説明:
:あなたは、次の2つの操作を実行する必要がある列の既知の数、
1セクションの数それぞれプラスX
2値の数入手
入力:
元の配列はAです。便宜上、A [0] 0は、A [1]の開始から列の実際の数です。
動作は、4タプルによって与えられます。
各4タプル(A、B、C、Dのために ):
= 0は、A [B] -Aを必要とする場合は[C]の値は、間隔D(変性)に増加しています。
値は1つの= A [B]を与えるために必要な場合。ここで、C、D動作不能(クエリ)。
出力:
出力データ量を削減します。2操作(クエリ)は、すべての排他的論理和(^)の値を返します。
サンプル
例1:
输入:[0,1,2,3,4],[[1,1,0,0],[0,1,2,1],[1,2,0,0]] 输出:2 解释: 第一个操作返回A [1] = 1 第二个操作改变A为 [0,2,3,3,4] 第三个操作返回A [1] = 3 所以 1 ^ 3 = 2
サンプル2:
输入:[0,1],[[1,1,0,0]] 输出:1 解释:第一个操作返回A [1] = 1,答案为 1。
注意事項
- 配列の長さ<= 10000
- オペランド<= 50000
問題解決:
INT []ビット。 公衆ロングintervalsAddAndGetValue(INT [] A、INT [] []の操作){ int型のn = A.length。 ビット=新しいINT [N]。 以下のために(INT I 1 =; N iが<; I ++){ 更新(I、A [I])。 アップデート(I + 1、-A [I])。 } 長いRES = 0。 (INT [] OP:オペレーション)のために{ IF(OP [0] == 0){ 更新(OP [1]、OP [3])。 アップデート(OP [2] + 1、-OP [3])。 } 他{ RES ^ =クエリ(OP [1])。 } } RESを返します。 } プライベートボイド更新(INT IDX、INTデルタ){ {(; I <bit.length I + =(I・)-i INT I = IDX)のための ビット[I] + =デルタ。 } } プライベートINTクエリ(INT IDX){ int型RES = 0。 (INT I = IDX; I> 0; I - =(I&-i))のために{ RES + =ビット[I]; } RESを返します。 }