板子-线段树

#include <iostream>
#include <algorithm>
#include <cstring>
const int maxn=50002*4;
using namespace std;
int tree[maxn];
int lazy[maxn];

void push_up(int root)
{
    tree[root]=tree[root<<1]+tree[root<<1|1];
};

void build_tree(int root,int left,int right)//建树
{
    if(left==right)
    {
        cin>>tree[root];
        return;
    }
    int mid=(left+right)>>1;
    build_tree(root*2,left,mid);
    build_tree(root*2+1,mid+1,right);
    push_up(root);
}

void push_down(int root,int left_num,int right_num)//lazy数组的传递关系是直接赋值传递
{
    if(lazy[root])
    {
        lazy[root*2]=lazy[root];
        lazy[root*2+1]=lazy[root];
        tree[root*2]=lazy[root]*left_num;
        tree[root*2+1]=lazy[root]*right_num;
        lazy[root]=0;
    }
}

void update(int root,int pos,int num,int left, int right)//点修改
{
    if(left==right)
    {
        tree[root]+=num;//点+num
        // tree[root]=num; 点赋值就是把+num改成=num
        return;
    }
    int mid=(left+right)/2;
    if(pos<=mid)
    {
        update(root*2,pos,num,left,mid);
    }
    else
    {
        update(root*2+1,pos,num,mid+1,right);
    }
    push_up(root);
}

void section_update(int root,int L,int R,int left,int right,int val)
{
    if(L<=left&&right<=R)
    {
        lazy[root]=val;
        tree[root]=val*(right-left+1);
        return;
    }
    int mid=(left+right)/2;
    push_down(root,mid-left+1,right-mid);
    if(L<=mid)
    {
        section_update(root*2,L,R,left,mid,val);
    }
    if(mid<R)
    {
        section_update(root*2+1,L,R,mid+1,right,val);
    }
    push_up(root);
}

int query(int root,int L,int R,int left,int right)//区间询问求和
{
    if(L<=left&&R>=right)
    {
        return tree[root];
    }
    int mid=(left+right)/2;
    push_down(root,mid-left+1,right-mid);
    int ans=0;
    if(L<=mid) ans+=query(L,R,left,mid,root*2);
    if(R>mid) ans+=query(L,R,mid+1,right,root*2+1);
    return ans;
}

int get_sum(int root,int left,int right,int L,int R)//区间求max
{
    int mid=(L+R)/2;
    int res=0;
    if(left==L&&right==R)
    {
        return tree[root];
    }
    if(left>mid)
    {
       res+=get_sum(root*2+1,left,right,mid+1,R);
    }
    else if(right<=mid)
    {
        res+=get_sum(root*2,left,right,L,mid);
    }
    else
    {
        res+=get_sum(root*2,left,mid,L,mid);
        res+=get_sum(root*2+1,mid+1,right,mid+1,R);
    }
    return res;
}

猜你喜欢

转载自blog.csdn.net/neuq_zsmj/article/details/80360622