题目:
题解:
这道题看着好眼熟啊
看上去很复杂,实际上就是树状数组的基本操作
单点修改区间查询:单点添加值,查找时两个区间相减就ok,但这个题是1为左区间,所以不用减
原因?答案实际上就是[1,r]的左端点数-[1,l-1]的右端点数
代码:
#include <cstdio>
using namespace std;
int n,m,c[100005],rr[100005];
void add(int loc,int v)
{
for (int i=loc;i<=n;i+=i&(-i))
c[i]+=v;
}
void addr(int loc,int v)
{
for (int i=loc;i<=n;i+=i&(-i))
rr[i]+=v;
}
int find(int loc)
{
int ans=0;
for (int i=loc;i>=1;i-=i&(-i))
ans+=c[i];
return ans;
}
int findr(int loc)
{
int ans=0;
for (int i=loc;i>=1;i-=i&(-i))
ans+=rr[i];
return ans;
}
int main()
{
int i;
scanf("%d%d",&n,&m);
for (i=1;i<=m;i++)
{
int q,l,r;
scanf("%d%d%d",&q,&l,&r);
if (q==1)
{
add(l,1);
addr(r,1);
}
else printf("%d\n",find(r)-findr(l-1));
}
}
本文介绍了一种使用树状数组解决单点修改区间查询问题的方法。通过具体的实例代码讲解了如何利用树状数组进行区间求和及更新操作,适用于ACM等编程竞赛。
329

被折叠的 条评论
为什么被折叠?



