[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:

 #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] 无聊的数列的更多相关文章

  1. Luogu P1438无聊的数列

    洛谷 P1438无聊的数列 题目链接 点这里! 题目描述 维护一个数列\(a_i\),支持两种操作: 给出一个长度等于 \(r-l+1\)的等差数列,首项为\(k\) 公差为\(d\) 并将它对应加到 ...

  2. LUOGU P1438 无聊的数列 (差分+线段树)

    传送门 解题思路 区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相 ...

  3. P1438 无聊的数列 (差分+线段树)

    题目 P1438 无聊的数列 解析: 先考虑修改,用差分的基本思想,左端点加上首项\(k\),修改区间\((l,r]\)内每个数的差分数组都加上公差\(d\),最后的\(r+1\)再减去\(k+(r- ...

  4. P1438 无聊的数列

    P1438 无聊的数列 链接 分析: 等差数列可加,首项相加,公差相加. 代码: #include<cstdio> #include<algorithm> #include&l ...

  5. 洛谷P1438 无聊的数列 [zkw线段树]

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

  6. 洛谷 P1438 无聊的数列

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

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

    题目类型:差分,线段树 传送门:>Here< 题意:给出一个数列,每次给一个区间对应的加上一个等差数列,并询问某一个元素目前的值. 解题思路 所谓差分,我个人的理解就是用\(O(1)\)的 ...

  8. 洛谷 P1438 无聊的数列 题解

    原题链接 首先,我们考虑用差分解决问题. 用 \(x_i\) 表示原数列,\(a_i = x_i - x_{i-1}\) 那么,先普及一下差分: 如果我们只需要维护区间加值,单点求值的话,你会发现两个 ...

  9. Luogu P1438无聊的序列【线段树/差分】By cellur925

    题目传送门 题目大意:维护一个序列,维护区间加等差数列,单点查询的操作. 首先我们肯定是要用线段树来维护了,按照一般的思维局限,我选择了维护序列中的值,但是区间修改的时候由于公差的存在,所以区间修改有 ...

随机推荐

  1. 页面中,禁止html内容被选择

    1.通过css的方式 *{ moz-user-select: -moz-none; -moz-user-select: none; -o-user-select:none; -khtml-user-s ...

  2. python3.6配置libsvm2.2

    参考自:https://blog.csdn.net/weixin_35884839/article/details/79398085 由于需要使用到libsvm,所以开始配这个,所幸一次性就成功了. ...

  3. C# Combobox联动

    接上一篇博文,对界面做一个小修改,做4个combobox,形成窗口之间的联动: 界面如下: 选择combobox里的条件,单击查询获取数据 首先连接数据库,获取到数据到第一个combobox里,代码在 ...

  4. ajax 怎么重新加载页面

    $.ajax({ type:"post", url:url, data:{xxx:xx}, dataType: "json", success : functi ...

  5. 使用cmd命令进行导入

    进入cmd直接输入命令 imp 用户名/密码@监听器路径/数据库实例名称 file='d:\数据库文件.dmp' full=y ignore=y 例如: imp mislogin/mislogin@l ...

  6. 力扣(LeetCode)412. Fizz Buzz

    写一个程序,输出从 1 到 n 数字的字符串表示. 如果 n 是3的倍数,输出"Fizz": 如果 n 是5的倍数,输出"Buzz": 3.如果 n 同时是3和 ...

  7. JavaScript 第三章总结

    Getting functional function的特点 function can be reused over and over much more readable function is p ...

  8. 雷林鹏分享:C# 常量

    C# 常量 常量是固定值,程序执行期间不会改变.常量可以是任何基本数据类型,比如整数常量.浮点常量.字符常量或者字符串常量,还有枚举常量. 常量可以被当作常规的变量,只是它们的值在定义后不能被修改. ...

  9. English trip M1 - AC11 I Dreamed a Dream? 我做了一个梦 Teacher:Lamb

    In this lesson you will learn to describe an experience.  这节课你讲学习到描述经历 课上内容(Lesson) 词汇(Key Word ) 句型 ...

  10. BGP - 2,BGP报文和BGP状态

    1,BGP报文      Open:建邻居,交换version.AS号.holdtime.BGP identifier(即RouterID).可选参数长度.可选参数.      Keepalive:保 ...