结构体模板(持续更新)

树状数组:

点击查看代码
//1
struct Tree {
	vector<int> tr;  //vector 方便每根据需要的大小开
    Tree(int n) : n(n), tr(n + 1) {}
  //  Tree(int n) : tr(n + 1){  //初始化 
  //      iota(tr.begin(), tr.end(), 0); 
  //  }
	inline int lowbit(int x) {
	return x & -x;
	}
	inline void add(int x, int v) {
	for (; x <= n; x += lowbit(x))
	tr[x] += v;
	}
	inline int ask(int x) {
	int res = 0;
	for (; x; x -= lowbit(x))
	res += tr[x];
	return res;
	}
	void clear() {
		tr.clear();
	}
}t1(n),t2(n);;


//2
  struct Fenwick {
	int tr[N];
	inline int lowbit(int x) {
	return x & -x;
	}
	inline void add(int x, int v) {
	for (; x <= n; x += lowbit(x))
	tr[x] += v;
	}
	inline int ask(int x) {
	int res = 0;
	for (; x; x -= lowbit(x))
	res += tr[x];
	return res;
	}
	void clear() {
	memset(tr, 0, sizeof tr);
	}
}t1,t2;

并查集:

点击查看代码
#include<bits/stdc++.h>
using namespace std;
using LL = long long;
// DSU with Size 
struct DSU{ //并查集板子 
    vector<int> p, sz; //p 表示集合  , se表示集合个数
    DSU(int n) : p(n + 1), sz(n + 1, 1){  //初始化 
        iota(p.begin(), p.end(), 0); 
    }

    int find(int x){ //寻找根节点
        return p[x] == x ? x : p[x] = find(p[x]);
    }

    bool same(int x, int y) {  //判断是否相同,根节点 
        return find(x) == find(y); 
    }

    bool merge(int x, int y){ //合并集合 
        x = find(x), y = find(y);
        if (x == y) return false;
        if (sz[x] < sz[y]) swap(x, y);
        sz[x] += sz[y];
        p[y] = x;
        return true;
    }
    
    int size(int x) {  //输出集合点数
        return sz[find(x)];
    }
};
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n,m;
	cin>>n>>m;
	DSU dsu(n);
	char c;
	int x,y;
	while(m--)
	{
		cin>>c>>x>>y;
		if(c=='Q')
		{
			if(dsu.same(x,y)) cout<<"Yes\n";
			else cout<<"No\n";
		}
		else
		{
			dsu.merge(x,y);
		}
	}
	return 0;
}

线段树 :

点击查看代码
ll f[N*4];
ll n,m,p;
struct tt
{
	ll sum;
	ll add;
    ll val;
}e[N*4];
void buildtree(int k,int l,int r)
{
	e[k].val=1;
	e[k].add=0;
	if(l==r)
	{
		e[k].sum=f[l];
		return;
	}
	int mid=(l+r)>>1;
	buildtree(lz);
	buildtree(rz);
	e[k].sum=e[k<<1].sum+e[k<<1|1].sum;
	return ;
}
void pushdown(int k,int o)//o表示 区间len 
{
	int kl=k<<1,kr=k<<1|1;
	e[kl].sum=(e[kl].sum*e[k].val+e[k].add*(o-(o>>1)))%p;
	e[kr].sum=(e[kr].sum*e[k].val+e[k].add*(o>>1))%p;
	e[kl].val=(e[kl].val*e[k].val)%p;
	e[kr].val=(e[kr].val*e[k].val)%p;
	
	e[kl].add=(e[kl].add*e[k].val+e[k].add)%p;
	e[kr].add=(e[kr].add*e[k].val+e[k].add)%p;
	e[k].val=1;
	e[k].add=0;
	return;
}
void add(int k,int l,int r,int x,int y,int w)//x~y add w 
{
	if(x<=l&&y>=r)
	{
		e[k].add=(e[k].add+w)%p;
		e[k].sum=(e[k].sum+(r-l+1)*w)%p;
		return ;
	}
	pushdown(k,r-l+1);
	int mid=(l+r)>>1;
	if(x<=mid)
		add(lz,x,y,w);
	if(y>mid)
		add(rz,x,y,w);
	e[k].sum=(e[k<<1].sum+e[k<<1|1].sum)%p;
	return;
}
void mul(int k,int l,int r,int x,int y,int w)
{
	if(x<=l&&y>=r)
	{
		e[k].val=(e[k].val*w)%p;
		e[k].add=(e[k].add*w)%p;
		e[k].sum=(e[k].sum*w)%p;
		return ;
	}
	pushdown(k,r-l+1);
	int mid=(l+r)>>1;
	if(x<=mid)
		mul(lz,x,y,w);
	if(y>mid)
		mul(rz,x,y,w);
	e[k].sum=(e[k<<1].sum+e[k<<1|1].sum)%p;
	return ;
}

ll query(int k,int l,int r,int x,int y)
{
	if(x<=l&&y>=r)
	{
		return e[k].sum%p;
	}
	int mid=(l+r)>>1;
	pushdown(k,r-l+1);
	ll temp=0;
	if(x<=mid)
	temp=(temp+query(lz,x,y));
	if(y>mid)
	temp=(temp+query(rz,x,y));
	e[k].sum=(e[k<<1].sum+e[k<<1|1].sum)%p;
	return temp%p;
}
posted @ 2023-08-09 16:52  xxj112  阅读(51)  评论(0)    收藏  举报