完全不知道该怎么用,看书稍微懂了点。

题意:

给定序列及操作,求区间和。

分析:

树状数组可以高效的求出连续一段元素之和或更新单个元素的值。但是无法高效的给某一个区间的所有元素同时加个值。

不能直接用树状数组求,就处理一下。用两个树状数组维护两个数据,一个维护前i项和,一个维护增加的值。设:

∑j=1iaj=sum(bit1,i)∗i+sum(bit0,i)

那么[l,r]区间上同时加上x就可以表示为:

  • 对于bit0来说,在l位置上加上−x∗(l−1),在r+1位置上加上x∗r
  • 对于bit1来说,在l位置上加上x,在r+1位置上加上−x

代码:

#include<cstdio>
const int maxn = 300005;
typedef long long ll;
//[l,r]
ll bit[2][maxn];
int v[maxn];
int n, q;
ll sum(int i, int t)
{
ll tot = 0;
while(i>0){
tot += bit[t][i];
i -= i&-i;
}
return tot;
}
void update(int i, int x, int t)
{
while(i <= n){
bit[t][i] += x;
i += i&-i;
}
}
int main (void)
{
scanf("%d%d",&n,&q);
int a, b, c;
for(int i = 1; i <= n; i++){
scanf("%d",&v[i]);
update(i, v[i], 0);
}
for(int i = 0; i < q; i++){
getchar();
if(getchar()=='C'){
scanf("%d%d%d", &a, &b, &c);
update(a, - c * (a - 1), 0);
update(b + 1, c * b, 0);//bit0
update(a, c, 1);
update(b + 1, - c,1); //bit1
}else{
scanf("%d%d",&a, &b);
ll res = 0;
res += sum(b, 0) + sum(b ,1) * b;
res -=sum(a-1, 0) +sum(a-1, 1) * (a-1);
printf("%I64d\n",res);
}
}
}

如果操作得到的结果可以用i的n次多项式表示,那么就可以用n+1个树状数组维护了。

1700ms比线段树快了700ms~

POJ 3468_A Simple Problem with Integers(树状数组)的更多相关文章

  1. A Simple Problem with Integers(树状数组HDU4267)

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (J ...

  2. HDU 4267 A Simple Problem with Integers --树状数组

    题意:给一个序列,操作1:给区间[a,b]中(i-a)%k==0的位置 i 的值都加上val  操作2:查询 i 位置的值 解法:树状数组记录更新值. 由 (i-a)%k == 0 得知 i%k == ...

  3. POJ3468 A Simple Problem With Integers 树状数组 区间更新区间询问

    今天学了很多关于树状数组的技巧.一个是利用树状数组可以简单的实现段更新,点询问(二维的段更新点询问也可以),每次修改只需要修改2个角或者4个角就可以了,另外一个技巧就是这题,原本用线段树做,现在可以用 ...

  4. POJ3468 A Simple Problem with Interger [树状数组,差分]

    题目传送门 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 1 ...

  5. A Simple Problem with Integers_树状数组

    Problem Description Let A1, A2, ... , AN be N elements. You need to deal with two kinds of operation ...

  6. POJ 3468_A Simple Problem with Integers(线段树)

    题意: 给定序列及操作,求区间和. 分析: 线段树,每个节点维护两个数据: 该区间每个元素所加的值 该区间元素和 可以分为"路过"该区间和"完全覆盖"该区间考虑 ...

  7. Poj 3468-A Simple Problem with Integers 线段树,树状数组

    题目:http://poj.org/problem?id=3468   A Simple Problem with Integers Time Limit: 5000MS   Memory Limit ...

  8. POJ A Simple Problem with Integers 线段树 lazy-target 区间跟新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 105742 ...

  9. POJ 3468A Simple Problem with Integers(线段树区间更新)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 112228 ...

随机推荐

  1. LN : leetcode 312 Burst Balloons

    lc 312 Burst Balloons 312 Burst Balloons Given n balloons, indexed from 0 to n-1. Each balloon is pa ...

  2. jdk线程池,使用手记

    Executors----------------------------------------------Executors------------------------------------ ...

  3. php接收json格式数据(text/xml)

    在API服务中,目前流行采用json形式来交互. 给前端调用的接口输出Json数据,这个比较简单,只需要组织好数据,用json_encode($array) 转化一下,前端就得到json格式的数据. ...

  4. 使用Jenkins进行android项目的自动构建(4)

    加入单元测试 android单元测试很多都是使用Instrumentation进行的,这里讲的是试用JUnit,为什么用JUnit呢?因为使用Instrumentation需要打包apk安装,然后再进 ...

  5. vb,wps,excel 分裂

    Sub 分列() '以空格为分隔符,连续空格只算1个.对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integ ...

  6. CREATE FUNCTION - 定义一个新函数

    SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...

  7. WPF小记 -- 使用Path自己画图标,点击命中(焦点)丢失问题

    在Template中,Path外面的Grid需添加Background属性值.否则点击范围会受限制,例如:Click,在RadioButton的Height和With范围内点击,命中率<1. & ...

  8. android studio 调试安装

    最新的手机无法debug安装调试. vivo x21  oppo r11等 解决办法: 1,关闭instant run Android Studio->Preferences->Build ...

  9. spark版本不支持(降版本打包)

    在做项目的时候代码已经更新为hadoop 2.7  spark 2.1 scala 2.11.8版本,但是服务器版本使用的是hadoop2.6 spark1.6 以及scala2.10.6版本,,主程 ...

  10. vue课程安排

    状态管理与vuex,即兄弟组件通信(选讲,了解即可)