南陽oj116 士兵殺敵(二) 線段樹

2021-08-06 02:55:53 字數 1431 閱讀 2439

時間限制:

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

主要更新那一步驟跟之前模板不太一樣,修改一下即可

#include#includeusing namespace std;

struct node

tree[3000000];

void pushup(int o)

//int f[1000100];

void build(int o,int l,int r) //建樹

int mid=(l+r)/2;

build(o*2,l,mid);

build(o*2+1,mid+1,r);

pushup(o);

}void update(int o,int x,int y) //把節點x的資料+y

int mid=(tree[o].l +tree[o].r)/2;

if(x > mid) //更新的節點在右邊;

update(o*2+1,x,y);

else // 節點在左邊;

update(o*2,x,y);

pushup(o); //更新當前節點資料

}int findsum(int o,int l,int r,int x,int y) //查詢x到y的和

int mid = (l+r) / 2;

if(y<=mid)

return findsum(o*2,l,mid,x,y);

else if(x>mid)

return findsum(o*2+1,mid+1,r,x,y);

else

return findsum(o*2,l,mid,x,mid)+findsum(o*2+1,mid+1,r,mid+1,y);

} int main()

return 0;

}

南陽OJ116 士兵殺敵(二)(線段樹)

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

南陽理工acm 116士兵殺敵(二)(線段樹)

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

nyoj116 士兵殺敵(二) 線段樹)

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