線段樹模板

2022-03-06 19:19:14 字數 2918 閱讀 1859

#includeusing namespace std;

const int n = 1e6+10;

int n,m,a[n];

int sumv[n<<2];

//合併

void pushup(int o)

//建樹

void build(int o,int l,int r)

int mid = (l+r)>>1;

build(o<<1,l,mid);

build(o<<1|1,mid+1,r);

pushup(o);//向上合併

}//a[x] += y : change(1,1,n,x,y);

//單點修改 o為當前到達節點的編號

void change(int o,int l,int r,int pos,int v)

int mid = (l+r)>>1;

if(pos <= mid) change(o<<1,l,mid,pos,v);//前半段區間

else change(o<<1|1,mid+1,r,pos,v); //後半段區間

pushup(o); //向上更新 有一些線段樹維護了多個值,所以pushup不止一條

}//區間查詢

int querysum(int o,int l,int r,int ql,int qr)

int main()

if(opt == 2)

int mid = (l+r)>>1;

build(o<<1,l,mid);

build(o<<1|1,mid+1,r);

pushup(o);//向上合併

}void pushup(int o)

//a[x] += y : change(1,1,n,x,y);

//單點修改 o為當前到達節點的編號

void change(int o,int l,int r,int pos,int v)

int mid = (l+r)>>1;

if(pos <= mid) change(o<<1,l,mid,pos,v);//前半段區間

else change(o<<1|1,mid+1,r,pos,v); //後半段區間

pushup(o); //向上更新 有一些線段樹維護了多個值,所以pushup不止一條

}//區間查詢

int querymin(int o,int l,int r,int ql,int qr)

int main()

if(opt == 2)

//建樹

void build(int o,int l,int r)

int mid = (l+r)>>1;

build(o<<1,l,mid);

build(o<<1|1,mid+1,r);

pushup(o);//向上合併

}void puttag(int o,int l,int r,int v)

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

void optadd(int o,int l,int r,int ql,int qr,int v)

int mid = (l+r)>>1;

pushdown(o,l,r);//標記下放 因為接下來要更新子區間了

if(ql <= mid) optadd(o<<1,l,mid,ql,qr,v);

if(qr > mid) optadd(o<<1|1,mid+1,r,ql,qr,v);

pushup(o);

}int querysum(int o,int l,int r,int ql,int qr)

int main()

if(opt == 2)

//建樹

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

int mid = (l + r) >> 1;

build(id << 1, l, mid);

build(id << 1 | 1, mid + 1, r);

pushup(id);

}//更新

void update(int id, int l, int r, int x, int v)

int mid = (l + r) >> 1;

if (x <= mid) else

pushup(id);

}//查詢

int query(int id,int l,int r,int x,int y)

int mid = (l + r) >> 1;

int ans = inf;

if( x <= mid)

if( y > mid)

return ans;

}int main()

build(1, 1, n);

int q;

cin >> q;

for (int i = 0; i < q; ++i)

int p;

cin >> p;

for (int i = 0; i < p; ++i)

return 0;

}

void up(int p)

void down(int p, int l, int r)

}void modify(int p, int l, int r, int x, int y, int c)

down(p, l, r); //下傳lazy標記

int mid = (l + r) / 2;

if (x <= mid) modify(p * 2, l, mid, x, y, c);

if (y > mid) modify(p * 2 + 1, mid + 1, r, x, y, c);

up(p);

}

線段樹模板(模板)

參考部落格 持續更新。外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 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...