[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)。

输出格式:

对于每个询问,输出答案,每个答案占一行。

输入输出样例

输入样例#1:

5 2
1 2 3 4 5
1 2 4 1 2
2 3

输出样例#1:

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:

 1 #include<bits/stdc++.h>
 2 #define LL long long
 3 #define id(x) (m+x-1)
 4 using namespace std;
 5 const int N=400005;
 6 int n,m,Q; LL o[N],b[N],w[N];
 7 void B() {
 8     for (int i=1; i<=n; i++) scanf("%lld",&o[i]);
 9     for (m=1; m<=n+1; m<<=1) ;
10 }
11 void U(int x,LL v) {
12     for (b[id(x)]+=v,w[id(x)]+=v*x,(x+=m-1)>>=1; x; x>>=1)
13         b[x]=b[x<<1]+b[x<<1|1],w[x]=w[x<<1]+w[x<<1|1];
14 }
15 LL A(int x) {
16     LL ret=o[x];
17     for (int i=id(x)+1; i!=1; i>>=1)
18         if (i&1) ret+=b[i^1]*(x+1)-w[i^1];
19     return ret;
20 }
21 int main() {
22     scanf("%d%d",&n,&Q),B();
23     for (int i=1; i<=Q; i++) {
24         int c,l,r,k,d; scanf("%d",&c);
25         if (c&1) {
26             scanf("%d%d%d%d",&l,&r,&k,&d);
27             U(l,k),U(l+1,d-k);
28             U(r+1,(LL)(-k)-(LL)(r-l+1)*d),U(r+2,(LL)k+(LL)(r-l)*d);
29         } else scanf("%d",&k),printf("%lld\n",A(k));
30     }
31     return 0;
32 }

View Code

然后,终于tmA掉了。。qwq

垃圾zkw,毁我青春 zkwdalao这么强,当然要%一%啦~~~

转载于:https://www.cnblogs.com/whc200305/p/7588044.html

[luogu P1438] 无聊的数列相关推荐

  1. [洛谷P1438] 无聊的数列

    洛谷题目链接:无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i] ...

  2. 洛谷P1438 无聊的数列

    题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]},支持两种操作: 1.1 ...

  3. 洛谷 P1438 无聊的数列

    题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]},支持两种操作: 1.1 ...

  4. BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)

    BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay) 手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.ne ...

  5. luogu P4108 [HEOI2015]公约数数列(分块、gcd性质)

    题解链接 #include <cstdio> #include <algorithm> #include <cstring> #include <vector ...

  6. LUOGU1438无聊的数列

    区间加等差数列单点查询 思路: 差分,通过树状数组修改,然后保存两个数组,一个存公差,一个存和 然后正常操作即可 在学校潦草写的很潦草啦 代码如下: #include<cstdio> #i ...

  7. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  8. 2018十二月刷题列表

    Preface \(2018\)年的尾巴,不禁感慨自己这一年的蜕变只能用蜕变来形容了. 而且老叶说我们今年没的参加清北冬令营可以参加CCF在广州二中举办的冬令营,只要联赛\(390+\)就应该可以报. ...

  9. 线段树 by yyb

    线段树 by yyb Type1 维护特殊信息 1.[洛谷1438]无聊的数列 维护一个数列,两种操作 1.给一段区间加上一个等差数列 2.单点询问值 维护等差数列 不难发现,等差数列可以写成\(ad ...

最新文章

  1. 【Linux学习九】负载均衡
  2. tomcat配置文件server.xml详解
  3. mysql创建只读权限用户_新品速递 | Harbor 修复权限提升漏洞,MySQL Plus 支持密码强度校验以及审计功能...
  4. Mobile Widget——让开发移动应用就像做网页
  5. 文本聚类python fcm_机器学习笔记----Fuzzy c-means(FCM)模糊聚类详解及matlab实现
  6. KVM 介绍(2):CPU 和内存虚拟化
  7. 遍历Map集合的4种常用方法
  8. 初中生可以学武汉北大青鸟什么专业课程?学完之后从事什么工作?
  9. ESP8266在arduino下开启路由转发实现wifi中继的方法小记
  10. 使用神经网络实现对天气的预测
  11. 聚合支付系统如何开发?
  12. 2019暑期在校培训总结
  13. 6.5 特殊用途语言特性
  14. u盘安装成功计算机里找不到文件夹,插上U盘后,显示成功安装设备驱动程序,但是磁盘里不显示优盘...
  15. 使用NGINX发布DEM切片
  16. Android(permission)常用权限
  17. HDU 3507 斜率优化入学习
  18. ESM测向误差对定位误差的影响分析
  19. 模拟RGB转CVBS/S-video,VGA转CVBS(AV)/S-video,MS1835
  20. 也说说家养猿类养成套路

热门文章

  1. Object.keys()的实用优化
  2. pdf转word需要密码怎么办?几个方法教你解决
  3. 安装MySQL时出现no compatible servers were found的解决方法
  4. 山随明月静,墨染古佛清
  5. Go语言的gob简单使用
  6. 网红带货直播,直播带货,在线教育直播,火山抖音娱乐直播中的技术分析---推流与播流
  7. Netmask (子网掩码 )的用途与子网络的切分
  8. [思维模式-14]:《复盘》-2- “知”篇 - 复盘之道
  9. 车辆动力学理论与应用2021.6.5
  10. 人生不一定有那么多重逢