题目链接
树状数组区间修改单点查询
#include<cstdio>
#include<cstring>
const int N=1e5+10;
int d[N],sum[N];
int n;
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int val)
{
while(x<=n){
sum[x]+=val;
x+=lowbit(x);
}
}
int query(int x)
{
int ret=0;
while(x)
{
ret+=sum[x];
x-=lowbit(x);
}
return ret;
}
void range_add(int l,int r,int val)
{
add(l,val);add(r+1,-val);
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)&&n)
{
memset(sum,0,sizeof(sum));
memset(d,0,sizeof(d));
int i,a,b;
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
range_add(a,b,1);
}
for(i=1;i<=n;i++)
printf("%d%c",query(i),i==n?'\n':' ');
}
return 0;
}
线段树区间修改单点查询
#include<cstdio>
#define lc (o<<1)
#define rc (o<<1|1)
#define mid (l+r>>1)
const int N=1e5+5;
int sum[N<<2],lazy[N<<2];
bool flag;
inline void push_up(int o)
{
sum[o]=sum[lc]+sum[rc];
return;
}
inline void push_down(int o,int l,int r)
{
if(!lazy[o])return;
sum[lc]+=lazy[o]*(mid-l+1);
lazy[lc]+=lazy[o];
sum[rc]+=lazy[o]*(r-mid);
lazy[rc]+=lazy[o];
lazy[o]=0;
}
void build(int o,int l,int r)
{
lazy[o]=0;
if(l==r)
{
sum[o]=0;
return;
}
build(lc,l,mid);build(rc,mid+1,r);
push_up(o);
}
void update(int o,int l,int r,int nl,int nr,int v)
{
if(l==nl&&r==nr)
{
sum[o]+=(r-l+1)*v;
lazy[o]+=v;
return;
}
push_down(o,l,r);
if(nr<=mid)update(lc,l,mid,nl,nr,v);
else if(nl>mid)update(rc,mid+1,r,nl,nr,v);
else update(lc,l,mid,nl,mid,v),update(rc,mid+1,r,mid+1,nr,v);
push_up(o);
}
int query(int o,int l,int r,int nl,int nr)
{
if(l==nl&&r==nr)return sum[o];
push_down(o,l,r);
if(nr<=mid)return query(lc,l,mid,nl,nr);
else if(nl>mid)return query(rc,mid+1,r,nl,nr);
else return query(lc,l,mid,nl,mid)+query(rc,mid+1,r,mid+1,nr);
}
int main()
{
//freopen("in.txt","r",stdin);
int n,a,b,i;
while(scanf("%d",&n)&&n)
{
flag=0;
build(1,1,n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
update(1,1,n,a,b,1);
}
for(i=1;i<=n;i++)
{
if(flag)printf(" ");
flag=1;
printf("%d",query(1,1,n,i,i));
}
printf("\n");
}
return 0;
}