您的位置:首页 > 其它

洛谷 P3368 树状数组【模板2】

2018-02-26 09:34 183 查看
这次是区间加值,但是不要慌,可以水过
用了一个差分数组的思想
之后你会发现,某个区间加值
比方说
原数组<0,1,3,6,10>

差分数组中的状态<1,2,3,4>
原数组每个值加二,差分数组中元素除第一位及末位+1位发生了变化,其他没有变化,所以只需要修改差分数组中的修改区间第一位及末位+1位即可





代码
//By Acer.mo
#include<iostream>
#include<cstdio>
using namespace std;
const int maxa=10000000;
int a[maxa+10]={0};//初始的存储数组
int l_b[maxa+10]={0};//树状数组
int n,i,j,m;
int lowbit(int x)//求x的lowbit值
{
return x&-x;
}
void add(int k,int num)//lowb丢值函数 /构建树形 /后期单点加值
{
for(;k<=n;k+=lowbit(k))//将lowb数组中所有包含第k位数的位置加上num
l_b[k]+=num;
// cf[k]+=num;
}
int query(int x)//求第x位数的derta
{
int sum=0;
for (;x;x-=lowbit(x))
{
sum+=l_b[x];
}
return sum;
}
int main()
{
scanf("%d %d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int s,b,c,d;
while (m--)
{
scanf("%d",&s);
if (s==1)
{
scanf("%d %d %d",&d,&b,&c);
add(d,c);//区间的始端加c
add(b+1,-c);//区间末端的下一位减c
}
else
{
scanf("%d",&d);
cout<<query(d)+a[d]<<endl; //变化量加起始量
}
}
return 0;
}//树状数组维护差分数组
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: