2021.08.09 P4868 Preprefix sum(树状数组)

P4868 Preprefix sum - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意:

前缀和(prefix sum):

\[S_i=\sum_{k=1}^i a_k
\]

前前缀和(preprefix sum) 则把S_i作为原序列再进行前缀和。记再次求得前缀和第i个是SS_i

给一个长度n的序列a1,a2,⋯,a**n*,有两种操作:

  1. Modify i x:把a_i改成x;
  2. Query i:查询SS_i

思路一:

分析:

先假设所有query的i均为n,则add(1,i,(n+1-i)*a[i])。

当n!=i时,减去多算的部分(n-x)*(a[1],a[2],a[3],…,a[i])。

代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; #define int long long
typedef long long ll;
const int N=1e5+10;
int n,m,a[N];
ll t[2][N]; inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
int lowbit(int x){
return x&-x;
}
void add(int flag,int x,int k){
for(int i=x;i<=n;i+=lowbit(i))t[flag][i]+=k;
}
void query(int x,int cha){
ll ans=0;
for(int i=x;i;i-=lowbit(i))ans+=t[1][i],ans-=cha*t[0][i];
//for(int i=x;i;i-=lowbit(i))ans-=cha*t[0][i];
cout<<ans<<endl;
} signed main(){
n=read();m=read();
for(int i=1;i<=n;i++){
a[i]=read();
add(0,i,a[i]);
add(1,i,(n+1-i)*a[i]);
}
/*for(int i=1;i<=8;i++)cout<<t[0][i]<<" ";cout<<endl;
for(int i=1;i<=8;i++)cout<<t[1][i]<<" ";cout<<endl;
cout<<endl;*/
for(int i=1;i<=m;i++){
string s;
cin>>s;
if(s[0]=='Q'){
int x=read();
//cout<<"ans ";//
query(x,n-x);
}else if(s[0]=='M'){
int u,v;
u=read();v=read();
add(0,u,v-a[u]);
add(1,u,(n+1-u)*(v-a[u]));
a[u]=v;
}
/*for(int i=1;i<=8;i++)cout<<t[0][i]<<" ";cout<<endl;
for(int i=1;i<=8;i++)cout<<t[1][i]<<" ";cout<<endl;
cout<<endl;*/
}
return 0;
}

思路二:

分析:

当query为x时,

\[\sum_{i=1}^{x}\sum_{j=1}^{i}a_i=\sum_{i=1}^{x}(x+1-i)*a_i=(x+1)*\sum_{i=1}^{x}a_i-\sum_{i=1}^{x}i*a_i
\]

