線段樹總結

2021-08-07 07:01:24 字數 1555 閱讀 2389

線段樹模版主要是由build函式,query函式,updata函式,pushdown函式組成

//build函式 

void build(int id,int ll,int rr)

int mid=(ll+rr)/2;

build(id*2,ll,mid);

build(id*2+1,mid+1,rr);

s[id]=s[id*2]+s[id*2+1]; //這個地方隨著題目的要求而變化

}

//資料的更新 

void updata(int id,int ll,int rr,int l,int r,int v)

if(lazy[id])

pushdown(id,ll,rr); // 單點更新忽略

int mid=(ll+rr)/2;

if(r<=mid) // 當查詢的右值在中點的左邊就只查詢左邊到中間

updata(id*2,ll,mid,l,r,v);

else if(l>mid) // 同上

updata(id*2+1,mid+1,rr,l,r,v);

else

s[id]=s[id*2]+s[id*2+1]; //每次都把資料更新了(很重要)

}

//pushdown函式是在區間更新的時候用到的 

//作用就是把lazy裡面的資料下放到接下來的兩個資料

// 基本上都能直接用

void pushdown(int id,int l,int r)

我就直接把hdu - 1698 just a hook的**貼在這兒
#includeusing namespace std;

int s[400005],lazy[400005];

void pushdown(int id,int l,int r)

void build(int id,int ll,int rr)

int mid=(ll+rr)/2;

build(id*2,ll,mid);

build(id*2+1,mid+1,rr);

s[id]=s[id*2]+s[id*2+1];

}void updata(int id,int ll,int rr,int l,int r,int v)

if(lazy[id])

pushdown(id,ll,rr);

int mid=(ll+rr)/2;

if(r<=mid)

updata(id*2,ll,mid,l,r,v);

else if(l>mid)

updata(id*2+1,mid+1,rr,l,r,v);

else

s[id]=s[id*2]+s[id*2+1];

}int main()

printf("case %d: the total value of the hook is %d.\n",i,s[1]);

}return 0;

}

線段樹總結

線段樹總結 線段樹的原理就是每乙個區間都可以被分成若干個不相交連續區間 重要 線段樹維護的資料 1.自身結構的資料 比如 左兒子 右兒子的編號 2.懶惰標記 整段區間都變成乙個值 或者將要進行什麼操作 根據每次操作的型別 把操作的區間分成若干個不連續的區間 然後把操作的標記賦值給相應的區間 3.答案...

線段樹總結

線段樹的入門級 總結 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中的每乙個非葉子節點 a,b 它的左兒子表示的區間為 a,a b 2 右兒子表示的區間為 a b 2 1,b 因此線段樹是平衡二叉樹,最後的子節點數目為n,即整...

線段樹總結

解決的題目 對區間所對應的一些資料進行修改,查詢。基本步驟 先建樹,然後插入資料,然後更新,查詢。關鍵部分 用線段樹解題,關鍵是要想清楚每個節點要存哪些資訊以及這些資訊如何高效更新,維護,查詢。不要一更新就更新到葉子節點,那樣更新效率最壞就可能變成o n 的了。建樹的方式 1 陣列 若根節點下標為0...