栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

线段树模板

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线段树模板

一、建树

void build(int node, int left, int right)
{
    if(right == left){
        tree[node] = 1;
    }
    else{
        int left_node = 2*node;
        int right_node = 2*node + 1;
        int mid = (left+right) / 2;
        build(left_node,left,mid);
        build(right_node,mid+1,right);
        tree[node] = tree[right_node] + tree[left_node];
    }
}

二、单点修改

void Add(int node, int left , int right, int idx, int more)   //单点修改
{
    if(left == right)
        tree[node] += more;
    else{
        int mid = (left+right) / 2;
        int left_node = node*2 + 1;
        int right_node = node*2 + 2;
        if(idx <= mid){
            Add(left_node,left,mid,idx,more);
        }
        else if(idx > mid){
            Add(right_node,mid+1,right,idx,more);
        }
        tree[node] = tree[left_node] + tree[right_node];
    }
}

三、区间查询

ll check(int node,int left,int right,int search_left,int search_right)
{
     
    if(search_left >= left && search_right <= right)
        return p[node];
    int mid = (search_left + search_right) / 2;
    int left_node = node * 2;
    int right_node = node * 2 + 1;
    ll res=0;
    if(left <= mid)
        res+=check(left_node,left,right,search_left,mid);
    if(right > mid)
        res+=check(right_node,left,right,mid+1,search_right);
    return res;
}

四、区间修改

void putdown(int node, int left, int right){
    int left_node = 2*node;
    int right_node = 2*node + 1;   
    int mid = (left+right) / 2;
    tree[left_node] = up[node] * (mid - left + 1);
    tree[right_node] = up[node] * (right - mid);
    up[left_node] = up[node];
    up[right_node] = up[node];
    up[node] = 0;
}

void change(int node, int left, int right, int from, int end, int val)
{
    if(from <= left && end >= right){
        tree[node] = (right - left + 1) * val;
        up[node] = val;
        return;
    }
    if(up[node]){
        putdown(node,left,right);
    }
    int left_node = 2*node;
    int right_node = 2*node + 1;
    int mid = (left + right) / 2;
    if(from <= mid){
        change(left_node, left, mid, from, end, val);
    }
    if(end > mid){
        change(right_node,mid+1,right,from,end,val);
    }
    tree[node] = tree[left_node] + tree[right_node];
} 

五、求区间最大值

void build(int node, int left, int right)
{
    if(right == left){
        MAX[node] = a[left];
    }
    else{
        int left_node = 2*node;
        int right_ndoe = 2*node + 1;
        int mid = (left+right) / 2;
        build(left_node,left,mid);
        build(right_ndoe,mid+1,right);
        MAX[node] = max(MAX[left_node],MAX[right_ndoe]);
    }
}

void query(int node, int left, int right, int from, int end)
{
    if(left == from && right == end){
        sum = max(sum,MAX[node]);
    }
    else{
        int left_node = 2*node;
        int right_node = 2*node + 1;
        int mid = (left+right) / 2;
        if(from <= mid){
            query(left_node,left,mid,from,min(mid,end));
        }
        if(end > mid){
            query(right_node,mid+1,right,max(mid + 1,from),end);
        }        
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/287534.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号