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

线段树模板

时间:2019-07-31 15:18:35      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:单点   oid   开始   ons   修改   const   区间查询   定义   modify   

ZKW线段树

数组定义

const ll M=1<<19;//从1开始,不能修改0和M
ll T[M+M];

单点修改区间查询

void modify(int n,int v){
    for(T[n+=M]=v,n>>=1;n;n>>=1)
        T[n]=T[n+n]+T[n+n+1];
}
ll query(ll l,ll r){
    ll ans=0;
    for(l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){
        if(~l&1) ans+=T[l^1];
        if(r&1) ans+=T[r^1];
    }
    return ans;
}

单点修改区间最值

void modify(ll n,ll v){
    for(T[n+=M]=v,n>>=1;n;n>>=1)
        T[n]=max(T[n+n],T[n+n+1]);
}
ll query(ll l,ll r){
    ll rmax=-INF,lmax=-INF;
    for(l+=M-1,r+=M+1;l^r^1;l>>=1,r>>=1){
        if(~l&1) lmax=max(lmax,T[l^1]);
        if(r&1) rmax=max(rmax,T[r^1]);
    }
    return max(lmax,rmax);
}

区间修改单点查询

void add(int l,int r,int w){
    for(l+=m-1,r+=m+1;l^r^1;l>>=1,r>>=1){
        if(~l&1) T[l^1]+=w;
        if(r&1) T[r^1]+=w;
    }
}
int query(int x){
    int ans=0;
    for(x+=m;x;x>>=1)
        ans+=T[x];
    return ans;
}

线段树模板

标签:单点   oid   开始   ons   修改   const   区间查询   定义   modify   

原文地址:https://www.cnblogs.com/ucprer/p/11275901.html

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