初學線段樹--區域更新
實現原理:初始的時候,給每個樹節點都給乙個標記,當你在更新某一段區間的時候,要映入乙個標記陣列,來標記該樹節點更新後是否要將更新其子節點,如果該節點的標記值不為空,則表示要對該節點的子節點進行更新,更新完後取消該節點的標記;反之,則無需更新該節點的子節點,該線段樹所對應區間的值可以直接拿來使用。
下面上**(題目來自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 輸出對於每乙個詢問,輸出總...