树状数组

一维树状数组

1. 单点修改,区间查询

#include<bits/stdc++.h> 
using namespace std;
long long n,q;
long long a[1000100],c[1000100];
long long lowbit(long long x)
{
	return x&-x;
}
void add(long long x,long long y)
{
	for(long long i=x;i<=1000100;i+=lowbit(i))
	{
		c[i]+=y;
	} 
}
long long find(long long l,long long r)
{
	long long resl=0;
	for(long long i=l;i>0;i-=lowbit(i)) 
	{
		resl+=c[i];
	}
	long long resr=0;
	for(long long i=r;i>0;i-=lowbit(i)) 
	{
		resr+=c[i];
	}
	return resr-resl;
}
int main()
{
	cin>>n>>q;
	for(long long i=1;i<=n;i++)
	{
		cin>>a[i];
		add(i,a[i]);
	}
	for(long long i=1;i<=q;i++)
	{
		long long d,x,y;
		cin>>d>>x>>y;
		if(d==1)
		{
			add(x,y);
			a[i]+=y;
		}
		else
		{
			cout<<find(x-1,y)<<endl;
		}
	}
	return 0;
}

2. 区间修改,单点查询

#include<bits/stdc++.h>
using namespace std;
int a[100010];
int lowbit(int x) 
{
	return x&-x;
}
void add(int x,int y)
{
	for(int i=x;i<=100010;i+=lowbit(i))
	{
		a[i]+=y;
	}
}
int find(int x)
{
    int res=0;
    for(int i=x;i>0;i-=lowbit(i))
    {
    	res+=a[i];
	}
	return res;
}
int main()
{
	int n;
	cin>>n;
	while(n!=0) 
	{
		memset(a,0,sizeof(a)); 
		for(int i=1;i<=n;i++)
		{
			int a,b;
			cin>>a>>b;
			add(a,1);
			add(b+1,-1); 
		}
		for(int i=1;i<=n;i++)
		{
			cout<<find(i)<<" ";
		}
		cout<<endl; 
		cin>>n; 
	}
	return 0;
 } 

3. 区间修改,区间查询

#include<bits/stdc++.h>
using namespace std;
long long n,q,a[1000010],c_eins[1000010],c_zwei[1000010];
char c;
long long lowbit(long long x)
{
    return x&-x;
}
void add(long long b[],long long x,long long y)
{
	for(long long i=x;i<=n;i+=lowbit(i))
	{
		b[i]+=y;
	}
	return ;
}
long long find(long long b[],long long x){
	long long res= 0;
	for(long long i=x;i>0;i-=lowbit(i))
    {
		res+=b[i];
	}
	return res;
}
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		add(c_eins,i,a[i]-a[i-1]);
		add(c_zwei,i,(i-1)*(a[i]-a[i - 1]));
	}
	for(int i=1;i<=q;i++){
		cin>>c;
		long long x,y,w;1. 
		long long ansa,ansb;
		if(c=='1'){
			cin>>x>>y>>w;
			add(c_eins,x,w);
			add(c_zwei,x,w*(x-1));
			add(c_eins,y+1,-w);
			add(c_zwei,y+1,-w*y);
		}

		else{
			cin>>x>>y;
			ansa=(x-1)*find(c_eins,x-1)-find(c_zwei,x-1);
			ansb=y*find(c_eins,y)-find(c_zwei,y);
			cout<<ansb-ansa<<endl;
		}
	}
	return 0;
}

二维树状数组

1. 单点修改,区间查询

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long a[5050][5050];
long long lowbit(long long x)
{
	return x&-x;
}
void add(long long x,long long y,long long k)
{
	for(long long i=x;i<=n;i+=lowbit(i))
	{
		for(long long j=y;j<=m;j+=lowbit(j))
		{
			a[i][j]+=k;
		}
	}
}
long long find(long long x,long long y)
{
	long long res=0;
	for(long long i=x;i>0;i-=lowbit(i))
	{
		for(long long j=y;j>0;j-=lowbit(j))
		{
			res+=a[i][j];
		}
	}
	return res;
}
int main()
{
	cin>>n>>m;
	long long c;
	while(cin>>c)
	{
		if(c==1)
		{
			long long x,y,k;
			cin>>x>>y>>k;
			add(x,y,k);
		}
	    else
	    {
	    	long long p,q,i,j;
	    	cin>>p>>q>>i>>j;
	    	cout<<find(i,j)-find(p-1,j)-find(i,q-1)+find(p-1,q-1)<<endl;
	    }	
	}
	return 0;
}

2. 区间修改,单点查询

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long a[5050][5050]; 
long long lowbit(long long x)
{
	return x&-x;
}
void add(long long x,long long y,long long k)
{
	for(long long i=x;i<=n;i+=lowbit(i))
	{
		for(long long j=y;j<=m;j+=lowbit(j))
	    {
	    	a[i][j]+=k;
		}
	}
}
long long find(long long x,long long y)
{
	long long res=0;
	for(long long i=x;i>0;i-=lowbit(i))
	{
		for(long long j=y;j>0;j-=lowbit(j))
		{
			res+=a[i][j];
		}
	}
	return res;
}
int main()
{
	cin>>n>>m;
	long long c;
	while(cin>>c)
	{
		if(c==1)
		{
			long long x,y,p,q,k;
			cin>>x>>y>>p>>q>>k;
			add(x,y,k);
			add(x,q+1,-k);
			add(p+1,y,-k);
			add(p+1,q+1,k);
		}
		else
		{
			long long x,y;
			cin>>x>>y;
			cout<<find(x,y)<<endl;
		}
	}
	return 0;
}

3. 区间修改,区间查询

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a1[2500][2500],a2[2500][2500],a3[2500][2500],a4[2500][2500];
int lowbit(int x)
{
	return x&-x;
}
int find(int x,int y) 
{
	int res1=0,res2=0,res3=0,res4=0;
	for(int i=x;i>0;i-=lowbit(i))
	{
		for(int j=y;j>0;j-=lowbit(j))
		{
			res1+=a1[i][j];
			res2+=a2[i][j];
			res3+=a3[i][j];
			res4+=a4[i][j];
		}
	} 
	return res1*x*y-res2*y-res3*x+res4;
}
void add(int x,int y,int k)
{
	for(int i=x;i<=n;i+=lowbit(i))
	{
		for(int j=y;j<=m;j+=lowbit(j))
		{
			a1[i][j]+=k;
			a2[i][j]+=k*(x-1);
			a3[i][j]+=k*(y-1);
			a4[i][j]+=k*(x-1)*(y-1);
		}
	}
}
int main()
{
	char c;
	cin>>c>>n>>m;
	while(cin>>c)
	{
		if(c=='L')
		{
			int a,b,c,d,k;
			cin>>a>>b>>c>>d>>k;
			add(a,b,k);
			add(a,d+1,-k);
			add(c+1,b,-k);
			add(c+1,d+1,k);
		}
		else
		{
			int a,b,c,d;
			cin>>a>>b>>c>>d;
			cout<<find(c,d)-find(a-1,d)-find(c,b-1)+find(a-1,b-1)<<endl;
		}
	}
	return 0;
}
posted @ 2025-05-25 00:33  BIxuan—玉寻  阅读(31)  评论(0)    收藏  举报