nyoj ACM 士兵殺敵(二) 樹狀陣列

2021-07-29 22:12:57 字數 1600 閱讀 1516

士兵殺敵(二)

時間限制:1000 ms | 記憶體限制:65535 kb

難度:5

描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。

小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。

南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。

輸入 只有一組測試資料

第一行是兩個整數n,m,其中n表示士兵的個數(1

<

n<

1000000),

m表示指

令的條數

。(1<

m<

100000)

隨後的一行是n個整數,ai表示第i號士兵殺敵數目。(0<=ai<=100)

隨後的m行每行是一條指令,這條指令包含了乙個字串和兩個整數,首先是乙個字串,如果是字串query則表示南將軍進行了查詢操作,後面的兩個整數m,n,表示查詢的起始與終止士兵編號;如果是字串add則後面跟的兩個整數i,a(1<=i<=n,1<=a<=100),表示第i個士兵新增殺敵數為a.

輸出 對於每次查詢,輸出乙個整數r表示第m號士兵到第n號士兵的總殺敵數,每組輸出佔一行

樣例輸入

5 6

1 2 3 4 5

query 1 3

add 1 2

query 1 3

add 2 3

query 1 2

query 1 5

樣例輸出

6 8

8 20

平常我們會遇到一些對陣列進行維護查詢的操作,比較常見的如,修改某點的值、求某個區間的和,而這兩種恰恰是樹狀陣列的強項!

一般最先想到的是遍歷,但是在資料量很大時,依然會很複雜,此時可以考慮樹狀陣列。

關於樹狀陣列的資料

樹狀陣列有兩種基本用法:

一、插點問線,如「士兵殺敵(二)」

二、插線問點,如「士兵殺敵(四)」

注意:+- 和 & 的優先順序不要弄錯了,之前一直出問題,後來才發現,竟然是因為這。

//一直出問題,後來才發現,竟然是+- 和 & 的優先順序弄錯了。 

#include

#include

#include

using

namespace

std;

int a[1001001];

int c[1001000];

int n,m;

int lowbit(int i)

//計算從1到i的和

int sum(int i)

return k;

}//更改a的元素時

void add(int i,int num)

}int main()

a[0]=0;

/*建立數狀陣列c方法一

int x;

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

//建立數狀陣列c方法二

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

else

}return

0;}

士兵殺敵二 nyist 樹狀陣列

描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。輸入 只有一組測試資料 第一行是兩個整數...

士兵殺敵(樹狀陣列)

南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。輸入只有一組測試資料 第一行是兩個整數n,m,...

南陽 116 士兵殺敵(二) 樹狀陣列

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候...