(樹狀陣列)NYOJ116 士兵殺敵(二)

2021-08-21 21:37:29 字數 1685 閱讀 3359

傳送門:nyoj116 士兵殺敵(二)

描述

南將軍手下有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

本題與上一道題相比(字首和)nyoj108 士兵殺敵(一) ,增加的了單點更新。

樹狀陣列解決動態字首和的資料結構。

樹狀陣列是一種解決動態字首和的資料結構,其實質是二進位制拆分。樹狀陣列單次查詢的複雜度為o(log(n)).

可以解決的問題:區間和,單點更新,區間加,單點查詢等問題。

對於區間加和單點查詢是放在一起的概念,單點查詢其實就是傳統意義上的區間求和問題。

例如:對區間[3,6]中的每個數都加5

二維樹狀陣列,

區間最值問題,更推薦線段樹。

樹狀陣列功能比線段樹小,實現簡單,常數小的資料結構。

#include#include#includeusing namespace std;

const int maxn=1000010;

int d[maxn],a;

int n,m;

int lowbit(int x)

int sum(int x)

return res;

}void add(int x,int v)

}int main()

int u,v;

char str[10];

while(m--)

return 0;

}

解析版:

#include#include#includeusing namespace std;

const int maxn=1000010;

int d[maxn],a;

int n,m;

int lowbit(int x)

int sum(int x)

return res;}

void add(int x,int v)}

int main()

int u,v;

char str[10];

while(m--)

return 0;

}

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

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

NYOJ 116士兵殺敵 二 樹狀陣列

士兵殺敵 一 陣列是固定的,所以可以用乙個sum陣列來儲存每個元素的和就行,但是不能每次都加,因為那樣會超時,查詢次數太多。但是這個士兵殺敵 二 就不能用那個方法來解了,因為這個是動態的,中間元素的值可能會變化,所以引出乙個新的東西來。剛開始想了一下,實在是沒有想到方法,就去討論區看了看,一看好像都...

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

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