NYOJ士兵殺敵5 線段樹的區間更新

2021-09-02 16:07:58 字數 1138 閱讀 2540

初學線段樹--區域更新

實現原理:初始的時候,給每個樹節點都給乙個標記,當你在更新某一段區間的時候,要映入乙個標記陣列,來標記該樹節點更新後是否要將更新其子節點,如果該節點的標記值不為空,則表示要對該節點的子節點進行更新,更新完後取消該節點的標記;反之,則無需更新該節點的子節點,該線段樹所對應區間的值可以直接拿來使用。

下面上**(題目來自nyoj士兵殺敵5):

#include#includeusing namespace std;

typedef struct node

;node tree[1000050<<2];

int col[1000050<<2];

int n,c,q;

int mi,ni,add,m,n1;

void build_tree(int v,int l,int r)

int mid=(l+r)/2;

build_tree(v<<1,l,mid);

build_tree(v<<1|1,mid+1,r);

tree[v].value=tree[v<<1].value+tree[v<<1|1].value;

}void pushdown(int v)

}void update(int v,int vl,int vr,int l,int r,int add)

pushdown(v);//進行更新,將原來的標記撤銷,標記到子節點

int mid=(vl+vr)/2;

update(v<<1,vl,mid,l,r,add);

update(v<<1|1,mid+1,vr,l,r,add);

tree[v].value=tree[v<<1].value+tree[v<<1|1].value;

}int query(int v,int vl,int vr,int l,int r)//這裡注意,查詢的時候也必須要進行區域更新,update結束後,

pushdown(v);

int mid=(vl+vr)/2;

return query(v<<1,vl,mid,l,r)+query(v<<1|1,mid+1,vr,l,r);

}int main()

for(int i=0;ireturn 0;

}

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

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

nyoj 士兵殺敵(一) 108 (線段樹)

時間限制 1000 ms 記憶體限制 65535 kb 難度 3 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍現在想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入 只有一組測試資料 第一行是...

nyoj108 士兵殺敵(一) (線段樹)

描述南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍現在想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。注意,南將軍可能會問很多次問題。輸入 只有一組測試資料 第一行是兩個整數n,m,其中n表示士兵的個數 1 輸出對於每乙個詢問,輸出總...