NYOJ 116 士兵殺敵(二)

2021-07-11 02:22:11 字數 1436 閱讀 9510

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

難度:5

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

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

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

輸入只有一組測試資料

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

輸出對於每次查詢,輸出乙個整數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

樣例輸出

688

20

解題思路:此題用了樹狀陣列和線段樹兩種解法,本人認為各有各的優缺點。線段樹比較占用記憶體,程式的**也比較多,但比樹狀陣列更強大,能解決後者不能解決的問題;樹狀陣列**簡單,記憶體占用也不大,主要是lowbit()函式的理解可能對於有些人來說比較不易,我剛開始看到這個函式的時候也表示懵逼了,不過也不難理解,只要想到了就好說了。

線段樹詳解見:

樹狀陣列詳解:

下面上本題的**:

樹狀陣列:

#include #include int c[1000010];

int n,m;

void add(int k,int y)

}int find_sum(int a)

return sum;

}int main()

for(i=1;i<=m;i++)

return 0;

}

線段樹:

#include #include #define max_n 2097500

struct node

s[max_n];

void updata(int l,int r,int root,int x,int y)

int mid=(l+r)/2;

if(x<=mid)

updata(l,mid,root*2,x,y);

else

updata(mid+1,r,root*2+1,x,y);

s[root].sum=s[root*2].sum+s[root*2+1].sum;

}int find_sum(int l,int r,int root,int x,int y)

int main()

for(i=1;i<=m;i++)

else

}return 0;

}

NYOJ 116 士兵殺敵(二)

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

NYOJ 116 士兵殺敵 二

樹狀陣列已經看了好幾天了,一直都是半懂半不懂,實在是忍無可忍了,今天晚上又看了看劉汝佳的 似乎明白了樹狀陣列到底是怎麼回事,果斷寫篇部落格,明天要把線段樹和字典樹給搞定,不能再肉了 樹狀陣列可以很方便的查詢任意區間內所有元素的和,還可以對樹進行修改,時間複雜度位log n 有兩個很重的陣列,a n ...

nyoj 116 士兵殺敵二

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