函式名稱
函式作用
build(l,r,k)
建造線段樹
findmx(k,l,r)
查詢指定區間內最大值
findmn(k,l,r)
查詢指定區間內最小值
countsum(k,l,r)
計算指定區間內元素和………
變數名稱
變數意義
tree[i].left
樹上節點[i]的左頂點
tree[i].right
樹上節點[i]的右頂點
tree[i].value
樹上節點[i]所指代線段的區間和
tree[i].max
樹上節點[i]所指代線段的區間最大值
tree[i].min
樹上節點[i]所指代線段的區間最小值
tree[i].change
未新增 樹上節點[i]所指代線段的區間是否被修改過
(in function) l
當前所要查詢線段的左頂點
(in function) r
當前所要查詢線段的右頂點
(in function) mid
當前所要查詢線段的中點(遞迴轉移用)………
原理函式名稱
原理解釋
build
構建乙個區間長度為n的線段樹.判斷l是否等於r,不等則遞迴建造左右子樹,並處理區間和
findmx
查詢區間[l..r]中的最大值.判斷兩區間是否相交,遞迴查詢子區間內最大值
findmn
查詢區間[l..r]中的最小值.判斷兩區間是否相交,遞迴查詢子區間內最大值
countsum
計算區間[l..r]的和.判斷當前區間是否被包含,否則遞迴查詢至包含,最後相加………
**:
#include#define n 200001
using namespace std;
struct pointt[n];
int num[n>>1];
int n,l,r;
intmax(int i,int j)
void build(int l,int r,int k)elsereturn;
}int findmx(int k,int l,int r)else
}int findmn(int k,int l,int r)else
}int countsum(int k,int l,int r)else
}int main()
支援區間修改、區間求和(這才是線段樹優勢所在)
**:
#include
#define n 200001
using
namespace
std;
struct pointt[n];
int n,m,k,ans;
void pushup(int x)void pushdown(int x)void build(int x,int l,int r)int mid=(l+r)>>1,tmp=x<<1;
build(tmp,l,mid),build(tmp+1,mid+1,r);
pushup(x);
}void update(int x,int l,int r,int a)if(t[x].a)pushdown(x);
update(tmp,l,r,a);
update(tmp+1,l,r,a);
pushup(x);
}void query(int x,int l,int r)
if(t[x].a)pushdown(x);
int tmp=x<<1,mid=(t[x].l+t[x].r)>>1;
if(r<=mid)query(tmp,l,r);
else
if(l>mid)query(tmp+1,l,r);
else query(tmp,l,mid),query(tmp+1,mid+1,r);
}main()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...