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. Codeforces Round #361 (Div. 2) C D

    C 给出一个m 此时有 四个数 分别为x k*x k*k*x k*k*k*x k大于1 x大于等于1 要求求出来一个最小的值n 使其满足 这四个数中的最大值小于n 这四个数可能的组数为m 可以看出这四 ...

  2. GFS文件系统和在RedHat Linux下的配置

    GFS的全称是Google file System,为了满足Google迅速增长的数据处理要求,Google设计并实现的Google文件系统(GFS).Google文件系统是一个可扩展的分布式文件系统 ...

  3. ThinkPHP3.2.3 Nginx 下 URL_MODEL 的配置

    ThinkPHP3.2.3 的 URL_MODEL 包括普通模式(0).PATHINFO 模式(1).REWRITE 模式(2).兼容模式(3)等 4 种 URL 模式.在 Apache 下只要在配置 ...

  4. .htaccess 重写去index.php

    .htaccess 重写去index.php <IfModule mod_rewrite.c>RewriteEngine onRewriteCond %{REQUEST_FILENAME} ...

  5. 设置sublime text2/3中默认预览浏览器快捷键的方法

    各位前端大神们,大家在用IDE编辑器的时候喜欢用哪些呢?是Dreamweaver.Zend Studio.editplus又或者是sublime text?今天马浩周给大家就要说说设置sublime ...

  6. angular 路由去除#号

    1.  路由启动          $locationProvider.html5Mode(true);  通过pushstatex修改url app.js define([ 'angular', & ...

  7. python 多线程就这么简单(续)

    之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思.因为我们在使用电脑的过程中无时无刻都在多进程和多线程.我们可以接着之前的例子继续讲.请先看我的上一篇博客. python 多线程就这 ...

  8. (copy) Shell Script to Check Linux System Health

    source: http://linoxide.com/linux-shell-script/shell-script-check-linux-system-health/ This article ...

  9. kernel update 2.6.18-2.6.38

    细致某种程度上可以体现作者的开放精神 copy for build a note needed when config the kernel 主要的问题出在了menu.lst 和 grub.conf文 ...

  10. Chrome浏览器M53更新后超链接的dispatchEvent(evt)方法无法触发文件下载

    一个经典的js前台文件下载方法: var aLink = document.createElement('a'); var datatype="data:text/plain;charset ...