#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <set>
#include <map>
#include <queue>
#include <string>
#define maxn 8080
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ALL %I64d
using namespace std;
typedef long long ll;
//线段树的定义
struct segment
{
int l,r;
int value;
int nv;
} son[maxn<<2];
//PushUP函数
void PushUp(int rt)
{
son[rt].value=son[rt<<1].value+son[rt<<1|1].value;
}
//PushDown函数
void PushDown(int rt)
{
if(son[rt].nv)
{
son[rt<<1].nv+=son[rt].nv;
son[rt<<1|1].nv+=son[rt].nv;
//son[rt<<1].value+=(son[rt<<1].r-son[rt<<1].l+1)*son[rt].nv;
//son[rt<<1|1].value+=(son[rt<<1|1].r-son[rt<<1|1].l+1)*son[rt].nv;
son[rt].nv=0;
}
}
//建立线段树
void Build(int l,int r,int rt)
{
son[rt].l=l;
son[rt].r=r;
if(l==r)
{
son[rt].value=1;
return;
}
int m=(l+r)/2;
Build(lson);
Build(rson);
PushUp(rt);
}
//线段树单点更新
void Update_1(int p,int value,int rt)
{
if(son[rt].l==son[rt].r)
{
son[rt].value=value;
return;
}
PushDown(rt);
int m=(son[rt].l+son[rt].r)/2;
if(p<=m)
Update_1(p,value,rt<<1);
else
Update_1(p,value,rt<<1|1);
PushUp(rt);
}
//线段树区间更新
void Update_n(ll w,int l,int r,int rt)
{
if(son[rt].l==l&&son[rt].r==r)
{
son[rt].value+=w*(r-l+1);
son[rt].nv+=w;
return;
}
PushDown(rt);
int m=(son[rt].l+son[rt].r)/2;
if(r<=m)
Update_n(w,l,r,rt<<1);
else if(l>m)
Update_n(w,l,r,rt<<1|1);
else
{
Update_n(w,lson);
Update_n(w,rson);
}
PushUp(rt);
}
//线段树插入位置查找并插入
int Update(int w,int rt)
{
if(son[rt].l==son[rt].r)
{
son[rt].value=0;
return son[rt].l;
}
int m=(son[rt].l+son[rt].r)/2,ret=0;
if(son[rt<<1].value>w)
ret=Update(w,rt<<1);
else
{
w-=son[rt<<1].value;
ret=Update(w,rt<<1|1);
}
PushUp(rt);
return ret;
}
//区间查询函数
ll Query(int l,int r,int rt)
{
if(son[rt].l==l&&son[rt].r==r)
{
return son[rt].value;
}
PushDown(rt);
ll ret=0;
int m=(son[rt].l+son[rt].r)/2;
if(r<=m)
ret=Query(l,r,rt<<1);
else if(l>m)
ret=Query(l,r,rt<<1|1);
else
{
ret=Query(lson);
ret+=Query(rson);
}
//PushUp(rt);
return ret;
}
int main()
{
return 0;
}
线段树模版
最新推荐文章于 2024-03-01 00:18:20 发布