acwing 243. 一个简单的整数问题2 树状数组 线段树
地址 https://www.acwing.com/problem/content/description/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条指令,每条指令的格式如题目描述所示。
输出格式
对于每个询问,输出一个整数表示答案。
每个答案占一行。
数据范围
≤N,M≤,
|d|≤,
|A[i]|≤
输入样例: Q
Q
Q
C
Q
输出样例:
解答
线段树模板 与上一题几乎一摸一样的板子 可以解决
可以说线段树就是解决此类问题的方案 缺点是相对树状数组 代码稍多
#include <iostream>
#include <algorithm>
#include <string> using namespace std; const int maxn = 1e5 + ;
int n;
int a[maxn];
int q; struct node {
int l, r;
long long sum, lazy;
void update(long long x) {
sum += 1ll * (r - l + )*x;
lazy += x;
}
}tree[maxn*]; void push_up(int x) {
tree[x].sum = tree[x << ].sum + tree[x << | ].sum;
} void push_down(int x)
{
int lazyval = tree[x].lazy;
if (lazyval) {
tree[x << ].update(lazyval);
tree[x << | ].update(lazyval);
tree[x].lazy = ;
} } void build(int x, int l, int r) {
tree[x].l = l; tree[x].r = r;
tree[x].sum = tree[x].lazy = ;
if (l == r) {
tree[x].sum = a[l];
}
else {
int mid = (l + r) / ;
build(x << , l, mid);
build(x << | , mid + , r);
push_up(x);
}
} void update(int x, int l, int r, long long val)
{
int L = tree[x].l, R = tree[x].r;
if (l <= L && R <= r) {
tree[x].update(val);
}
else {
push_down(x);
int mid = (L + R) / ;
if (mid >= l) update(x << , l, r, val);
if (r > mid) update(x << | , l, r, val);
push_up(x);
}
} long long query(int x, int l, int r)
{
int L = tree[x].l, R = tree[x].r;
if (l <= L && R <= r) {
return tree[x].sum;
}
else {
push_down(x);
long long ans = ;
int mid = (L + R) / ;
if (mid >= l) ans += query(x << , l, r);
if (r > mid) ans += query(x << | , l, r);
push_up(x);
return ans;
}
} int main()
{
cin >> n >> q;
for (int i = ; i <= n; i++) {
cin >> a[i];
}
build(, , n); for (int i = ; i <= q; i++) {
string s;
int l, r, d, q;
cin >> s;
if (s == "Q") {
cin >> l>>r;
cout << query(, l, r) << endl;
}
else {
cin >> l >> r >> d;
update(, l, r, d);
}
} return ;
}
线段树
线段树的 区间加 区间和查询解决方案 要使用差分数组
// 1111.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream>
#include <string>
#include <algorithm> using namespace std; const int N = ; typedef long long LL; int n, m;
int a[N];
LL tree1[N]; //b[i]前缀和 差分数组
LL tree2[N]; //b[i]*i前缀和 int lowbit(int x) {
return x & -x;
} void add(LL tr[], int x, LL c) {
for (int i = x; i <= n; i += lowbit(i)) tr[i] += c;
} LL sum(LL tr[], int x) {
LL res = ;
for(int i = x;i;i-=lowbit(i)) res += tr[i]; return res;
} LL prefix_sum(int x) {
return sum(tree1, x)*(x + ) - sum(tree2, x);
} int main()
{
scanf("%d%d",&n,&m);
for (int i = ; i <= n; i++) scanf("%d", &a[i]);
for (int i = ; i <= n; i++) {
int b = a[i] - a[i - ];
add(tree1, i, (LL)b);
add(tree2, i, (LL)b*i);
} while (m--) {
char op[];
int l, r, d;
scanf("%s%d%d", op, &l, &r);
if (*op == 'Q') {
printf("%lld\n",prefix_sum(r)-prefix_sum(l-));
}
else {
scanf("%d", &d);
//a[l]+=d
add(tree1, l, d);
add(tree2, l, l*d);
// a[r+1] -= d
add(tree1, r + , -d);
add(tree2, r + , (r + )*-d);
}
} return ;
}
acwing 243. 一个简单的整数问题2 树状数组 线段树的更多相关文章
- AcWing 243. 一个简单的整数问题2 | 树状数组
传送门 题目描述 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d”,表示把 A[l],A[l+1],…,A[r] 都加上 d. 2.“Q l r”,表示询问 ...
- AcWing 243. 一个简单的整数问题2 (树状数组)打卡
题目:https://www.acwing.com/problem/content/244/ 题意:区间加,区间查询 思路:我们把原先那个差分数组分解一下 ∑i=1x∑j=1ib[j]=∑i=1x(x ...
- AcWing 243. 一个简单的整数问题2
给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1."C l r d",表示把 A[l],A[l+1],-,A[r] 都加上 d. 2."Q l r ...
- AcWing 243. 一个简单的整数问题2 (树状数组,区间更新/询问)
题意:区间更新,区间询问. 题解;对于区间更新,我们还是用差分数组\(b_i\)来更新,区间询问时,我们的答案是:\(\sum_{i=l}^{r}\sum_{j=1}^{i}b_j\), 所以,我们搞 ...
- AcWing 242. 一个简单的整数问题
给定长度为N的数列A,然后输入M行操作指令. 第一类指令形如"C l r d",表示把数列中第l~r个数都加d. 第二类指令形如"Q X",表示询问数列中第x个 ...
- AcWing:242. 一个简单的整数问题(树状数组)
给定长度为N的数列A,然后输入M行操作指令. 第一类指令形如“C l r d”,表示把数列中第l~r个数都加d. 第二类指令形如“Q X”,表示询问数列中第x个数的值. 对于每个询问,输出一个整数表示 ...
- AcWing243一个简单的整数问题2(树状数组+差分+前缀和规律)
题目地址:https://www.acwing.com/problem/content/244/ 题目描述: 给定一个长度为N的数列A,以及M条指令,每条指令可能是以下两种之一: 1.“C l r d ...
- BZOJ 2683: 简单题(CDQ分治 + 树状数组)
BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...
- 【BZOJ2683】简单题 [分治][树状数组]
简单题 Time Limit: 50 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 你有一个N*N的棋盘,每个格子内有一 ...
随机推荐
- MYSQL基本常用函数
MYSQL基本常用函数 一.字符的操作函数 (ps:mysql中的索引都是从1开始的.) 1.instr(param1,param2) 返回子串第一次出现的索引,若找不到则返回0. param1填写操 ...
- Redis的高并发、持久化、高可用架构设计
就是如果你用redis缓存技术的话,肯定要考虑如何用redis来加多台机器,保证redis是高并发的,还有就是如何让Redis保证自己不是挂掉以后就直接死掉了,redis高可用 我这里会选用我之前讲解 ...
- DEVOPS技术实践_20:串联多个job执行
在jenkins可能会有战役中场景,就是在一个job执行完之后,把这个执行结果作为另一个job的执行条件 比如A执行完,如果A执行成功,则执行B,如果失败则执行C 1 前期准备 A任务 import ...
- 从零开始のcocos2dx生活(十一)TableView
目录 简述 主要变量 主要方法 setVerticalFillOrder reloadData cellAtIndex updateCellAtIndex insertCellAtIndex remo ...
- 【学习笔鸡】快速沃尔什变换FWT
[学习笔鸡]快速沃尔什变换FWT OR的FWT 快速解决: \[ C[i]=\sum_{j|k=i} A[j]B[k] \] FWT使得我们 \[ FWT(C)=FWT(A)*FWT(B) \] 其中 ...
- $Noip2018/Luogu5020$ 货币系统 $dp$
$Luogu$ 去年我这题获得了$20$的好分数$ovo..........$ $Sol$ 现在来看其实非常显然叭,只要把能被别的数表示出来的数去掉就好了. $f[i]$表示$i$数能否被其他数表示. ...
- Spring Security详解
Spring Security 一. 简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文 ...
- Groovy重载操作符
重载一时爽,一直重载一直爽. 最近在读<Groovy in action>一本书重新复习了Groovy的一些语法特性,迷恋上这个重载操作符的功能,坚持爽的不要要的.分享一个Demo. 由于 ...
- docker-none
禁用容器的网络连接 如果要完全禁用容器上的网络堆栈,可以--network none在启动容器时使用该标志.在容器内,仅创建环回设备.以下示例说明了这一点. 创建容器. $ docker run -- ...
- SqlBulkCopy批量插入和索引的关系
.net中批量插入基本都用SqlBulkCopy,速度很快,但是这几天发现个问题,2000数据居然15s,百思不得其解.经过大量测试,发现过多的索引和索引碎片会严重影响插入速度,表的数据量大小反而不会 ...