Luogu P1438无聊的数列
洛谷 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无聊的数列的更多相关文章
- [luogu P1438] 无聊的数列
[luogu P1438] 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个 ...
- 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
题目传送门 题目大意:维护一个序列,维护区间加等差数列,单点查询的操作. 首先我们肯定是要用线段树来维护了,按照一般的思维局限,我选择了维护序列中的值,但是区间修改的时候由于公差的存在,所以区间修改有 ...
随机推荐
- 3998 - Prime k-tuple
{p1,..., pk : p1 < p2 <...< pk} is called a prime k -tuple of distance s if p1, p2,..., pk ...
- 1142 - Summing up Powers (II)
1142 - Summing up Powers (II) PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit ...
- Go package(3):io包介绍和使用
IO 操作的基本分类 在计算机中,处理文件和网络通讯等,都需要进行 IO 操作,IO 即是 input/ouput,计算机的输入输出操作. Go语言中的 IO 操作封装在如下几个包中: io 为 IO ...
- CapstoneCS5265设计替代CH7211 |Type-C转HDMI2.0方案|替代CH7211
龙迅Chrontel的CH7211是一款Type-C转HDMI2.0半导体设备,可通过USB Type-C连接器将DisplayPort信号转换为HDMI/DVI.这款创新的基于USB Type-C的 ...
- 使用 IE 或Chrome等浏览器,通过网络抓包的形式,查看发送请求时的网络
要求: 使用 IE 或Chrome等浏览器,通过网络抓包的形式,查看发送请求时的网络 实现步骤: 1.打开 IE 浏览器,选择"开发者工具",切换到"网络"标签 ...
- 微信公众号开发--.net core接入
.net进行微信公众号开发的例子好像比较少,这里做个笔记 首先,我们需要让微信能访问到我们的项目,所以要么需要有一个可以部署项目的连接到公网下的服务器,要么可以通过端口转发将请求转发到我们的项目,总之 ...
- exit hook
之前经常改 malloc_hook , realloc_hook,free_hook 为 one_gadget 来 get shell ,最近看到一种利用是改 exit hook(winmt师傅告诉我 ...
- Spring Cloud Eureka源码分析之心跳续约及自我保护机制
Eureka-Server是如何判断一个服务不可用的? Eureka是通过心跳续约的方式来检查各个服务提供者的健康状态. 实际上,在判断服务不可用这个部分,会分为两块逻辑. Eureka-Server ...
- python 用字典进行计数的三种常用方法
1.常规方法 初始化一个字典,遍历列表或字符串,如果遍历的值已经存在于字典中,则字典值直接加1,否则,令字典键为当前遍历的值,字典值为1, 代码如下: >>> dic = {} &g ...
- 初识python: 生成器
生成器定义理解,直接上代码: #!/user/bin env python # author:Simple-Sir # time:20181005 # 生成器 ''' # 列表生成式 a=[i for ...