线段树的各种板板~(*^▽^*)

$\color{purple}{板板}$
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define INF 0x3f3f3f3f
#define mst(a,b) memset(a,b,sizeof(a))
#define Elaina 0
#define lson (rt<<1)
#define rson (rt<<1|1) //¼´rson 
const int N=1e5+100;
int a[N],n,m;
char s[10];

struct Segment_tree{

    struct seg_tree{
    	int l,r,maxx,minn,sum;
    	int lazy;
    }tr[N<<2];

    void pushup(int rt){
    	tr[rt].sum=tr[lson].sum+tr[rson].sum;
    	tr[rt].maxx=max(tr[lson].maxx,tr[rson].maxx);
    	tr[rt].minn=min(tr[lson].minn,tr[rson].minn);
    }

    //建树
    void build(int rt,int l,int r){
    	tr[rt].l=l;
    	tr[rt].r=r;
    	if(l==r){
    		tr[rt].sum=a[l];
    		return ;
    	}
    	int mid=(l+r)>>1;
    	build(lson,l,mid);
    	build(rson,mid+1,r);
    	pushup(rt);
    }

    //求总和更新值
    void changesum(int rt,int pos,int k){
    	if(tr[rt].l==tr[rt].r){
    		tr[rt].sum+=k;
    		return;
    	}
    	if(pos<=tr[lson].r)
    		changesum(lson,pos,k);
    	else
    		changesum(rson,pos,k);
    	tr[rt].sum=tr[lson].sum+tr[rson].sum;
    	return;
    }

    //求最大更新值
    void changemax(int rt,int pos,int k){
    	if(tr[rt].l==tr[rt].r){
    		tr[rt].maxx=k;
    		return;
    	}
    	int mid=(tr[rt].l+tr[rt].r)>>1;
    	if(pos<=mid)
    		changemax(lson,pos,k);
    	else
    		changemax(rson,pos,k);
    	tr[rt].maxx=max(tr[lson].maxx,tr[rson].maxx);
    	return;
    }

    //求最小更新值1
    void changemin(int rt,int pos,int k){
    	if(tr[rt].l==tr[rt].r){
    		tr[rt].minn=k;
    		return;
    	}
    	int mid=(tr[rt].l+tr[rt].r)>>1;
    	if(pos<=mid)
    		changemin(lson,pos,k);
    	else
    		changemin(rson,pos,k);
    	tr[rt].minn=min(tr[lson].minn,tr[rson].minn);
    	return;
    } 

    //求最小更新值2
    int askmin2(int rt,int l,int r){
    	if(l>r){
    		return INF;
    	}
    	if(tr[rt].l>=l&&tr[rt].r<=r){
    		return tr[rt].minn;
    	}
    	int mid=(tr[rt].l+tr[rt].r)>>1;
    	if(r<=mid){
    		return askmin(lson,l,r);
    	}
    	if(l>mid){
    		return askmin(rson,l,r);
    	}else{
    		return min(askmin(lson,l,mid),askmin(rson,mid+1,r));
    	}
    }

    //查询区间和
    int asksum(int rt,int l,int r){
    	if(l<=tr[rt].l&&tr[rt].r<=r){
    		return tr[rt].sum;
    	}
    	if(tr[rt].r<l||tr[rt].l>r){
    		return 0;
    	}
    	int sum=0;
    	if(tr[lson].r>=l) sum+=asksum(lson,l,r);
    	if(tr[rson].l<=r) sum+=asksum(rson,l,r);
    	return sum;
    } 

    //查询区间最大值
    int askmax(int rt,int l,int r){
    	if(tr[rt].l>=l&&tr[rt].r<=r){
    		return tr[rt].maxx;
    	}
    	int mid=(tr[rt].l+tr[rt].r)>>1;
    	int res=-INF;
    	if(l<=mid){
    		res=max(res,askmax(lson,l,r));
    	}
    	if(r>mid){
    		res=max(res,askmax(rson,l,r));
    	}
    	return res;
    }

    //查询区间最小值
    int askmin(int rt,int l,int r){
    	if(tr[rt].l>=l&&tr[rt].r<=r){
    		return tr[rt].minn;
    	}
    	int mid=(tr[rt].l+tr[rt].r)>>1;
    	int res=INF;
    	if(l<=mid){
    		res=min(res,askmin(lson,l,r));
    	}
    	if(r>mid){
    		res=min(res,askmin(rson,l,r));
    	}
    	return res;
    }

    //延迟标记(懒标记)区间修改 区间(也可单点)查询
    //void pushdown(int rt){
    //	if(tr[rt].lazy){
    //		int lz=tr[rt].lazy;
    //		tr[rt].lazy=0;
    //		tr[lson].lazy+=lz;
    //		tr[rson].lazy+=lz;
    //		tr[lson].sum+=lz*(tr[lson].r-tr[lson].l+1);
    //		tr[rson].sum+=lz*(tr[rson].r-tr[rson].l+1);
    //	}
    //}
    //void update(int rt,int l,int r,int k){
    //	if(tr[rt].l>=l&&tr[rt].r<=r){
    //		tr[rt].lazy+=k;
    //		tr[rt].sum+=k*(tr[rt].r-tr[rt].l+1);
    //		return;
    //	}
    //	pushdown(rt);
    //	int mid=(tr[rt].l+tr[rt].r)>>1;
    //	if(l<=mid) update(lson,l,r,k);
    //	if(r>mid) update(rson,l,r,k);
    //	pushup(rt);
    //}
    //int query(int rt,int l,int r){
    //	if(tr[rt].l>=l&&tr[rt].r<=r){
    //		return tr[rt].sum;
    //	}
    //	pushdown(rt);
    //	int mid=(tr[rt].l+tr[rt].r)>>1;
    //	int res=0;
    //	if(l<=mid) res+=query(lson,l,r);
    //	if(r>mid) res+=query(rson,l,r);
    //	return res;
    //}

    //标记永久化
    void update(int rt,int l,int r,int k){
		tr[rt].cnt+=(min(tr[rt].r,r)-max(tr[rt].l,l)+1)*k;
		if(tr[rt].l>=l && tr[rt].r<=r){
			tr[rt].lz+=k;
			return ;
		}
		int mid=(tr[rt].l+tr[rt].r)>>1;
		if(l<=mid) update(ls,l,r,k);
		if(r>mid) update(rs,l,r,k);
	}
	int query(int rt,int l,int r,int tag){
		if(tr[rt].l>=l && tr[rt].r<=r){
			return tr[rt].cnt+(tr[rt].r-tr[rt].l+1)*tag;
		}
		int mid=(tr[rt].l+tr[rt].r)>>1,res=0;
		tag+=tr[rt].lz;
		if(l<=mid) res+=query(ls,l,r,tag);
		if(r>mid) res+=query(rs,l,r,tag);
		return res;
	}
}Tr;

signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	if(n==0)return Elaina;
	Tr.build(1,1,n);
	cin>>m;
	//ÊäÈëÓ¦¸Ã²»ÓÃÎҽ̸øÄã°È(^_^) 
	for(int i=1;i<=m;i++){
		
	}
	return Elaina;
}

都看到这了,真的不点个赞吗(>ω<*)

posted @ 2024-02-20 09:21  Elaina_0  阅读(31)  评论(1编辑  收藏  举报
浏览器标题切换
浏览器标题切换end