題意:假設貨架上從左到右擺放了n種商品,並且依次標號為1到n,其中標號為i的商品的**為pi。小hi的每次操作分為兩種可能,第一種是修改**——小hi給出一段區間[l, r]和乙個新的**newp,所有標號在這段區間中的商品的**都變成newp。第二種操作是詢問——小hi給出一段區間[l, r],而小ho要做的便是計算出所有標號在這段區間中的商品的總**,然後告訴小hi。
需要用到推遲對子節點的更新。直接更新孩子節點沒有必要,這樣會增加時間複製的。當訪問到的時候再去更新孩子節點。
還是使用陣列來儲存完全二叉樹的結構,初始化時,lazy都為false。
#include#include#include
using
namespace
std;
#define m 100005
intarr[m];
struct
node;
node nodes[
4 *m];
void buildtree(int l, int r, int
i)
int mid = (l + r) >> 1
; buildtree(l, mid, i * 2
); buildtree(mid + 1, r, i * 2 + 1
); nodes[i].sum = nodes[i * 2].sum + nodes[i * 2 + 1].sum; //
!!!}
void update(int l, int r, int v, int
i)
int mid = (nodes[i].l + nodes[i].r) >> 1
;
if (r <=mid)
update(l, r, v, i * 2
);
else
if (l >mid)
update(l, r, v, i * 2 + 1
);
else
nodes[i].sum = nodes[i * 2].sum + nodes[i * 2 + 1].sum; //
!!!}
void pushdown(inti)}
int query(int l, int r, int
i)
int mid = (nodes[i].l + nodes[i].r) >> 1
;
if (r <=mid)
else
if (l >mid)
else
}int
main()
buildtree(
1, n, 1
); scanf("%d
", &m);
while (m--)
else}}
return0;
}
防守陣地 II 線段樹 區間修改
e 防守陣地 ii time limit 3000msmemory limit 32768kb64bit io format i64d i64u submit status practice fzu 2171 description 部隊中總共有n個士兵,每個士兵有各自的能力指數xi,在一次演練中,...
線段樹 區間修改
我們對於線段樹的區間修改你可以用乙個最傻的辦法迴圈進行單點修改 時間複雜度太高十分麻瓜 所以,我們要用乙個聰明的做法延遲標記 lazy 我們在執行修改指令時,同樣可以在 l pl pr r 的情況下立即返回,只不過在回溯之前向節點p增加乙個標記,標識 該節點曾經被修改過,但其子節點尚未被更新 如果在...
hdu Just a Hook(線段樹區間修改)
線段樹模板題,練的是懶惰標記。懶惰標記,就是更新一段區間的時候,如果小區間被包含在了所需要更新的區間裡面,那麼直接對代表這個區間的陣列元素賦值,之後做乙個標記 表示這個區間的子區間都需要更新 但是不繼續遞迴 這樣可以節省很多的時候 11657115 2014 09 15 14 17 26 accep...