树状数组
单点修改,区间查询
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(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;
}