樹狀陣列 區間修改 單點查詢

2021-08-21 20:39:58 字數 688 閱讀 4869

說一下差分:

現在我們有乙個從小到大的數列a

a 1 3 6 8 9

然後還有乙個差分陣列b

b 1 2 3 2 1           對應:   1,3-1,6-3,8-6,9-8,

相信某些同學絕已經看出端倪了..這裡b[i]=a[i]-a[i-1],我令a[0]=0,故b[1]=a[1]。

int now=0,temp;

scanf("%d%d",&n,&m);

for(int i=1;i<=n;i++)

a陣列中的8等於b陣列 前4項的和;同理:a 陣列中的6  等於b陣列中前3項的和,於是單點查詢變成了 b 陣列的bit 求和問題,用模版即可!

然後把差分後的序列扔到樹狀陣列裡:

#include #include using namespace std;

int tree[500005];

int n,m;

int lowbit(int i)

void update(int i,int x)

}int query(int i)

return sum;

}int main()

while(m--)

else

}return 0;

}

樹狀陣列區間修改,單點查詢

普通的單點修改單點查詢就不講了,從區間修改和單點查詢講起。原來的值存在a裡面,多建立個陣列c1,注意 c1 i a i a i 1 那麼求a i 的值的時候a i a i 1 c1 i a i 2 c1 i c1 i 1 c1 1 c1 2 c1 i 所以就用c1建立樹狀陣列,便可以很快查詢a i ...

樹狀陣列(區間修改,單點查詢)

如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數數加上x 2.求出某乙個數的值 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含2或4個整數,表示乙個操作,具體如下 操...

樹狀陣列 單點修改區間查詢

樹狀陣列,時間複雜度o mlogn 明顯優於暴力列舉以及字首和,主要用於單點修改區間查詢 當然還有區間修改單點查詢 如果一道題中只有區間查詢,那麼建議使用字首和維護 思想直接理解不好理解,借助資料 a陣列下標12 3456 78數值2 5632 714以上是我們要儲存的a陣列,就是原資料 b陣列下標...