POJ 3468_A Simple Problem with Integers(树状数组)
完全不知道该怎么用,看书稍微懂了点。
题意:
给定序列及操作,求区间和。
分析:
树状数组可以高效的求出连续一段元素之和或更新单个元素的值。但是无法高效的给某一个区间的所有元素同时加个值。
不能直接用树状数组求,就处理一下。用两个树状数组维护两个数据,一个维护前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(树状数组)的更多相关文章
- A Simple Problem with Integers(树状数组HDU4267)
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- HDU 4267 A Simple Problem with Integers --树状数组
题意:给一个序列,操作1:给区间[a,b]中(i-a)%k==0的位置 i 的值都加上val 操作2:查询 i 位置的值 解法:树状数组记录更新值. 由 (i-a)%k == 0 得知 i%k == ...
- POJ3468 A Simple Problem With Integers 树状数组 区间更新区间询问
今天学了很多关于树状数组的技巧.一个是利用树状数组可以简单的实现段更新,点询问(二维的段更新点询问也可以),每次修改只需要修改2个角或者4个角就可以了,另外一个技巧就是这题,原本用线段树做,现在可以用 ...
- POJ3468 A Simple Problem with Interger [树状数组,差分]
题目传送门 A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 1 ...
- A Simple Problem with Integers_树状数组
Problem Description Let A1, A2, ... , AN be N elements. You need to deal with two kinds of operation ...
- POJ 3468_A Simple Problem with Integers(线段树)
题意: 给定序列及操作,求区间和. 分析: 线段树,每个节点维护两个数据: 该区间每个元素所加的值 该区间元素和 可以分为"路过"该区间和"完全覆盖"该区间考虑 ...
- Poj 3468-A Simple Problem with Integers 线段树,树状数组
题目:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS Memory Limit ...
- POJ A Simple Problem with Integers 线段树 lazy-target 区间跟新
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 105742 ...
- POJ 3468A Simple Problem with Integers(线段树区间更新)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 112228 ...
随机推荐
- 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 ...
- jdk线程池,使用手记
Executors----------------------------------------------Executors------------------------------------ ...
- php接收json格式数据(text/xml)
在API服务中,目前流行采用json形式来交互. 给前端调用的接口输出Json数据,这个比较简单,只需要组织好数据,用json_encode($array) 转化一下,前端就得到json格式的数据. ...
- 使用Jenkins进行android项目的自动构建(4)
加入单元测试 android单元测试很多都是使用Instrumentation进行的,这里讲的是试用JUnit,为什么用JUnit呢?因为使用Instrumentation需要打包apk安装,然后再进 ...
- vb,wps,excel 分裂
Sub 分列() '以空格为分隔符,连续空格只算1个.对所选中的单元格进行处理 Dim m As Range, tmpStr As String, s As String Dim x As Integ ...
- CREATE FUNCTION - 定义一个新函数
SYNOPSIS CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] ) RETURNS rettype { LANGUAGE lang ...
- WPF小记 -- 使用Path自己画图标,点击命中(焦点)丢失问题
在Template中,Path外面的Grid需添加Background属性值.否则点击范围会受限制,例如:Click,在RadioButton的Height和With范围内点击,命中率<1. & ...
- android studio 调试安装
最新的手机无法debug安装调试. vivo x21 oppo r11等 解决办法: 1,关闭instant run Android Studio->Preferences->Build ...
- spark版本不支持(降版本打包)
在做项目的时候代码已经更新为hadoop 2.7 spark 2.1 scala 2.11.8版本,但是服务器版本使用的是hadoop2.6 spark1.6 以及scala2.10.6版本,,主程 ...
- vue课程安排
状态管理与vuex,即兄弟组件通信(选讲,了解即可)