模板库

终于也要有自己的模板库了呢。

鸽着,先放点复用性强的板子上去。

树状数组(Bit)

struct Bit{
	int bit[N];
	inline int lowbit(int x){return x&(-x);}
	void add(int p,int v){for(;p<=n;p+=lowbit(p))bit[p]+=v;}
	int ask(int p){int ans=0;for(;p;p-=lowbit(p))ans+=bit[p];return ans;}
	void upd(int l,int r,int v){add(l,1);add(r+1,-1);}
	int qry(int l,int r){return ask(r)-ask(l-1);}
	void clear(){memset(bit,0,sizeof(bit));}
};

线段树(Seg)

struct Seg{
	struct node{
		int v,ta,tm;
	}t[N*4];
	void puttag(int p,int len,int ta,int tm){
		t[p].v=(t[p].v*tm+ta*len);
		t[p].ta=(t[p].ta*tm+ta);
		t[p].tm=t[p].tm*tm;
	}
	void pushdown(int p,int l,int r){
		int m=(l+r)>>1;
		puttag(p*2,m-l+1,t[p].ta,t[p].tm);
		puttag(p*2+1,r-m,t[p].ta,t[p].tm);
		t[p].ta=0,t[p].tm=1;
	}
	void pushup(int p){
		t[p].v=(t[p*2].v+t[p*2+1].v);
	}
	void build(int p,int l,int r){
		t[p].ta=0,t[p].tm=1;
		if(l==r){
			t[p].v=a[l];
			return;
		}
		int m=(l+r)>>1;
		build(p*2,l,m);
		build(p*2+1,m+1,r);
		pushup(p);
	}
	void add(int p,int l,int r,int L,int R,int v){
		if(L<=l&&r<=R){
			puttag(p,r-l+1,v,1);
			return;
		}
		int m=(l+r)>>1;
		pushdown(p,l,r);
		if(L<=m)add(p*2,l,m,L,R,v);
		if(R>m)add(p*2+1,m+1,r,L,R,v);
		pushup(p);
	}
	void mul(int p,int l,int r,int L,int R,int v){
		if(L<=l&&r<=R){
			puttag(p,r-l+1,0,v);
			return;
		}
		int m=(l+r)>>1;
		pushdown(p,l,r);
		if(L<=m)mul(p*2,l,m,L,R,v);
		if(R>m)mul(p*2+1,m+1,r,L,R,v);
		pushup(p);
	}
	int query(int p,int l,int r,int L,int R){
		if(L<=l&&r<=R)return t[p].v;
		int m=(l+r)>>1,ans=0;
		pushdown(p,l,r);
		if(L<=m)ans=(ans+query(p*2,l,m,L,R));
		if(R>m)ans=(ans+query(p*2+1,m+1,r,L,R));
		return ans;
	}
};

ST 表(ST)

FHQ-Treap(FHQ)

李超线段树(LiSeg)

吉司机线段树(SegBeat)

树剖LCA(Cut)

最大流(Flow)

最大费用最大流(MCMF)

矩阵(Mat)

KMP(KMP)

AC 自动机(ACAM)

后缀数组(SA)

多项式(poly)

posted @ 2025-02-19 17:29  Linge_Zzzz  阅读(35)  评论(0)    收藏  举报  来源