poj 3468A Simple Problem with Integers(树状数组区间修改)
2014-07-28 16:47
127 查看
题目链接:http://poj.org/problem?id=3468
思路:s[i]表示原来1到i的和 s1[i]表示区间修改后1到i的和 区间修改为[l,r]区间上加a
sum[i]=c[i]*i+d[i]
则与上图表格对应的修改为
c在l处+a
c在r+1处-a
d在l处-a*(l-1)
d在r+1处+a*r
思路:s[i]表示原来1到i的和 s1[i]表示区间修改后1到i的和 区间修改为[l,r]区间上加a
i<l | s1[i]=s[i] |
l<=i<=r | s1[i]=s[i]+a*i-a*(l-1) |
r<i | s1[i]=s[i]+a*(r-l+1) |
则与上图表格对应的修改为
c在l处+a
c在r+1处-a
d在l处-a*(l-1)
d在r+1处+a*r
#include<cstdio> #include<cstring> using namespace std; const int num=100005; __int64 c[num],d[num]; int n,m; int lowbit(int a) { return a&(-a); } void add(__int64 *a,int p,int ad) { while(p<=n) { a[p]+=ad; p+=lowbit(p); } } __int64 sum(__int64 *a,int p) { __int64 s=0; while(p>0) { s+=a[p]; p-=lowbit(p); } return s; } int main() { int i,a,b,q; __int64 ans; char s[3]; //freopen("in.txt","r",stdin); scanf("%d%d",&n,&m); memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); for(i=1;i<=n;i++) { scanf("%d",&a); add(d,i,a); } while(m--) { scanf("%s",s); if(s[0]=='Q') { scanf("%d%d",&a,&b); ans=(b*sum(c,b)+sum(d,b))-((a-1)*sum(c,a-1)+sum(d,a-1)); //注意此处求[a,b]为sum[b]-sum[a-1] printf("%I64d\n",ans); } else { scanf("%d%d%d",&a,&b,&q); add(c,a,q); add(c,b+1,-q); add(d,a,-q*(a-1)); add(d,b+1,q*b); } } return 0; }
相关文章推荐
- 模板(线段树 + 树状数组 + 区间修改 + 区间查询)eg:POJ 3468 - A Simple Problem with Integers
- POJ2155【二维树状数组,区间修改,点查询?】【又被输入输出坑】
- POJ-2763 Housewife Wind (树链剖分 入门题 树状数组 单点修改 区间查询)
- POJ 3468 A Simple Problem with Integers 树状数组 区间修改 区间查询
- POJ 1195 Mobile phones(二维树状数组,点修改,区间查询)
- poj1195(二维树状数组,点修改,区间求和)
- POJ 1195 Mobile phones(二维树状数组,点修改,区间查询)
- POJ 3468 A Simple Problem with Integers 树状数组 区间修改 区间查询
- POJ 3468 A Simple Problem with Integers(树状数组区间修改+区间查询)
- [POJ 2368 A Simple Problem with Integers] 树状数组区间修改、区间查询
- POJ - 2155 Matrix (二维树状数组 + 区间修改 + 单点求值 或者 二维线段树 + 区间更新 + 单点求值)
- POJ 2155-Matrix(二维树状数组-区间修改 单点查询)
- HDU 4267 - A Simple Problem with Integers 树状数组区间修改
- 20140719 「树状数组 - 区间更新,区间求和」 POJ 3468 A Simple Problem with Integers
- HDU 1556(树状数组-区间修改,查询点)
- tyvj P1716 - 上帝造题的七分钟 二维树状数组区间查询及修改 二维线段树
- hdu4893 Wow! Such Sequence!,树状数组,线段树,单点修改,区间更新
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
- 【树状数组】点修改&区间查询
- hdu 1166 敌兵布阵 树状数组求区间和和修改点的值