[luogu P1438] 无聊的数列
[luogu P1438] 无聊的数列
题目背景
无聊的YYB总喜欢搞出一些正常人无法搞出的东西。有一天,无聊的YYB想出了一道无聊的题:无聊的数列。。。(K峰:这题不是傻X题吗)
题目描述
维护一个数列{a[i]},支持两种操作:
1、1 L R K D:给出一个长度等于R-L+1的等差数列,首项为K,公差为D,并将它对应加到a[L]~a[R]的每一个数上。即:令a[L]=a[L]+K,a[L+1]=a[L+1]+K+D,
a[L+2]=a[L+2]+K+2D……a[R]=a[R]+K+(R-L)D。
2、2 P:询问序列的第P个数的值a[P]。
输入输出格式
输入格式:
第一行两个整数数n,m,表示数列长度和操作个数。
第二行n个整数,第i个数表示a[i](i=1,2,3…,n)。
接下来的m行,表示m个操作,有两种形式:
1 L R K D
2 P 字母意义见描述(L≤R)。
输出格式:
对于每个询问,输出答案,每个答案占一行。
输入输出样例
5 2 1 2 3 4 5 1 2 4 1 2 2 3
6
说明
数据规模:
0≤n,m≤100000
|a[i]|,|K|,|D|≤200
Hint:
有没有巧妙的做法?
纯粹是为了刷zkw线段树才看这题的。。(标签打着zkw我也没办法)
zkw是一种很棒棒的线段树,将冗长的代码(还是zkw清真)压得很短,还是非递归的,常数小,空间小,效率高!
但是。。。
这一题花了本蒟蒻两个下午+一个晚上的时间(悲剧),可能是因为我实在太菜了吧,旁边xtx一眼用bit秒掉了这题(%%%)。
好吧,我承认用了与sol里面都不同的方法(因为我要练zkw啊!!!)
因为我太菜了,不会bit,不会lazy,所以只能打打zkw了。。
我是这样想的——
由于区间修改时,直接上去用数据结构修改是一件很麻烦的事情,那怎么办?
设原数组为o[1..n],设a[1]=o[1],a[2]=o[2]-o[1]...(dalao们一定都看出来了,这是差分数组)
这样,修改就变成了:
a[l]+=k,a[l+1..r]+=d,a[r+1]-=k+(r-l)*d
但是。。仍然需要区间修改。。。怎么办?再差分!
设b[1]=a[1],b[2]=a[2]-a[1]...
这样,修改又变成了:
b[l]+=k,b[l+1]+=d,b[r]-=k+(r-l+1)*d,b[r+1]+=k+(r-l)*d(别看就几个式子,当时的我意识模糊推了好久)
显然,我们现在只需要单点修改了,是不是很高兴!!!
然而,查询怎么办?
推一推。。。
o[x]=a[1]+a[2]+...+a[x]=b[1]+b[1]+b[2]+b[1]+b[2]+b[3]+...+b[1]+b[2]+..+b[x]=x*b[1]+(x-1)*b[2]+...+1*b[x]
这怎么办?
o[x]=(x+1)*(b[1]+b[2]+..+b[x])-(1*b[1]+2*b[2]+..+x*b[x])
好像可以了。。。我们发现,我们还需要在维护一个w数组其中w[i]=i*b[i]。
然后,询问操作就变成了区间修改,或者说更简单的区间修改(前缀和)。。
code:
#include<bits/stdc++.h> #define LL long long #define id(x) (m+x-1) using namespace std; ; int n,m,Q; LL o[N],b[N],w[N]; void B() { ; i<=n; i++) scanf("%lld",&o[i]); ; m<=n+; m<<=) ; } void U(int x,LL v) { )>>=; x; x>>=) b[x]=b[x<<]+b[x<<|],w[x]=w[x<<]+w[x<<|]; } LL A(int x) { LL ret=o[x]; ; i!=; i>>=) ) ret+=b[i^]*(x+)-w[i^]; return ret; } int main() { scanf("%d%d",&n,&Q),B(); ; i<=Q; i++) { int c,l,r,k,d; scanf("%d",&c); ) { scanf("%d%d%d%d",&l,&r,&k,&d); U(l,k),U(l+,d-k); U(r+,(LL)(-k)-(LL)(r-l+)*d),U(r+,(LL)k+(LL)(r-l)*d); } else scanf("%d",&k),printf("%lld\n",A(k)); } ; }
然后,终于tmA掉了。。qwq
垃圾zkw,毁我青春 zkwdalao这么强,当然要%一%啦~~~
[luogu P1438] 无聊的数列的更多相关文章
- Luogu P1438无聊的数列
洛谷 P1438无聊的数列 题目链接 点这里! 题目描述 维护一个数列\(a_i\),支持两种操作: 给出一个长度等于 \(r-l+1\)的等差数列,首项为\(k\) 公差为\(d\) 并将它对应加到 ...
- LUOGU P1438 无聊的数列 (差分+线段树)
传送门 解题思路 区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相 ...
- P1438 无聊的数列 (差分+线段树)
题目 P1438 无聊的数列 解析: 先考虑修改,用差分的基本思想,左端点加上首项\(k\),修改区间\((l,r]\)内每个数的差分数组都加上公差\(d\),最后的\(r+1\)再减去\(k+(r- ...
- P1438 无聊的数列
P1438 无聊的数列 链接 分析: 等差数列可加,首项相加,公差相加. 代码: #include<cstdio> #include<algorithm> #include&l ...
- 洛谷P1438 无聊的数列 [zkw线段树]
题目传送门 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]} ...
- 洛谷 P1438 无聊的数列
题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]},支持两种操作: 1.1 ...
- [洛谷P1438] 无聊的数列
题目类型:差分,线段树 传送门:>Here< 题意:给出一个数列,每次给一个区间对应的加上一个等差数列,并询问某一个元素目前的值. 解题思路 所谓差分,我个人的理解就是用\(O(1)\)的 ...
- 洛谷 P1438 无聊的数列 题解
原题链接 首先,我们考虑用差分解决问题. 用 \(x_i\) 表示原数列,\(a_i = x_i - x_{i-1}\) 那么,先普及一下差分: 如果我们只需要维护区间加值,单点求值的话,你会发现两个 ...
- Luogu P1438无聊的序列【线段树/差分】By cellur925
题目传送门 题目大意:维护一个序列,维护区间加等差数列,单点查询的操作. 首先我们肯定是要用线段树来维护了,按照一般的思维局限,我选择了维护序列中的值,但是区间修改的时候由于公差的存在,所以区间修改有 ...
随机推荐
- magrittr管道操作符使用解释(一)
使用管道操作符提高代码简洁性 在编写R语言代码时,有时候需要对一个变量进行一系列的运算,例如对于一个同时包含数值列和字符串列的数据框,如果要计算所有数值列之间的相关系数,一般要分两步,第一步首先筛选数 ...
- 【Java】【集合】
[1. ]HashMap,LinkedHashMap,TreeMap对比 共同点: HashMap,LinkedHashMap,TreeMap都属于Map:Map 主要用于存储键(key)值(valu ...
- 2018.3 江苏省计算机等级考试 C语言 编程题答案
题目要求:给定一个数字范围,输出满足这些条件: 1.能被3整除: 2.包含数字5, 将满足的数字放在特定的数组里输出.输出这些数里5出现的个数.数字的个数. 想起来有点伤心,本来很简单的题,考试的时候 ...
- JavaScript重点知识(一)
一.总括 基础知识: 1.变量 2.原型和原型链 3.作用域和闭包 4.异步和单线程 JS的API: 1.BOM,DOM操作 2.事件绑定 3.Ajax 4.JSOP 5.存储 二.基础知识 2.1知 ...
- 宠物属性控制_pet
classIndex 职业索引 DmgAddPct 根据职业的法伤或攻强来计算宠物增加的物理伤害,增加的伤害值等于玩家法伤或攻强的百分比 SpAddPct 根据职业的法伤或攻强来计算宠物增加的法术伤害 ...
- ssh连接服务器
1.命令行操作 第一步输入 :ssh 用户名@服务器外网ip 第二步:输入密码,回车 看到welcome提示信息即为登陆成功 输入:exit 退出 2.客户端操作 windows下载ssh软件,安装 ...
- javaSE习题 第二章 基本数据类型和数组
问答: 1.什么叫标识符,标识符的规则是什么? 用来标志类名,变量名,方法名,类型名,数组名,文件名的有效字符序列称为标识符. 规则:1.由字母,数字,下划线,美元组成.2.标识符第一个字符不能是数字 ...
- 导入dmp文件时,需要删除原有ORACLE数据库实例
导入dmp文件时,对于已存在的数据库实例及表处理方式:删除实例. 1.以管理员身份登录 sqlplus / as sysdba 2.停止实例 shutdown abort; 执行结果:ORACLE i ...
- String和常量池
1.Java 会确保一个字符串常量只有一个拷贝 2.用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间 ...
- OpenModelica读取文件
parameter String file = Modelica.Utilities.Files.loadResource("J:/git/tcs/tcs.txt"); 将文件名变 ...