3155: Preprefix sum
Time Limit: 1 Sec Memory Limit: 512 MB
Submit: 1183 Solved: 546
[Submit][Status][Discuss]
Description
Input
Output
对于每个询问操作,输出一行,表示所询问的SSi的值。
Sample Input
1 2 3 4 5
Query 5
Modify 3 2
Query 5
Sample Output
32
HINT
1<=N,M<=100000,且在任意时刻0<=Ai<=100000
Source
学过线段树都知道树状数组不能处理区间修改,无逆元的区间加法
但是树状数组其实用差分可以做区间修改单点查询
当然这道题和更强的区间修改求和关系不大,但形式确实很像
对于原数列a1,a2,a3,a4...
S为 1*a1, 1*a1+1*a2, 1*a1+1*a2+1*a3...
SS为1*a1, 2*a1+1*a2, 3*a1+2*a2+1*a3...
观察系数,发现从大到小变化,但序号却由小到大
比较一下,可以尝试把S乘一个i,消掉系数最大的
得到 1*a1, 2*a1+2*a2, 3*a1+3*a2+3*a3...
这样与SS作差,就可以又得到一个系数与序号正比的式子
0*a1, 0*a1+1*a2, 0*a1+1*a2+2*a3...
再观察,这就是个前缀和而已
所以维护一遍原前缀和,再维护(i-1)*a[i]的前缀和即可
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LL long long
int n,m;
LL a[],bit1[],bit2[];
int lb(int x){
return x&(-x);
}
LL q1(int x){
LL ans=;
while(x){
ans+=bit1[x];
x-=lb(x);
}
return ans;
}
LL q2(int x){
LL ans=;
while(x){
ans+=bit2[x];
x-=lb(x);
}
return ans;
}
int c1(int x,LL num){
while(x<=n){
bit1[x]+=num;
x+=lb(x);
}
return ;
}
int c2(int x,LL num){
while(x<=n){
bit2[x]+=num;
x+=lb(x);
}
return ;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++){
scanf("%lld",&a[i]);
c1(i,a[i]);
c2(i,(i-)*a[i]);
}
for(int i=;i<=m;i++){
char in[];
scanf("%s",in);
if(in[]=='Q'){
int x;
scanf("%d",&x);
printf("%lld\n",x*q1(x)-q2(x));
}else{
int x;
LL y;
scanf("%d %lld",&x,&y);
LL tmp=y-a[x];
a[x]+=tmp;
c1(x,tmp);
c2(x,(x-)*tmp);
}
}
return ;
}
//p.s. 其实这道题提供了树状数组处理区间修改区间求和的一个方法
对于对一个数列进行区间修改区间求和,为了快速修改,需要进行差分,但求和就比较困难
对于区间求和,就相当于求区间差分前缀的前缀
应用上面的方法,就可以方便的解决这个问题
(完虐线段树oooooooooooooooooo)
//p.p.s.难道我讲的不清楚吗...
[bzoj3155]Preprefix sum(树状数组)的更多相关文章
-
codeforces 703D D. Mishka and Interesting sum(树状数组)
题目链接: D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megaby ...
-
Codeforces Round #365 (Div. 2) D.Mishka and Interesting sum 树状数组+离线
D. Mishka and Interesting sum time limit per test 3.5 seconds memory limit per test 256 megabytes in ...
-
hdu3015,poj1990树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3015 题意:给定n组数,每组数有值x和值h,求n组数两两的val的总和.将所有x和所有h分别离散化(不 ...
-
树状数组+二维前缀和(A.The beautiful values of the palace)--The Preliminary Contest for ICPC Asia Nanjing 2019
题意: 给你螺旋型的矩阵,告诉你那几个点有值,问你某一个矩阵区间的和是多少. 思路: 以后记住:二维前缀和sort+树状数组就行了!!!. #define IOS ios_base::sync_wit ...
-
hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数
Cow Sorting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
-
差分+树状数组【p4868】Preprefix sum
Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...
-
Mishka and Interesting sum Codeforces Round #365 (树状数组)
树状数组,与Turing Tree类似. xr[i]表示从1到i的抑或,树状数组维护从1到i每个数只考虑一次的异或,结果为sum(r) ^ sum(l) ^ xr[r] ^ xr[l] 其中xr[r] ...
-
CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组
题目链接:CF #365 (Div. 2) D - Mishka and Interesting sum 题意:给出n个数和m个询问,(1 ≤ n, m ≤ 1 000 000) ,问在每个区间里所有 ...
-
CF #365 (Div. 2) D - Mishka and Interesting sum 离线树状数组(转)
转载自:http://www.cnblogs.com/icode-girl/p/5744409.html 题目链接:CF #365 (Div. 2) D - Mishka and Interestin ...
随机推荐
-
有return的情况下try catch finally的执行顺序(转)
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
-
托管项目到github
将项目托管到github上面其实很简单,主要有以下几个步骤: 1.注册github账号 2.创建一个新的respository:命名这个respository(假设名字为Test),选择权限 3.创建 ...
-
EF架构~真正被封装的排序方法,支持多列排序
回到目录 对于linq to sql 和linq to entity来说,当你把获取数据的方法封装了之后,总觉得还缺点什么,想了之后,应该是排序,但看了微软的orchard项目之后,觉得它的排序封装的 ...
-
oracle 查看锁表情况并处理锁表
/* *locked *query locked object and analyse reason,kill it * */ select 'alter system kill session '' ...
-
Layout No collapsible
center 不可折叠 其它的,没有 title 没法折叠 title 使用子控件的
-
COGS 859. 数列
/* 先来说一下第一眼看到想出的奇葩方法23333.. 找每个数左右有几个比他小的 前几天刚学了区间第k小的求法 然后... 枚举中间的那个点 对于左区间 二分找到他是第几大 右区间同理 然后 *起来 ...
-
关于Go 的 Interface
最近在用Go语言写程序, 其中遇到一个场景:写了一个接口,3个实现接口的struct. 另外一个struct包含此接口,根据构造函数赋予不同的结构实现. 一开始struct里写的是接口的地址,但是在创 ...
-
word20170105订酒店 hotel reservation有用的词和句子
有用的词: hotel reservation/booking: 酒店预订 standard room:标准间 suite: 套房 king size bed: 大床房 double bed:双床房 ...
-
功能强大的StickyHeaderListView:标题渐变、吸附悬停、筛选分类、动态头部
StickyHeaderListView 主要是通过 ListView 添加头部实现,将复杂的头部分解为若*分,如下图:Header 1(广告位).Header 2(频道位).Header 3(运营 ...
-
centos vi显示中文
1. 控制台终端显示中文 修改 /etc/sysconfig/i18n 文件如下: #LANG="en_US.UTF-8"LANG="zh_CN.GB2312" ...