线段树,树状数组

树状数组

单点修改,区间查询

void add(int x,int k)
{
while(x<=n)
{
t[x]+=k;
x+=x&(-x);
}
}
int ask(int x)
{
   int sum=0while(x>0)
   {
     sum+=t[x];
     x-=x&(-x);
   }
   return sum;
}
// add(x,k);
// ask(r)-ask(l-1);

区间修改,单点查询

void add(int x,int k)
{
  while(x<=n)
  {
  t[x]+=k;
  x+=x&(-x);
  }
}
int ask(int x)
{
int sum=0;
while(x>0)
{
sum+=t[x];
x-=x&(-x);
}
return sum;
}
// add(l,d);    add(r+1,-d);
//  a[x]+ask(x);

区间修改,区间查询

void add1(int x,int k)
{
  while(x<=n)
  {
    t1[x]+=k;
    x+=x&(-x);
  }
}
int ask1(int x)
{
int sum=0;
while(x>0)
{
   sum+=t1[x];
   x-=x&(-x);
}
return sum;
}
void add2(int x,int k)
{
  while(x<=n)
  {
    t2[x]+=k;
    x+=x&(-x);
  }
}
int ask2(int x)
{
int sum=0;
while(x>0)
{
   sum+=t2[x];
   x-=x&(-x);
}
return sum;
}
//add1(l,d); add1(r+1,-d); add2(l,l*d); add2(r+1,(r+1)*(-d));
//(sum[r]+(r+1)*aks1(r)-ask2(r))-(sum[l-1]+l*ask1(l-1)-ask2(l-1));

线段树
建树

void build(int o,int l,int r)
{
	tree[o].l=l;
	tree[o].r=r;
	tree[o].f=0;
	if(l==r)//
	{
		tree[o].z=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(2*o,l,mid);
	build(2*o+1,mid+1,r);
	tree[o].z=tree[2*o].z+tree[2*o+1].z; 
} 

懒惰标记

void lazy(int o)
{
	if(tree[o].f)
	{
		tree[2*o].f+=tree[o].f;
		tree[2*o+1].f+=tree[o].f;
		tree[2*o].z+=tree[o].f*(tree[2*o].r-tree[2*o].l+1);
		tree[2*o+1].z+=tree[o].f*(tree[2*o+1].r-tree[2*o+1].l+1);
		tree[o].f=0;
	}
}

单点修改,单点查询,区间修改,区间查询

//单点修改
void add(int o,int x,int k)
{
	if(tree[o].l==tree[o].r)
	{
		tree[o].z+=k;
			return;
	}
        lazy(o);
	int mid=(tree[o].l+tree[o].r)/2;
	if(x<=mid)
	add(2*o,x,k);
	else
	add(2*o+1,x,k);
	tree[o].z=tree[2*o].z+tree[2*o+1].z;
}
//单点查询
int queryd(int o,int x)
{
	if(tree[o].l==tree[o].r)
	{
		return tree[o].z; 
	} 
	lazy(o);
	int mid=(tree[o].l+tree[o].r)/2;
	if(mid>=x)
	 return queryd(2*o,x);
	 else
	 return  queryd(2*o+1,x);
}
//区间查询
int query(int o,int l,int r)
{
	if(tree[o].l>=l&&tree[o].r<=r)
	 return tree[o].z;
	 lazy(o);
	 int sum=0;
	 int mid=(tree[o].l+tree[o].r)/2;
	 if(mid>=r)
	 return query(2*o,l,r);
	 if(mid<l)
	 return query(2*o+1,l,r);
	 return query(2*o,l,mid)+query(2*o+1,mid+1,r); 
}
//区间修改
void addx(int o,int l,int r,int z)
{
	if(tree[o].l>=l&&tree[o].r<=r)
	{
		tree[o].z+=(tree[o].r-tree[o].l+1)*z;
		tree[o].f=z;
		return;
	}
	lazy(o);
	int mid=(tree[o].l+tree[o].r)/2;
	if(mid>=r)
	addx(2*o,l,r,z);
	if(mid<=l)
	addx(2*o+1,l,r,z);
	tree[o].z=tree[2*o].z+tree[2*o+1].z;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值