树状数组
一维树状数组
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;
}
以下是签名
${\scr {jade }}$ ${\scr {seek }}$
本文来自博客园,作者:BIxuan—玉寻,转载请注明原文链接:https://www.cnblogs.com/zhangyuxun100219/p/18894904

浙公网安备 33010602011771号