士兵殺敵(二)
時間限制: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人,之後南將軍再詢問的時候...