2021.08.09 P4868 Preprefix sum(树状数组)
2021.08.09 P4868 Preprefix sum(树状数组)
P4868 Preprefix sum - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题意:
前缀和(prefix sum):
\]
前前缀和(preprefix sum) 则把S_i作为原序列再进行前缀和。记再次求得前缀和第i个是SS_i
给一个长度n的序列a1,a2,⋯,a**n*,有两种操作:
Modify i x:把a_i改成x;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时,
\]
代码如下:
#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(树状数组)的更多相关文章
- [bzoj3155]Preprefix sum(树状数组)
3155: Preprefix sum Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 1183 Solved: 546[Submit][Status] ...
- 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 ...
- 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 ...
- 2018.10.08 NOIP模拟 栅栏(树状数组+rand)
传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次 ...
- hdu3015,poj1990树状数组
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3015 题意:给定n组数,每组数有值x和值h,求n组数两两的val的总和.将所有x和所有h分别离散化(不 ...
- 树状数组+二维前缀和(A.The beautiful values of the palace)--The Preliminary Contest for ICPC Asia Nanjing 2019
题意: 给你螺旋型的矩阵,告诉你那几个点有值,问你某一个矩阵区间的和是多少. 思路: 以后记住:二维前缀和sort+树状数组就行了!!!. #define IOS ios_base::sync_wit ...
- hdu 2838 Cow Sorting 树状数组求所有比x小的数的个数
Cow Sorting Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 2021.08.09 P6225 抑或橙子(树状数组)
2021.08.09 P6225 抑或橙子(树状数组) 重点: 1.异或用法 题意: Janez 喜欢橙子!他制造了一个橙子扫描仪,但是这个扫描仪对于扫描的每个橙子的图像只能输出一个 3232 位整数 ...
- 差分+树状数组【p4868】Preprefix sum
Description 前缀和(prefix sum)\(S_i=\sum_{k=1}^i a_i\). 前前缀和(preprefix sum) 则把\(S_i\)作为原序列再进行前缀和.记再次求得前 ...
随机推荐
- CF1545X Codeforces Round #732
A. AquaMoon and Strange Sort 叉人题 如果数字各不相同,只需要统计每个数参与构成的逆序对总数,如果是奇数一定最终朝左,偶数朝右.无意义的数字交换对方向是没有影响的 继续考虑 ...
- Android 12(S) 图形显示系统 - 解读Gralloc架构及GraphicBuffer创建/传递/释放(十四)
必读: Android 12(S) 图形显示系统 - 开篇 一.前言 在前面的文章中,已经出现过 GraphicBuffer 的身影,GraphicBuffer 是Android图形显示系统中的一个重 ...
- 从字符串某位置开始的递增串(dfs)注意for循环中下标的错误
#include <iostream> #include <string> using namespace std; char res[50];int tag=1; void ...
- JSP内置对象(4个作用域)
9个内置对象: 4个作用域:表示这4个对象可以存值,但取值范围有限定(setAttribute/getAttribute) pageContext request session applicatio ...
- XStream类对象把List<javaBean>()转成json数据
[省市联动] Servlet端: XStream把list转成json数据 //JSONArray-->变成数组/集合[] //JSONObject-->变成简单的数据{name:ayee ...
- 为什么Java中 wait 方法需要在 synchronized 的方法中调用?
另一个棘手的核心 Java 问题,wait 和 notify.它们是在有 synchronized 标记的方法或 synchronized 块中调用的,因为 wait 和 modify 需要监视对其上 ...
- phpstorm 快捷生成函数
在函数上一行键入 /** /** * @param $a * @param $b * @return mixed */ function abc($a, $b) { $c = $a + $b; ret ...
- jQuery--事件案例(鼠标提示)
1.文字提示 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...
- Java 中,Maven 和 ANT 有什么区别?
虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做的事情更多, 在基于"约定优于配置"的概念下,提供标准的 Java 项目结构,同时能为应用自 动管理依赖(应用 ...
- jmeter的安装使用
以前没自己做过压力测试,一直都是测试在做.现在需要自己做压力测试了,特别学习下jmeter的使用方法.现在做下记录: 1.下载jmeter,这个忽略,百度到处都是 2.打开jmeter,jmeter的 ...