データ構造 - フェンウィックツリー - 修正単一点間隔の評価間隔プラス-1750と評価

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を返します。
    }

  

 

おすすめ

転載: www.cnblogs.com/hyserendipity/p/12625785.html