P1438 无聊的数列 题解
背景
看到题解都是差分,竟然还有建两颗线段树和二阶差分的大佬。
我感到不理解,很不理解。
题目正解
本题正解很明显就是:线段树
是的,你没有看错,就只有线段树。
很显然我们直接按照线段树板题写就可以了,维护题目需要维护的,注意到只有单点查询,所以我们根本不需要维护区间和,对于区间来讲,我们只用维护修改操作,修改操作只需要 \(k,d\)(首项和公差)。
考虑该操作如何向下传递(pushdown):
- 对于左区间来讲,\(k,d\) 没有改变,直接赋值。
 - 对于右区间来讲,只有 \(k_{right}=k_{father}+len*d\),其中 \(len\) 是左区间长度。
 
此外我们发现:对于同一段区间,修改操作是可以叠加的。
好的,我们做完了,甚至不需要 pushup 操作。
是的,就是这么简单,当区间变成一个点时,我们发现对于这个点的修改就是加上 \(k\)。
AC 代码:
#include<bits/stdc++.h>
using namespace std;
#define N 500000
#define ls rt<<1
#define rs rt<<1|1
int n,m,a[N];
struct tree{
	long long l,r,w,op,k,d;
}tr[N];
void build(int rt,int l,int r){
	tr[rt]={l,r,0,0,0,0};
	if(l==r){
		tr[rt].w=a[l];return ;
	}
	int mid=(l+r)>>1;
	build(ls,l,mid);build(rs,mid+1,r);
}
void pushdown(int rt){
	if(tr[rt].op){
		tr[ls].k+=tr[rt].k;
		tr[ls].d+=tr[rt].d;
		tr[ls].op=1;
		tr[rs].k+=tr[rt].k+(tr[rs].l-tr[ls].l)*tr[rt].d;
		tr[rs].d+=tr[rt].d;
		tr[rs].op=1;
	}
	tr[rt].op=0;
	tr[rt].d=tr[rt].k=0;
}
void update(int rt,int cl,int cr,int k,int d){
	int l=tr[rt].l,r=tr[rt].r;
	if(cl<=l&&r<=cr){
		tr[rt].op=1;
		tr[rt].k+=k+(l-cl)*d;
		tr[rt].d+=d;
		return ;
	}
	pushdown(rt);
	int mid=(l+r)>>1;
	if(cl<=mid) update(ls,cl,cr,k,d);
	if(cr>mid) update(rs,cl,cr,k,d);
}
long long query(int rt,int p){
	int l=tr[rt].l,r=tr[rt].r;
//	printf("|%d %d %d %d %d\n",l,r,tr[rt].d,tr[rt].k,tr[rt].w);
	if(l==r){
		tr[rt].w+=tr[rt].k;
		tr[rt].k=0;tr[rt].d=0;
		return tr[rt].w;
	}
	pushdown(rt);
	int mid=(l+r)>>1;
	if(p<=mid) return query(ls,p);
	else return query(rs,p);
} 
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	while(m--){
		int t,l,r,k,d,p;
		scanf("%d",&t);
		if(t==1){
			scanf("%d%d%d%d",&l,&r,&k,&d);
			update(1,l,r,k,d);
		}else{
			scanf("%d",&p);
			printf("%lld\n",query(1,p));
		}
	}
	return 0;
}
不开 long long 见祖宗!
P1438 无聊的数列 题解的更多相关文章
- 洛谷 P1438 无聊的数列 题解
		
原题链接 首先,我们考虑用差分解决问题. 用 \(x_i\) 表示原数列,\(a_i = x_i - x_{i-1}\) 那么,先普及一下差分: 如果我们只需要维护区间加值,单点求值的话,你会发现两个 ...
 - P1438 无聊的数列 (差分+线段树)
		
