数据结构模板

线段树(区间求和):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int num[233333];
struct qer
{
	int l, r;
	ll sum, add;
}tree[233333*4];
void spread(int p)
{
	if (tree[p].add)
	{
		tree[p*2].sum += (ll)(tree[p*2].r - tree[p*2].l + 1)*tree[p].add;
		tree[p*2+1].sum += (ll)(tree[p*2+1].r - tree[p*2+1].l + 1)*tree[p].add;
		tree[p*2].add += tree[p].add;
		tree[p*2+1].add += tree[p].add;
		tree[p].add = 0;
	}
}
void build(int p, int l, int r)
{
	tree[p].l = l;
	tree[p].r = r;
	if (l == r)
	{
		tree[p].sum = num[l];
		return ;
	}
	spread(p);
	int mid = (l+r)/2;
	build(p*2, l, mid);
	build(p*2+1, mid+1, r);
	tree[p].sum = tree[p*2].sum + tree[p*2+1].sum;
}
void change(int p, int l, int r, ll x)
{
	if (l <= tree[p].l && tree[p].r <= r)
	{
		tree[p].sum += (ll)(tree[p].r - tree[p].l + 1)*x;
		tree[p].add += x;
		return ;
	}
	spread(p);
	int mid = (tree[p].l + tree[p].r)/2;
	if(l <= mid) change(p*2, l, r, x);
	if(r > mid)  change(p*2+1, l, r, x);
	tree[p].sum = tree[p*2].sum + tree[p*2+1].sum;
}
ll ask(int p, int l, int r)
{
	if (l <= tree[p].l && tree[p].r <= r)
	{
		return tree[p].sum;
	}
	spread(p);
	ll ans = 0;
	int mid = (tree[p].l + tree[p].r)/2;
	if(l <= mid) ans += ask(p*2, l, r);
	if(r > mid)  ans += ask(p*2+1, l, r);
	return ans;
}
int main()
{
	int n;
	cin>>n;
	for (int i = 1; i <= n; i++)
		scanf("%d", &num[i]);
	build(1, 1, n);
	int m;
	cin>>m;
	for (int i = 1; i <= m; i++)
	{
		int x;
		scanf("%d", &x);
		if(x == 1)
		{
			int a, c;
			ll b;
			scanf("%d%d%lld", &a, &c, &b);
			change(1, a, c, b);
		}
		else
		{
			int a, b;
			scanf("%d%d", &a, &b);
			printf("%lld\n", ask(1, a, b));
		}
	}
	return 0;
}

树状数组:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lowbit(x) (x&(-x))
using namespace std;
const int MAXN=100000+10;
int tree[MAXN],c[MAXN],a[MAXN];
int n;
void add(int x,int y)
{
    while(x<=n)
    {
        tree[x]+=y;
        x+=lowbit(x);
    }
}
int sum(int x)
{
    int ans=0;
    while(x)
    {
        ans+=tree[x];
        x-=lowbit(x);
    }
    return ans;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        c[i]=a[i]-a[i-1];
        add(i,c[i]);
    }
    int q;scanf("%d",&q);
    while(q--)
    {
        int t,l,r,s;
        scanf("%d",&t);
        if(t==1)
        {
            scanf("%d%d%d",&l,&r,&s);
            add(l,s);
            add(r+1,-s);
        }
        if(t==2)
        {
            int pos;
            scanf("%d",&pos);
            printf("%d\n",sum(pos));
        }
    }
    return 0;
}

 

上一篇
下一篇