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

2021-08-21 14:37:10 字數 1310 閱讀 1589

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

難度:5

輸入只有一組測試資料

第一行是兩個整數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

描述

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

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

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

用樹狀陣列儲存,例c[1]儲存a[1]c[2]儲存a[1]+a[2],其他按圖以此類推。

1,插入,直接呼叫add(int i,int t),若例:i=1,t=2;那add函式則會將c1,c2,c4,c8全加上t,全都執行c[i]=c[i]+t;至於i怎麼從1到8迴圈,則與i=i+lowbit(i)函式有關。

2,查詢查詢函式int sum(int i),區間查詢,輸入x,y。sum函式的功能是將c陣列i之前的(包括i)的數加起來,也就是c的字首和,那輸出區間和的時候直接輸出sum(y)-sum(x-1)即可。例:查詢1 3,也就是將a1,a2,a3的和輸出。

sum(int i)函式裡會將c3,c2加起來,至於i如何從3到2與 i=i-lowbit(i);有關。

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

#include#include#define lowbit(x) (x&(-x))

using namespace std;

const int maxn=1000005;

int c[maxn];

int n,m;

void add(int j,int t)

int sum(int j)

int main()

char s[10];

int x,y;

while(m--)

if(strcmp(s,"add")==0)}}

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

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

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

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

NYOJ 116士兵殺敵 二 樹狀陣列

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