洛谷 P1438无聊的数列

题目链接

点这里!


题目描述

维护一个数列\(a_i\),支持两种操作:

  • 给出一个长度等于 \(r-l+1\)的等差数列,首项为\(k\) 公差为\(d\) 并将它对应加到\([l,r]\)范围中的每一个数上。

    即:令\(a_l=a_l+k\) \(a_{l+1}=a_{l+1}+k+d\) ... \(a_r = a_r + k + (r-l) * d\) 。
  • 询问数列的第\(p\)个数的值\(a_p\).

解题思路

我们可以通过等差数列的性质\(a_i - a_{i-1} = d\)联想到我们可以用差分解决这道题目

我们先定义一个差分数组d[]

将等差数列的每一项都加到\([l,r]\)范围中的每一个数上 等价于

\(d_l\) + k

\(d_i(l<i<r+1)\) + d

\(d_{r+1}\) - k + (r-l)*d

对于第二个操作,我们对差分数组求一遍前缀和就可以了

因此本题就是一个线段树的模板题


AC_CODE

#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = a; i <= b; i ++ )
using namespace std; typedef long long LL; const int N = 1e5 + 10; int n, m;
int arr[N], a[N]; struct Node {
int l, r;
LL val, add;
}tr[N * 4]; void pushup(int u) {
tr[u].val = tr[u << 1].val + tr[u << 1 | 1].val;
} void pushdown(int u) {
Node &root = tr[u], &ls = tr[u << 1], &rs = tr[u << 1 | 1];
ls.add += root.add, ls.val += 1LL * root.add * (ls.r - ls.l + 1);
rs.add += root.add, rs.val += 1LL * root.add * (rs.r - rs.l + 1);
root.add = 0;
} void build(int u, int l, int r) {
if(l == r) {
tr[u] = {l, r, a[l]};
}
else {
tr[u] = {l, r};
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
} void update(int u, int l, int r, int d) {
if(tr[u].l >= l && tr[u].r <= r) {
tr[u].add += d;
tr[u].val += 1LL * (tr[u].r - tr[u].l + 1) * d;
}
else {
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
if(l <= mid) update(u << 1, l, r, d);
if(r > mid) update(u << 1 | 1, l, r, d);
pushup(u);
}
} LL query(int u, int l, int r) {
if(tr[u].l >= l && tr[u].r <= r) {
return tr[u].val;
}
else {
pushdown(u);
int mid = tr[u].l + tr[u].r >> 1;
LL res = 0;
if(l <= mid) res = query(u << 1, l, r);
if(r > mid) res += query(u << 1 | 1, l, r);
return res;
}
} void solve() {
cin >> n >> m;
for(int i = 1; i <= n; i ++ ) {
cin >> arr[i];
a[i] = arr[i] - arr[i - 1];
}
build(1, 1, n); int op, l, r, d, k; while(m -- ) {
cin >> op;
if(op == 1) {
cin >> l >> r >> k >> d;
update(1, l, l, k);
if(l < r) //注意边界 (被卡了一个多小时
update(1, l + 1, r, d);
int p = 0 - k - (r - l) * d;
if(r != n) //同上 qwq
update(1, r + 1, r + 1, p);
}
else {
scanf("%d", &k);
printf("%lld\n", query(1, 1, k));
}
}
} signed main()
{
solve();
return 0;
}

Luogu P1438无聊的数列的更多相关文章

  1. [luogu P1438] 无聊的数列

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

  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. Game(hdu5218)

    Game  Accepts: 138  Submissions: 358  Time Limit: 2000/1000 MS (Java/Others)  Memory Limit: 131072/1 ...

  2. Misaki's Kiss again(hdu5175)

    Misaki's Kiss again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  3. 小小明系列故事——游戏的烦恼(hdu 4517)

    小小明系列故事--游戏的烦恼 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)To ...

  4. Mind the Box: $\ell_1$-APGD for Sparse Adversarial Attacks on Image Classifiers

    目录 概 主要内容 Croce F. and Hein M. Mind the box: \(\ell_1\)-APGD for sparse adversarial attacks on image ...

  5. 使用pynput同时监听鼠标和键盘

    pynput概述 pynput是一个基于python的,能够监听和控制鼠标和键盘的第三方库. pynput主要包括两个类,pynput.mouse和pynput.keyboard,顾名思义,前者可以用 ...

  6. 《MySQL数据操作与查询》- 综合项目 - 航空售票系统

    Mysql & SqlServer综合项目需求 1.系统整体功能 系统需支持以下功能: 维护客户信息.航班信息和票务信息 支持客户按多种条件组合查询航班信息和票务信息 支持客户根据票务信息订购 ...

  7. SSH公/私秘钥的生成及使用

    如果使用GitHub比较多的朋友,对SSH Key肯定也不陌生,当我们SSH进行代码的pull&push时,往往需要我们配置SSH Key. 如果Linux用的多朋友,肯定对SSH Key都很 ...

  8. svn创建多个版本库

    mkdir /pangbing cd /pangbing/ svnadmin create 1 svnadmin create 2 svnadmin create3 启动时候这样启动 svnserve ...

  9. django中写入数据时给密码加密

    方法一.在自定义的form表单中重写save方法: 方法二.使用信号量来实现 1. 在应用的模块下新建signal.py文件 2.编写回调函数,内容如下: 3. 在应用的app.py文件中的ready ...

  10. Flask_获取请求信息(三)

    引用request的方法: from flask import request 与Django不同的是,flask是不需要将request对象作为第一个参数传入视图函数,他的request对象是来自于 ...