AcWing243一个简单的整数问题2(树状数组+差分+前缀和规律)
题目地址:https://www.acwing.com/problem/content/244/
题目描述:
给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一:
1、“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d。
2、“Q l r”,表示询问 数列中第 l~r 个数的和。
对于每个询问,输出一个整数表示答案。
输入格式
第一行两个整数N,M。
第二行N个整数A[i]。
接下来M行表示M条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
1≤N,M≤1e5,
|d|≤10000,
|A[i]|≤1000000000
题解:这是对树状数组的更深一步的扩展:区间加、区间求和。所以需要解决两个问题:区间加、区间和。区间加比较容易,直接差分就可以。至于区间和我们可以想办法求出原序列a的前缀和表示方法,b是原序列的差分数组

这张图片中的蓝色的,每一行蓝色的和都是一个元素a,分别表示a[1].....a[x].所以我们只需要求出a的前缀和,那么对于区间的和就显而易见了。至于图中的红色是一个填补的作用,我们可以知道a的前缀和就是蓝色+红色再减去红色。首先,蓝色+红色=a[x]*(x+1),而a[x]可以由差分数组b的前缀和求出。红色其实是i*b[i]的前缀和。所以a的前x的和S[x]=b[i]的前缀和*(x+1)-i*b[i]的前缀和。所以查询[l,r]=S[r]-S[l-1]
AC代码:
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+;
#define lowbit(x) (x&(-x))
#define ll long long int
ll a[N]={},b[N]={},c[][N]={},n,m; void add(int k,int x,ll d){
while(x<=n){
c[k][x]+=d;
x+=lowbit(x);
}
} ll sum(int k,int x){
ll sum=;
while(x>){
sum+=c[k][x];
x-=lowbit(x);
}
return sum;
} ll prefix_sum(int x){
return sum(,x)*(x+)-sum(,x);
} int main(){
cin>>n>>m;
memset(c,,sizeof(c));
ll now=,x;
for(int i=;i<=n;i++){
cin>>x;
a[i]=x-now;
now=x;
}
for(int i=;i<=n;i++){
add(,i,a[i]);//差分数组a[i]
add(,i,i*a[i]);//差分数组i*a[i]
}
char ch;
ll l,r,d;
while(m--){
cin>>ch;
if(ch=='C'){
cin>>l>>r>>d;
add(,l,d);
add(,r+,-d);
add(,l,l*d);
add(,r+,(r+)*(-d));
}
else {
cin>>l>>r;
cout<<(prefix_sum(r)-prefix_sum(l-))<<endl;
}
}
return ;
}
写于:2020/8/26 17:27
AcWing243一个简单的整数问题2(树状数组+差分+前缀和规律)的更多相关文章
- AcWing:242. 一个简单的整数问题(树状数组)
给定长度为N的数列A,然后输入M行操作指令. 第一类指令形如“C l r d”,表示把数列中第l~r个数都加d. 第二类指令形如“Q X”,表示询问数列中第x个数的值. 对于每个询问,输出一个整数表示 ...
- acwing 243. 一个简单的整数问题2 树状数组 线段树
地址 https://www.acwing.com/problem/content/description/244/ 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l ...
- AcWing 243. 一个简单的整数问题2 (树状数组,区间更新/询问)
题意:区间更新,区间询问. 题解;对于区间更新,我们还是用差分数组\(b_i\)来更新,区间询问时,我们的答案是:\(\sum_{i=l}^{r}\sum_{j=1}^{i}b_j\), 所以,我们搞 ...
- AcWing 243. 一个简单的整数问题2 | 树状数组
传送门 题目描述 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d. 2.“Q l r”,表示询问 ...
- 洛谷P3368 树状数组2 树状数组+差分
正解:树状数组+差分 解题报告: 戳我! 不得不说灵巧真滴是越来越弱了...连模板题都要放上来了QAQ 因为今天考试的T3正解要用到树状数组这才惊觉树状数组掌握得太太太太差了...之前一直靠线段树续着 ...
- 51Nod 1272最大距离 (树状数组维护前缀最小值)
题目链接 最大距离 其实主流解法应该是单调栈……我用了树状数组. #include <bits/stdc++.h> using namespace std; #define rep(i, ...
- BZOJ 2683: 简单题(CDQ分治 + 树状数组)
BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...
- 【bzoj1103】【POI2007】【大都市】(树状数组+差分)
在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n的n个小村庄,某些村庄之 ...
- bzoj 1878: [SDOI2009]HH的项链 ——树状数组+ 差分
Description HH有一串由各种漂亮的贝壳组成的项链.HH相信不同的贝壳会带来好运,所以每次散步 完后,他都会随意取出一 段贝壳,思考它们所表达的含义.HH不断地收集新的贝壳,因此他的项链变得 ...
随机推荐
- Seaborn基础1
import seaborn as sns import numpy as np import matplotlib.pyplot as plt # # 折线图 def sinplot(flip = ...
- pandas_读取Excel并筛选特定数据
# C:\Users\lenovo\Desktop\总结\Python # 读取 Excel 文件并进行筛选 import pandas as pd # 设置列对齐 pd.set_option(&qu ...
- PHP sin() 函数
实例 返回不同数的正弦: <?php高佣联盟 www.cgewang.comecho(sin(3) . "<br>");echo(sin(-3) . " ...
- 获取判断IE版本 TypeError: Cannot read property 'msie' of undefined
注意:以下方法只适用于IE11 以下: TypeError: Cannot read property 'msie' of undefined jquery1.9去掉了 $.browser 所以报错 ...
- 基于IDEA 代码提交Git
基于IDEA 代码提交Git 步骤 1 创建一个项目 2 点击 VCS --> Import init Version Control --> Create Git Repository ...
- SpringBoot中使用AOP打印接口日志的方法(转载)
前言 AOP 是 Aspect Oriented Program (面向切面)的编程的缩写.他是和面向对象编程相对的一个概念.在面向对象的编程中,我们倾向于采用封装.继承.多态等概念,将一个个的功能在 ...
- 001_centos7配置网络动态获取IP地址
笔者今天刚装完centos7的虚拟机,发现无法获取IP地址,经过网上查询资料,发现centos7是默认没有网络配置的,需要手工配置. 而centos7与centos6不同,没有了config命令,所以 ...
- JavaScript的函数和作用域闭包
1. 函数 1.1 定义函数 function add(x, y){ return x + y; } 上述函数定义如下: 关键字function指出这是一个函数定义: add是函数的名称: (x, y ...
- js 事件对象相关笔记
事件对象 event就是一个事件对象 写到我们的监听函数的括号里面 当形参来看 事件对象只有有了事件才存在,他是系统给我们自动创建的 不需要我们传递参数 事件对象是我们事件的一 ...
- 2020重新出发,JAVA入门,关键字&保留字
关键字 & 保留字 关键字(或者保留字)是对编译器有特殊意义的固定单词,不能在程序中做其他目的使用. 关键字具有专门的意义和用途,和自定义的标识符不同,不能当作一般的标识符来使用.例如, cl ...