3155: Preprefix sum

Time Limit: 1 Sec  Memory Limit: 512 MB
Submit: 1183  Solved: 546
[Submit][Status][Discuss]

Description

 

Input

第一行给出两个整数N,M。分别表示序列长度和操作个数
接下来一行有N个数,即给定的序列a1,a2,....an
接下来M行,每行对应一个操作,格式见题目描述

Output

对于每个询问操作,输出一行,表示所询问的SSi的值。

Sample Input

5 3
1 2 3 4 5
Query 5
Modify 3 2
Query 5

Sample Output

35
32

HINT

1<=N,M<=100000,且在任意时刻0<=Ai<=100000

Source

Katharon+#1

学过线段树都知道树状数组不能处理区间修改,无逆元的区间加法

但是树状数组其实用差分可以做区间修改单点查询

当然这道题和更强的区间修改求和关系不大,但形式确实很像

对于原数列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(树状数组)的更多相关文章

  1. 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 ...

  2. 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 ...

  3. hdu3015,poj1990树状数组

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3015 题意:给定n组数,每组数有值x和值h,求n组数两两的val的总和.将所有x和所有h分别离散化(不 ...

  4. 树状数组+二维前缀和(A.The beautiful values of the palace)--The Preliminary Contest for ICPC Asia Nanjing 2019

    题意: 给你螺旋型的矩阵,告诉你那几个点有值,问你某一个矩阵区间的和是多少. 思路: 以后记住:二维前缀和sort+树状数组就行了!!!. #define IOS ios_base::sync_wit ...

  5. hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数

    Cow Sorting Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 差分+树状数组【p4868】Preprefix sum

    Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...

  7. 2021.08.09 P4868 Preprefix sum(树状数组)

    2021.08.09 P4868 Preprefix sum(树状数组) P4868 Preprefix sum - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 前缀和(pr ...

  8. 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] ...

  9. 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) ,问在每个区间里所有 ...

随机推荐

  1. Android RSA加密解密

    概述 RSA是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困 难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数 ...

  2. Unit01-OOP-对象和类(上)

    Unit01-OOP-对象和类(上) 1.什么是类?什么是对象?  1)现实生活是由很多很多对象组成的    基于对象抽出了类  2)对象:真实存在的单个的个体    类:类型.类别,代表一类个体  ...

  3. python 操作消息队列

    图示 其中P指producer,即生产者:C指consumer,即消费者.中间的红色表示消息队列,实例中表现为HELLO队列. 往队列里插入数据前,查看消息队列 $sudo rabbitmqctl l ...

  4. pthread_attr_setdetachstate

    pthread_create函数可以指定新创建线程的属性. pthread_attr_setdetachstate() set  detach state attribute in thread at ...

  5. git制作增量包用于更新代码

    1 先找到指定的开始提交id,比如 05104e3475f63e1e49fbfcbd424a4a3801b95645 2 找到结束的提交id,比如 a0eb9bc6d4e1801062877fd435 ...

  6. Struts2(四):在Action中如何访问Web资源

    1.什么WEB资源? HttpServletRequest,HttpServletRespone,HttpApplication,ServletContext,HttpSession等原生Servle ...

  7. Oracle常用操作-----(一)

    Oracle创建约束: ALTER TABLE 表名 ADD CONSTRAINT 约束名 约束内容. [注]Oracle中的default是一个值,而sql server中的default是一个约束 ...

  8. pycharm下载 -professional

    Jet Brains 开发的PyCharm 我传到百度云上了.只供开发使用,违者必究.大家一起学开发.有谁有python 进阶 电子书,可以发到我的邮箱里:120946018@qq.com,谢谢 Ma ...

  9. 提高网站性能的 5 个 Grunt任务//////////////////z

    提高网站性能的 5 个 Grunt任务 时间 2015-03-06 09:13:02  极客头条 原文  http://hugnew.com/wordpress/提高网站性能的-5-个-grunt任务 ...

  10. 0518 Scrum项目5.0

    一,组员任务完成情况 首页设计初步完成但是需要优化界面,只能简单的输出信息和在首页进行登录.界面极其简单. 鸡汤版面设计有困难,问题在于用何种形式来管理用户的数据上传,但是经过小组间的讨论确定设计方向 ...