树状数组区间维护及单点查询
来源:互联网 发布:网络女主播不雅视频 编辑:程序博客网 时间:2024/06/05 00:41
树状数组区间维护
d[i]表示a[i]-a[i-1]的值
原理:http://wenku.baidu.com/link?url=WAxUY51ZHipbib4RyxMqhoujjcehIkWSTBxFF1Z8sjCToih7npdGhCg_HW2oKLqH3vRsQEO_QAUVYi7l6WPGFYV4WAMaWxeSPfFg4tIDXfe
#include<cstdio>
#define M 400500
using namespace std;
long long n,a[M],d[M],c1[M],c2[M],m,k,x,y,l,r;
long long lowbit(long long i){
return i&(-i);
}
void update(long long l,long long x){
long long k=l;
while(k<=n){
c1[k]+=x;
c2[k]+=x*l;
k+=lowbit(k);
}
return ;
}
long long sum(long long i){
long long s=0,s1=0,s2=0,p=i;
while(p>0){
s1+=c1[p];
s2+=c2[p];
p-=lowbit(p);
}
s=s1*(i+1)-s2;
return s;
}
int main(){
scanf("%I64d",&n);
for(int i=1;i<=n;i++){
scanf("%I64d",&a[i]);
d[i]=a[i]-a[i-1];
for(int j=i-lowbit(i)+1;j<=i;j++){
c1[i]+=d[j];
c2[i]+=d[j]*j;
}
}
scanf("%I64d",&m);
for(int i=1;i<=m;i++){
scanf("%I64d",&k);
if (k==1){
scanf("%I64d%I64d%I64d",&l,&r,&x);
d[l]+=x,d[r+1]-=x;
update(l,x);
update(r+1,-x);
}
else{
scanf("%I64d%I64d",&l,&r);
printf("%I64d\n",sum(r)-sum(l-1));//查询点i即输出sum(i)-sum(i-1)即可
}
}
return 0;
}
- 树状数组区间维护及单点查询
- poj2155树状数组 区间更新 单点查询
- 树状数组的区间修改,单点查询
- 【codevs1080】【树状数组】 单点修改 区间查询
- 【codevs1081】【树状数组】区间修改 单点查询
- 树状数组 区间修改,单点查询;
- 树状数组的单点更新,区间查询。
- [模板]树状数组(区间修改单点查询)
- 树状数组单点修改区间查询
- 树状数组(单点修改区间查询、区间修改单点查询、区间修改区间查询)
- 树状数组-单点修改区间查询-区间修改单点查询-区间修改区间查询
- 树状数组区间更新+区间查询+单点查询
- 【树状数组】【单点修改区间求和】【区间修改单点查询】【单点修改区间最大值查询】
- hdu1166 树状数组模板:单点更新,区间求和(区间查询)
- codeforces 777E. Hanoi Factory (LIS+dp+树状数组/线段树维护区间最大值及单点更新)
- Flowers(树状数组+区间更新+单点查询+区间更新单点查询模板)
- 树状数组:HDU1166敌兵布阵 【单点更新,区间查询】
- 树状数组:HDU1556 Color the ball 【区间更新,单点查询]
- hdu1503 Advanced Fruits
- 点的旋转
- After Windows 10 upgrading deleting previous windows installation
- I/O多路复用详解(三)
- 动态创建标签
- 树状数组区间维护及单点查询
- hdu-1513-Palindrome
- Object-C类目、延展
- UNITY3D学习笔记14
- 智能指针的原理与设计
- python基础教程学习笔记 — 准备Windows下开发环境
- Tomcat关闭过程(Tomcat源码解析四)
- Android侧滑--防QQ实现侧滑
- hdu4815 (概率DP)