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. 5月10日 python学习总结 单表查询 和 多表连接查询

    一. 单表查询  一 语法 select distinct 查询字段1,查询字段2,... from 表名 where 分组之前的过滤条件 group by 分组依据 having 分组之后的过滤条件 ...

  2. loj2985「WC2019」I 君的商店(二分,思维)

    loj2985「WC2019」I 君的商店(二分,思维) loj Luogu 题解时间 真的有点猛的思维题. 首先有一个十分简单的思路: 花费 $ 2N $ 确定一个为 $ 1 $ 的数. 之后每次随 ...

  3. 配置Django环境后,运行时报错

    (背景)安装完Django,并配置完成. 在setting.py中设置了数据库时,出现的报错. 点击查看 数据库配置 DATABASES = { 'default': { # 'ENGINE': 'd ...

  4. 202A 202B 202C 202D 202E字符的作用及解释

    这里你会发现在值的前后有2个\u开头的控制字符:转换网址:http://www.jsons.cn/utf8/ 解释:https://blog.csdn.net/haiyan1111/article/d ...

  5. Kafka 是如何实现高吞吐率的?

    Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写入速度低容量大的硬盘,以此来换取更强的存储能力,但实际上,使用硬盘并没有带来过多的性能损失.kafka主要使用了以下几 ...

  6. Oracle入门基础(九)一一创建表和管理表

    练习:查询每一年入职人数及总人数 SQL> select count(*) Total, 2 sum(decode(to_char(hiredate,'yyyy'),'1980',1,0)) & ...

  7. 什么是 spring 的内部 bean?

    只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean. 为了定义 bean,Spring 的基于 XML 的配置元数据在 <property> 或 &l ...

  8. 一个 Redis 实例最多能存放多少的 keys?List、Set、 Sorted Set 他们最多能存放多少元素?

    理论上 Redis 可以处理多达 232 的 keys,并且在实际中进行了测试,每个实 例至少存放了 2 亿 5 千万的 keys.我们正在测试一些较大的值.任何 list.set. 和 sorted ...

  9. 怎么将 byte 转换为 String?

    可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用 的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也 可能不同.

  10. piwik安装部署

    1.piwik介绍 Piwik是一个PHP和MySQL的开放源代码的Web统计软件,它给你一些关于你的网站的实用统计报告,比如网页浏览人数,访问最多的页面,搜索引擎关键词等等. Piwik拥有众多不同 ...