其他分享
首页 > 其他分享> > 多功能线段树模板(完善中)

多功能线段树模板(完善中)

作者:互联网

已完成区间加,区间乘,区间覆盖,区间求和,区间求min\max

#include<bits/stdc++.h>
#define ll long long
#define ls a[k].son[0]
#define rs a[k].son[1]
#define pls(a,b) a=((a)+(b))%mod
#define mul(a,b) a=((a)*(b))%mod
using namespace std;
const ll mod=998244353;
const int N=5e5+11;
const ll inf=1e18;
int tot,rt;
struct SegmentTree{
	struct Node{
		int son[2];
		ll sum,maxn,minn;
		ll tag_p,tag_m=1,tag_c;
		bool is_c;
		//define that tag_c>tag_m>tag_p
	}a[N*31];
	void pushdown(int k,ll l,ll r){
		if(!ls)ls=++tot;
		if(!rs)rs=++tot;
		ll mid=(l+r)>>1;
		if(a[k].is_c){
			a[ls].sum=(mid-l+1)*a[k].tag_c%mod;
			a[rs].sum=(r-mid)*a[k].tag_c%mod;
			a[ls].tag_c=a[rs].tag_c=a[k].tag_c;
			a[ls].is_c=a[rs].is_c=1;
			a[ls].tag_p=a[rs].tag_p=0;
			a[ls].tag_m=a[rs].tag_m=1;
			a[ls].minn=a[rs].minn=a[ls].maxn=a[rs].maxn=a[k].tag_c;
			a[k].is_c=0;a[k].tag_c=0;
		}
		if(a[k].tag_m!=1){
			ll s=a[k].tag_m;
			mul(a[ls].sum,s);
			mul(a[rs].sum,s);
			mul(a[ls].minn,s);
			mul(a[rs].minn,s);
			mul(a[ls].maxn,s);
			mul(a[rs].maxn,s);
			mul(a[ls].tag_p,s);
			mul(a[rs].tag_p,s);
			mul(a[ls].tag_m,s);
			mul(a[rs].tag_m,s);
			a[k].tag_m=1;
		}
		if(a[k].tag_p){
			ll s=a[k].tag_p;
			pls(a[ls].sum,(mid-l+1)*s%mod);
			pls(a[rs].sum,(r-mid)*s%mod);
			pls(a[ls].minn,s);
			pls(a[rs].minn,s);
			pls(a[ls].maxn,s);
			pls(a[rs].maxn,s);
			pls(a[ls].tag_p,s);
			pls(a[rs].tag_p,s);
			a[k].tag_p=0;
		}
	}
	void pushup(int k){
		a[k].sum=a[ls].sum+a[rs].sum;
		a[k].minn=min(a[ls].minn,a[rs].minn);
		a[k].maxn=max(a[ls].maxn,a[rs].maxn); 
	}
	void add(int &k,ll l,ll r,ll L,ll R,ll s){
		if(!k)k=++tot;
		if(l>=L&&r<=R){
			pls(a[k].sum,s*(r-l+1));
			pls(a[k].maxn,s);
			pls(a[k].minn,s);
			pls(a[k].tag_p,s);
			return;
		}
		pushdown(k,l,r);
		ll mid=(l+r)>>1;
		if(L<=mid)add(ls,l,mid,L,R,s);
		if(R>mid)add(rs,mid+1,r,L,R,s);
		pushup(k);
	}
	void cover(int &k,ll l,ll r,ll L,ll R,ll s){
		if(!k)k=++tot;
		if(l>=L&&r<=R){
			a[k].is_c=1;
			a[k].tag_c=s;
			a[k].tag_p=0;
			a[k].tag_m=1;
			a[k].sum=s*(r-l+1)%mod;
			a[k].maxn=a[k].minn=s;
			return;
		}
		pushdown(k,l,r);
		ll mid=(l+r)>>1;
		if(L<=mid)cover(ls,l,mid,L,R,s);
		if(R>mid)cover(rs,mid+1,r,L,R,s);
		pushup(k);
	}
	void multi(int &k,ll l,ll r,ll L,ll R,ll s){
		if(!k)k=++tot;
		if(l>=L&&r<=R){
			mul(a[k].tag_p,s);
			mul(a[k].tag_m,s);
			mul(a[k].sum,s);
			mul(a[k].minn,s);
			mul(a[k].maxn,s); 
			return;
		}
		pushdown(k,l,r);
		ll mid=(l+r)>>1;
		if(L<=mid)multi(ls,l,mid,L,R,s);
		if(R>mid)multi(rs,mid+1,r,L,R,s);
		pushup(k);
	}
	ll qsum(int k,ll l,ll r,ll L,ll R){
		if(!k)return 0;
		if(l>=L&&r<=R)return a[k].sum;
		pushdown(k,l,r);
		ll ret=0,mid=(l+r)>>1;
		if(L<=mid)ret+=qsum(ls,l,mid,L,R);
		if(R>mid)ret+=qsum(rs,mid+1,r,L,R);
		ret%=mod;
		return ret;
	}
	ll qmax(int k,ll l,ll r,ll L,ll R){
		if(!k)return -inf;
		if(l>=L&&r<=R)return a[k].maxn;
		pushdown(k,l,r);
		ll ret=-inf,mid=(l+r)>>1;
		if(L<=mid)ret=max(ret,qmax(ls,l,mid,L,R));
		if(R>mid)ret=max(ret,qmax(rs,mid+1,r,L,R));
		return ret;
	}
	ll qmin(int k,ll l,ll r,ll L,ll R){
		if(!k)return inf;
		if(l>=L&&r<=R)return a[k].minn;
		pushdown(k,l,r);
		ll ret=inf,mid=(l+r)>>1;
		if(L<=mid)ret=min(ret,qmin(ls,l,mid,L,R));
		if(R>mid)ret=min(ret,qmin(rs,mid+1,r,L,R));
		return ret;
	}
}t;
int main(){
	
}

标签:rs,int,线段,多功能,mid,tag,ls,ll,模板
来源: https://www.cnblogs.com/huangxuanao/p/15689827.html