代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std; #define int long long
typedef long long ll;
const int N=1e5+10;
int n,m,a[N];
ll t[2][N]; inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')w=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0'){
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
int lowbit(int x){
return x&-x;
}
void add(int flag,int x,int k){
for(int i=x;i<=n;i+=lowbit(i))t[flag][i]+=k;
}
void query(int x){
ll ans=0;
for(int i=x;i;i-=lowbit(i))ans-=t[1][i],ans+=(x+1)*t[0][i];
//for(int i=x;i;i-=lowbit(i))ans-=cha*t[0][i];
cout<<ans<<endl;
} signed main(){
n=read();m=read();
for(int i=1;i<=n;i++){
a[i]=read();
add(0,i,a[i]);
add(1,i,i*a[i]);
}
/*for(int i=1;i<=8;i++)cout<<t[0][i]<<" ";cout<<endl;
for(int i=1;i<=8;i++)cout<<t[1][i]<<" ";cout<<endl;
cout<<endl;*/
for(int i=1;i<=m;i++){
string s;
cin>>s;
if(s[0]=='Q'){
int x=read();
//cout<<"ans ";//
query(x);
}else if(s[0]=='M'){
int u,v;
u=read();v=read();
add(0,u,v-a[u]);
add(1,u,u*(v-a[u]));
a[u]=v;
}
/*for(int i=1;i<=8;i++)cout<<t[0][i]<<" ";cout<<endl;
for(int i=1;i<=8;i++)cout<<t[1][i]<<" ";cout<<endl;
cout<<endl;*/
}
return 0;
}

2021.08.09 P4868 Preprefix sum(树状数组)的更多相关文章

  1. [bzoj3155]Preprefix sum(树状数组)

    3155: Preprefix sum Time Limit: 1 Sec  Memory Limit: 512 MBSubmit: 1183  Solved: 546[Submit][Status] ...

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

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

  4. 2018.10.08 NOIP模拟 栅栏(树状数组+rand)

    传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次 ...

  5. hdu3015,poj1990树状数组

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

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

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

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

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

  8. 2021.08.09 P6225 抑或橙子(树状数组)

    2021.08.09 P6225 抑或橙子(树状数组) 重点: 1.异或用法 题意: Janez 喜欢橙子!他制造了一个橙子扫描仪,但是这个扫描仪对于扫描的每个橙子的图像只能输出一个 3232 位整数 ...

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

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

随机推荐

  1. Blazor 002 : 一种开历史倒车的UI描述语言 -- Razor

    Razor是一门相当怪异丑陋的标记语言,但在实际使用中却十分高效灵活.本文主要介绍了Razor是什么,以及Razor引擎的一些浅薄的背后机理. 写文章前我本想一口气把Razor的基本语法,以及Blaz ...

  2. 数据类型 Java day7

    数据类型 数据类型包含:引用数据类型和基本数据类型 引用数据类型:出去基本数据类型,其他的类型,如String 基本数据类型:总共分四大类有八种 四大类:整数,浮点数.字符.布尔 一.整数包含以下 数 ...

  3. MATLAB批量打印输出600PPI的图像且图像不留空白

    一 前言 最近收到审稿人的修改意见,其中有三条:一条为<RC: There were only five images evaluated in the experiment, and I re ...

  4. Docker配置PostgreSQL数据本地持久化

    卷的原理图: 主机中的本地目录作为Docker容器内的持久存储卷装载,以便在主机和Docker容器之间共享数据.如果主机希望访问或定期备份在Docker容器内运行的DB服务器写入文件夹的数据或数据库, ...

  5. Maria DB数据库基础知识

    Maria DB连接 与MariaDB建立连接的一种方法是在命令提示符下使用mysql二进制文件. Maria DB命令行登录数据库服务: mysql -u root -p -- 换行输入密码 上面给 ...

  6. Redis 最适合的场景?

    1.会话缓存(Session Cache) 最常用的一种使用 Redis 的情景是会话缓存(session cache).用 Redis 缓存会 话比其他存储(如 Memcached)的优势在于:Re ...

  7. 什么是 MyBatis 的接口绑定?有哪些实现方式?

    接口绑定,就是在 MyBatis 中任意定义接口,然后把接口里面的方法和 SQL 语句绑 定, 我们直接调用接口方法就可以,这样比起原来了 SqlSession 提供的方法我们可 以有更加灵活的选择和 ...

  8. AOP——基于AspectJ的注解来实现AOP操作

    1.使用注解方式实现AOP操作 第一步:创建对象 <!-- 创建对象 --> <bean id="book" class="com.bjxb.aop.B ...

  9. python学习笔记(四)——面向对象编程

    python 支持面向过程编程和面向对象编程. 传统面向过程编程,也叫函数式编程,通过我们的需求设计成一个一个的函数来完成,对一些小规模程序来说面向过程确实简单方便不少.而随着互联网的发展,对于一些大 ...

  10. 圣诞节,把网站所有的js代码都压缩成圣诞树吧。

    本文分两章节,分别讲解如何使用js2image这个库生成可以运行的圣诞树代码 和 js2image的原理. github地址:https://github.com/xinyu198736/js2ima ...