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. 【基础】java环境搭建及配置--->【关注微信公众号:三叔测试笔记,及时获取干货】

    一.下载安装 Java官网下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.ht ...

  2. gofs使用教程-基于golang的开源跨平台文件同步工具

    概述 gofs是基于golang开发的一款开箱即用的跨平台文件同步工具,开源地址如下:https://github.com/no-src/gofs,欢迎点个Star或者提交Issue和PR,共同进步! ...

  3. RabbitMQ 的集群?

    镜像集群模式 你创建的 queue,无论元数据还是 queue 里的消息都会存在于多个实例上,然后每次你写消息到 queue 的时候,都会自动把消息到多个实例的 queue 里进行消息同步. 好处在于 ...

  4. SpringBoot Jpa 双数据源mysql + oracle + liquibase+参考源码

    一.yml文件配置 spring: # 数据库配置 datasource: primary: jdbc-url: jdbc:mysql://localhost:3306/mes-dev?useUnic ...

  5. SringBoot之yaml语法

    ------------恢复内容开始------------ SpringBoot之yaml语法 1.配置文件 官方配置文档太多了,根本记不住! 怎么办呐-->了解原理 SpringBoot使用 ...

  6. POJ 2236:Wireless Network

    描述 n台电脑,如果两台电脑间的距离的d范围内,则两台电脑能够连通. 如果AB连通,BC连通,则认为AC连通. 已知电脑台数N,最大距离d,以及每个电脑的坐标.有如下两种操作: O i 表示修复编号为 ...

  7. React 可视化开发工具 shadow-widget 的非可视开发方法

    Shadow Widget 提倡在可视设计器中开发用户界面,输出转义标签,而非 JSX.许多童鞋可能不知道 SW 同样支持用 JSX 设计界面,开发体验比原生 React 编程好出很多,本文就介绍这方 ...

  8. JS+CSS3 360度全景图插件 - Watch3D.js

    日常闲扯 从上一篇文章到这篇中间快过了一年了,时间真滴过得快.不是在下中间没想过写新的文章,而是自己确实变懒了(体重+1 +1 +1 +1....) ..OTL...不过到最后觉得还是需要写点东西,不 ...

  9. RStudio中文乱码

    解决办法一: 1.设置RStudio文本显示的默认编码:RStudio菜单栏的Tools -> Global Options 2.code-->saving-->default te ...

  10. Python爬虫报错:"HTTP Error 403: Forbidden"

    错误原因:主要是由于该网站禁止爬虫导致的,可以在请求加上头信息,伪装成浏览器访问User-Agent. 新增user-agent信息: headers = {'User-Agent':'Mozilla ...