線段樹模板

2021-08-08 05:58:39 字數 1564 閱讀 2551

線段樹這個模板是從別的大牛裡摘抄的一部分,然後稍作了一點點的改動。寫在自己的部落格裡就是為了以後自己溫習演算法方便,並無它意。

附上大牛的部落格位址線段樹詳解也請點這裡

線段樹的五種基本操作

#include

#include

using namespace std;

int n,p,a,b,m,x,y,ans;

const int m=1e5+10;

struct node

tree[4

*m+50];

void build_tree(int k,int ll,int rr)//建樹

int mid=(ll+rr)/2;

build_tree(k*2,ll,mid);

build_tree(k*2+1,mid+1,rr);

tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;

}void down(int k)//標記下傳

void ask_point(int k)//單點查詢

if(tree[k].add)

down(k);

int mid=(tree[k].l+tree[k].r)/2;

if(x

<=mid)

ask_point(k*2);

else

ask_point(k*2+1);

}void change_point(int k)//單點修改

if(tree[k].add) down(k);

int mid=(tree[k].l+tree[k].r)/2;

if(x

<=mid)

change_point(k*2);

else

change_point(k*2+1);

tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;

}void ask_interval(int k)//區間查詢

if(tree[k].add)

down(k);

int mid=(tree[k].l+tree[k].r)/2;

if(a<=mid)

ask_interval(k*2);

if(b>mid)

ask_interval(k*2+1);

}void change_interval(int k)//區間修改

if(tree[k].add)

down(k);

int mid=(tree[k].l+tree[k].r)/2;

if(a<=mid)

change_interval(k*2);

if(b>mid)

change_interval(k*2+1);

tree[k].sum=tree[k*2].sum+tree[k*2+1].sum;

}int main()

else

if(p==2)

else

if(p==3)

else

}}

線段樹模板(模板)

參考部落格 持續更新。外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 img xhrgdjcd 1613976863463 區間儲存在陣列中的下標對應為 12 3 4 5 6 7 8 9 10 11 12 13 14 15 四部分單點更新 根據題目的要求編寫自己的pushup,query...

線段樹模板

include include include using namespace std const int size 10010 struct node the node of line tree class linetree void updatem void updateline public ...

線段樹模板

單點更新,區間求最值 include include include include include define n 222222 using namespace std int num n struct tree tree n 4 void push up int root void build...