一定要做的線段樹習題彙總
一、模板
#include#include#includeusing namespace std;
#define maxn 200010
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
int sum[maxn<<2];
void pushup(int p)
void build(int l,int r,int p)
int mid=(l+r)>>1;
build(lson);
build(rson);
pushup(p);
}int query(int l,int r,int p,int a,int b)
int mid=(l+r)>>1; if(a<=mid) update(lson,a,b); else update(rson,a,b); pushup(p);}int main() } return 0;}
二、區間查詢,無單點更新
#include #include#include#includeusing namespace std;const int maxn=200010;
int sum[maxn<<2];//陣列開四倍
int h,w,n;
//p表示下標
void pushup(int p)
//建樹
void build(int l,int r,int p)
//否則的話,分別遞迴左兒子和右兒子
int mid=(r+l)>>1;
build(l,mid,p<<1);
build(mid+1,r,p<<1|1);
pushup(p);
}//區間查詢
//線段樹的最高頂點是表示所有行裡面最大的寬度
int query(int l,int r,int p,int num)
int ans;
int mid=(r+l)>>1;//下面要注意,先儲存ans,然後更新值後再返回
if(sum[p<<1]>=num)
else
pushup(p);
return ans;
}int main()
void build(int l,int r,int p)
int mid=(l+r)>>1;
build(lson);
build(rson);
pushup(p);
}int query(int l,int r,int p,int i,int j)
int ans=0;
int mid=(l+r)>>1;
if(mid=i) ans+=query(lson,i,j);
return ans;
}void update(int l,int r,int p,int i,int j)
int mid=(l+r)>>1;
if(mid>=i)
update(lson,i,j);
else
update(rson,i,j);
pushup(p);
}int main()
}return 0;
}
四、區間查詢最值+單點更新
#include#include#includeusing namespace std;
#define maxn 200010
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
int sum[maxn<<2];
void pushup(int p)
void build(int l,int r,int p)
int mid=(l+r)>>1;
build(lson);
build(rson);
pushup(p);
}int query(int l,int r,int p,int a,int b)
int main()
}return 0;
}
線段樹模板(模板)
參考部落格 持續更新。外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳 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...