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的棋盘,每个格子内有一 ...
随机推荐
- Google 开源的 Python 命令行库:深入 fire(一)
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- java 使用 apoi 更新 ppt 中图表的数据
本文源码: 1. https://github.com/zhongchengyi/zhongcy.demos/tree/master/apoi-ppt-chart 2. 在第5节也有核心源码 1 ...
- navicat创建存储过程时报错1064
1.这是创建的存储过程 2.一保存就会出错 3.后来上网查了一下是存储过程的参数没有设定长度导致的,我们在Navicat中创建存储过程时参数的长度需要自己动手去添加的否则就会包这种错误. 添加上参数的 ...
- beta 1/2 阶段中间产物提交入口
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/9918 git地址:https://e.coding.net/Eustia ...
- selenium模块的基本使用
一.selenium库与requests库的区别 - selenium请求库: - 本质上是一个自动化测试模块; ---> 主要用于测试 UI界面 - selenium除了可以做自动化测试,还可 ...
- .net core试水
概述 大概记录下我如何第一次使用.net core搭建一个api,由于最近.net core比较火,我也尝试着使用.net core做了一个小功能 本文主要包括 1.环境配置 2.程序编写 3.程序部 ...
- 「CF86D」Powerful array 解题报告
题面 给出一个\(n\)个数组成的数列\(a\),有\(t\)次询问,每次询问为一个\([l,r]\)的区间,求区间内每种数字出现次数的平方×数字的值 的和 思路: 直接上莫队咯 然后就T了 没学过莫 ...
- 1089 狼人杀-简单版 (20 分)C语言
以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人杀"游戏中,1 号玩家说:"2 号是狼人" ...
- Spark学习笔记(二)—— Local模式
Spark 的运行模式有 Local(也称单节点模式),Standalone(集群模式),Spark on Yarn(运行在Yarn上),Mesos以及K8s等常用模式,本文介绍第一种模式. 1.Lo ...
- spring boot的application配置文件
上次我们已经对这个文件见过面了,并且对他进行了一些简单的配置.它有两种配置方式,一个是application.properties,一个是application.yml文件,需要记住,当两个文件都 ...