码迷,mamicode.com
首页 > 其他好文 > 详细

线段树模版

时间:2014-08-16 12:35:20      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:blog   os   io   2014   amp   log   ef   type   

#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;
}

线段树模版,布布扣,bubuko.com

线段树模版

标签:blog   os   io   2014   amp   log   ef   type   

原文地址:http://blog.csdn.net/knight_kaka/article/details/38612075

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!