线段树
线段树可以用来解决区间问题,它能更有效地进行区间询问、区间更新、区间统计等。
线段树的构建
struct SegmentTree
{
int Left,Right;
int data;
}t[MAXN*4];
void Build_Tree(int p,int Left,int Right)
{
t[p].Left=Left;
t[p].Right=Right;
if(Left==Right)
t[p].data=a[Left];
else
{
int mid=(Left+Right)/2;
Build_Tree(p*2,Left,mid);
Build_Tree(p*2+1,mid+1,Right);
t[p].data=max(t[P*2].data,t[p*2+1].data);
}
}
线段树的区间询问
int Ask(int p,int Left,int Right)
{
if(Left<=t[p].Left&&Right>=t[p].Right)
return t[p].data;
int mid=(t[p].Left+t[p].Right)/2;
int ans=-(1<<30);
if(Left<=mid)
ans=max(ans,Ask(p*2,Left,Right));
if(Right>mid)
ans=max(ans,Ask(p*2+1,Left,Right));
return ans;
}
线段树的单点修改
void Change_Value(int p,int x,int value)
{
if(t[p].Left==t[p].Right)
t[p].data=value;
else
{
int mid=(t[p].Left+t[p].Right)/2;
if(x<=mid)
Change_Value(p*2,x,value);
else
Change_Value(p*2+1,x,value);
t[p].data=max(t[p*2].data,t[p*2+1].data);
}
}