NYOJ 116 士兵殺敵 (線段樹,區間和)

2022-07-16 20:36:07 字數 1573 閱讀 2019

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

難度:5

描寫敘述

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

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

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

輸入僅僅有一組測試資料

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

(1(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

例子輸出

688

20

第一道自己獨立完畢的線段樹!!

紀念一下。

【原始碼】

#include#include#include#define l(m) m<<1

#define r(m) m<<1|1

using namespace std;

int n,m;

const int maxn = 1000000+1;

int num[maxn];

struct nodetree[maxn<<2]; //開4倍陣列

void build(int m,int l,int r)

int mid = (tree[m].l+tree[m].r)>>1;

build(l(m),l,mid); //遞迴構造左右子樹

build(r(m),mid+1,r);

tree[m].sum = tree[l(m)].sum+tree[r(m)].sum; //回溯。將子節點的sum加到父節點上

}void update(int m,int a,int x)

int mid = (tree[m].l+tree[m].r)>>1;

// cout<<"bug"<=a)

update(l(m),a,x);

else

update(r(m),a,x);

tree[m].sum=tree[l(m)].sum+tree[r(m)].sum;

}int query(int m,int l,int r)

int mid = (tree[m].l+tree[m].r)>>1;

if(mid>=r) //這裡也能夠寫成 if else if else

return query(l(m),l,r);

if(mid

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

時間限制 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人,之後南將軍再詢問的時候...

NYOJ 116 士兵殺敵(二)(線段樹)

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