题目 P1438 无聊的数列 解析: 先考虑修改,用差分的基本思想,左端点加上首项\(k\),修改区间\((l,r]\)内每个数的差分数组都加上公差\(d\),最后的\(r+1\)再减去\(k+(r- ...
 - P1438 无聊的数列
		
P1438 无聊的数列 链接 分析: 等差数列可加,首项相加,公差相加. 代码: #include<cstdio> #include<algorithm> #include&l ...
 - [luogu P1438] 无聊的数列
		
[luogu P1438] 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个 ...
 - Luogu P1438无聊的数列
		
洛谷 P1438无聊的数列 题目链接 点这里! 题目描述 维护一个数列\(a_i\),支持两种操作: 给出一个长度等于 \(r-l+1\)的等差数列,首项为\(k\) 公差为\(d\) 并将它对应加到 ...
 - 洛谷P1438 无聊的数列 [zkw线段树]
		
题目传送门 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]} ...
 - 洛谷 P1438 无聊的数列
		
题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]},支持两种操作: 1.1 ...
 - [洛谷P1438] 无聊的数列
		
题目类型:差分,线段树 传送门:>Here< 题意:给出一个数列,每次给一个区间对应的加上一个等差数列,并询问某一个元素目前的值. 解题思路 所谓差分,我个人的理解就是用\(O(1)\)的 ...
 - LUOGU P1438 无聊的数列 (差分+线段树)
		
传送门 解题思路 区间加等差数列+单点询问,用差分+线段树解决,线段树里维护的就是差分数组,区间加等差数列相当于在差分序列中l位置处+首项的值,r+1位置处-末项的值,中间加公差的值,然后单点询问就相 ...
 - P1438 无聊的数列 (线段树)
		
题目链接 Solution 直接维护一个差分的线段树就好了. 其中线段树的节点代表 \(r\) 比 \(l\) 多多少. Code #include<bits/stdc++.h> #def ...
 
随机推荐
- 【Excel】VBA编程 01 入门
			
视频地址: https://www.bilibili.com/video/BV1Q5411p71p 在Excel种需要打开[开发工具]和[启用所有宏]两点 打开开发工具选项 宏启用 菜单栏才会有开发工 ...
 - Python Pillow(PIL 第三方模块)和 cv2 (opencv第三方模块)对图片的 resize 操作  (缩放图片大小)
			
PIL 模块的 resize 操作: 1. 从文件中读取图片,然后 resize 大小: import matplotlib.pyplot as plt import numpy as np ...
 - 外网的一个还不错的高性能计算教程:  High Performance Computing
			
地址: https://info.gwdg.de/wiki/doku.php?id=wiki:hpc:start =========================================== ...
 - 【转载】  linux中umask命令介绍
			
版权声明:本文为CSDN博主「立二拆四i」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/weixin_4408 ...
 - 如何关闭NVIDIA显卡的CUDA运算功能
			
基本很少有人会想到要关闭NVIDIA显卡的CUDA计算功能,这东西不想用就不跑cuda代码不就可以了吗,但是作为一个深度学习服务器集群的管理者来说,这个功能还是有用处的.前一阵使用实验室的一台服务器的 ...
 - java多线程之自定义线程池
			
1.背景 线程池.....大家常用.... 自己搞一个,顺便练习一下多线程编程 2.自定义线程代码 2.1.拒绝策略接口 @FunctionalInterface public interface M ...
 - code: 'ERR_OSSL_EVP_UNSUPPORTED' 报错解决
			
报错: Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/h ...
 - StarNet:关于 Element-wise Multiplication 的高性能解释研究 | CVPR 2024
			
论文揭示了star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力.基于此提出了StarNet,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟 来 ...
 - 2024 (ICPC) Jiangxi Provincial 省赛
			
2024 (ICPC) Jiangxi Provincial 省赛 前言 和队友 vp 7t,赛后补了几题. A. Maliang Learning Painting 思路 输出 a + b + c ...
 - disconf分布式配置管理(一) 安装与配置
			
一.背景 在生产部署过程中,遇到以下问题: 1.由于节点较多,每次增量修改配置文件后都需要每个节点替换配置文件. 2.有些动态配置修改后,需要重启服务. 二.解决方案 1.使用linux文件共享配置文 ...