WEEK5 周记 作业——差分数组_TT的魔法猫
WEEK5 周记 作业——差分数组_TT的魔法猫
一、题意
1.简述
现有n个城市,第iii个城市有一个资产值a[i]a[i]a[i],每次操作让区间[l,r][l,r][l,r]中的城市资产增加ccc,要求qqq操作结束后,给出每个城市的资产值。
2.输入格式
第一行2个整数:nnn,qqq,(1≤n,q≤2×105)(1 \le n,q \le 2 \times 10^5)(1≤n,q≤2×105)——城市的数量和操作的次数。
第二行包含nnn个整数:a1,a2,...an(−106≤ai≤106)a_1,a_2,...a_n(-10^6 \le a_i \le 10^6)a1,a2,...an(−106≤ai≤106) ——每个城市的资产值。
下面跟着qqq行,每行代表一个操作。每一行有3个数:lll,rrr,ccc(1≤l≤r≤n,−105≤c≤105)(1 \le l \le r \le n,-10^5\le c \le 10^5)(1≤l≤r≤n,−105≤c≤105)。
3.输出格式
输出nnn个整数——nnn个城市的最终资产值。
4.样例
Input_1
4 2
-3 6 8 4
4 4 -2
3 3 1
Output_1
-3 6 9 2
Input_2
2 1
5 -2
1 2 4
Output_2
9 2
二、算法
主要思路
首先看看暴力行不行。最多有2×1052 \times 10^52×105次操作,每次操作最多修改2×1052 \times 10^52×105个值,显然时间要超过1s。
考虑差分。差分数组可以在O(1)O(1)O(1)的时间复杂度内修改原数组一个区域内的所有元素的值(增/减相同的ccc)。获取原数组一个元素则需要O(n)O(n)O(n),获取原数组所有元素的值也只需要O(n)O(n)O(n)。
差分数组的构建:B[1]=A[1]B[1] = A[1]B[1]=A[1]B[i]=A[i]−A[i−1]B[i] = A[i]-A[i-1]B[i]=A[i]−A[i−1]所以∑B[i]=A[i]\sum B[i]= A[i]∑B[i]=A[i]A[L]~A[R]均价上c等价于B[L]+=cB[L] += cB[L]+=cB[R+1]−=cB[R+1] -= cB[R+1]−=c
所以按照公式,每次操作我们只需要花费O(1)O(1)O(1)的时间,最终输出所有资产值的时间复杂度为O(n)O(n)O(n)。输出每一个资产值只需要利用公式:A[i]=A[i−1]+B[i]A[i]=A[i-1]+B[i]A[i]=A[i−1]+B[i]就能依次输出。
题外
小心B数组的数据范围,这里应该用long long 类型,因为对一个B数组的元素是有可能加q次c的,按照q和c的数据范围能看出这种情况下用int是会爆精度的。
三、代码
#include<iostream>
#include <cmath>
#include<sstream>
#include<string>
#include<cstdlib>
#include<cstring>
using namespace std;
int a[200010];
long long int b[200010];//又爆了int的精度。。
int main()
{int n,q,i,j;scanf("%d%d",&n,&q);for(i=1;i<=n;i++) scanf("%d",&a[i]);b[1]=a[1];for(i=2;i<=n;i++) b[i]=a[i]-a[i-1];for(i=0;i<q;i++){int l,r,c;scanf("%d%d%d",&l,&r,&c);b[l]+=c;b[r+1]-=c;}long long int sum=b[1];printf("%d",sum);if(n>1)printf(" "); for(i=2;i<=n;i++){sum=b[i]+sum;printf("%lld",sum);if(i<=n-1) printf(" ");}return 0;
}
WEEK5 周记 作业——差分数组_TT的魔法猫相关推荐
- [单调栈/差分/尺取/单调队列]Exercise Week5 A最大矩形+B魔法猫+C平衡字符串+D滑动窗口
目录 A.[单调栈]最大矩形 题意 样例 思路 总结 代码 B.[差分]TT's Magic Cat 题意 样例 思路 总结 代码 C.[尺取]平衡字符串 题意 样例 思路 总结 代码 D.[单调队列 ...
- 差分数组 and 树上差分
差分数组 定义 百度百科中的差分定义 //其实这完全和要讲的没关系 qwq 进去看了之后是不是觉得看不懂? 那我简单概括一下qwq 差分数组de定义:记录当前位置的数与上一位置的数的差值. 栗子 容易 ...
- Gym 101775J Straight Master(差分数组)题解
题意:给你n个高度,再给你1~n每种高度的数量,已知高度连续的3~5个能消去,问你所给的情况能否全部消去:例:n = 4,给出序列1 2 2 1表示高度1的1个,高度2的2个,高度3的2个,高度4的1 ...
- Leetcode题库 798.得分最高的最小轮调(差分数组 C实现)
文章目录 算法一 双层循环 算法二 差分数组 算法一 双层循环 时间复杂度:n^2 空间复杂度:n int bestRotation(int* nums, int numsSize){char Dif ...
- CodeForces - 1343D Constant Palindrome Sum(思维+差分数组)
题目链接:点击查看 题目大意:给出 n 个数,保证 n 是偶数,且每个数的范围都在 [ 1 , k ] 之间,现在问我们至少需要给多少个数重新赋值,使得可以满足条件: 所有的数的值域都在 [ 1 , ...
- POJ - 1743 Musical Theme(二分+后缀数组+差分数组)
题目链接:点击查看 题目大意:给出n个连续的数字组成的序列,现在要求出其中两个不重叠的字序列,满足两个子序列"相似",相似的定义是两个子序列当且仅当长度相等并且每一位的数字差都相等 ...
- Gym - 101775J Straight Master(差分数组)
题目链接:点击查看 题目大意:给出n种数,每种数有a[i]个,每3-5种连续的数都可以被消去,现在问给出的所有数字最后能否全部消去 题目分析:正难则反,题目问能否将数字全部消去,我们不妨设一开始的起点 ...
- python刷题总结_【python刷题】差分数组
前缀和主要适用的场景是原始数组不会被修改的情况下,频繁查询某个区间的累加和. 差分数组的主要适用场景是频繁对原始数组的某个区间的元素进行增减. class Difference: def __init ...
- Master of GCD(差分数组||线段树)
题意:长度为n的数组,一开始都是1.对于区间操作l,r,x,在l~r上乘以x.x2||x3.问操作完毕之后,n个数的最大公因子是多少. 对于每个x,都等于2或者是3.那么看最大的公因子,就看各个位置上 ...
- Greg and Array CodeForces - 296C(差分数组+线段树)
Greg has an array a = a1, a2, -, an and m operations. Each operation looks as: li, ri, di, (1 ≤ li ≤ ...
最新文章
- ContentProvider是如何实现数据共享的
- BENDR for BCI : 多伦多大学研究者提出受BERT启发的深度神经网络学习​海量EEG 数据...
- 必须重视数据中心的规划设计
- 计算机组装大赛队名,比赛项目设计及评分标准-中国海员技能大比武.DOC
- FreeSql (二十)多表查询 WhereCascade
- C/S和B/S模式的主要特点以及区别在那里?画出CGI工作原理图,具体描述CGI的主要流程和实现步骤。
- linux命令详解之df(6/19)
- 线性代数及其应用:绪论
- 母亲节任务最后一个料理的源码
- DDos-Attack攻击器教程(kali linux)
- 微信小程序 9宫格翻牌动画
- 一、线性回归面试题总结
- 秋招在即,你准备好了吗?BAT算法工程师面试经验分享。
- python求最长公共子串_Python-求解两个字符串的最长公共子序列
- [Splay伸展树]splay树入门级教程
- Excel分段求平均值
- 非核心版本的计算机上_软件测试之兼容性测试(上)
- 使用HLK7628N碰到的一些问题
- Spring Bean的定义继承
- 2014 年最热门的国人开发开源软件 TOP 100