線段樹模版主要是由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...