A 题解 洛谷P1438
全程独立思考的情况下过的第一道蓝,肥肠激动,写个题解?
题目要实现的功能,在题目描述里写得很清楚
- 给要维护的序列的一部分加上一个等差数列 (区间修改)
- 查询这个序列某个位置的值 (单点查询)
作者只会打线段树1,完全不会这么复杂的区间修改,怎么办?
大概的思路就是给他降维打击,把复杂的区间修改变成简单的区间修改,同时也不能让查询变得太麻烦了。
自然而然地,我们就想到差分,先随便造一组数看看差分以后是啥情况。
原序列为 ,差分序列为 。
记等差数列为 ,其中:
将 加上
得到:
对上式推广可以发现,在原序列 加上一个等差数列可以转化为对差分序列 进行一系列操作:
我们还知道:
所以只需要通过线段树求出 就可以应付单点查询。
以下是代码,欢迎各位dl指正
点击查看代码
#include <bits/stdc++.h>
#define N signed(1e5+2)
#define cycle(i,a,b) for(int i=a;i<=b;i++)
#define mid (l+r>>1)
#define cnt (r-l+1)
#define int long long
using namespace std;
struct node{
int val=0;
int lazy=0;
node* ls=nullptr;
node* rs=nullptr;
void pushup(){
val=ls->val+rs->val;
}
void dn(int l,int r,int k){
lazy+=k;
val+=cnt*k;
}
void pushdn(int l,int r){
ls->dn(l,mid,lazy);
rs->dn(mid+1,r,lazy);
lazy=0;
}
};
int a[N],diff[N];
int n,m,x,y,k,d,ord,p,L,R,val;
node* root;
inline int read(){
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
}
node* build(int l,int r){
node* pos=new node;
if(l==r) pos->val=diff[l];
else{
pos->ls=build(l,mid);
pos->rs=build(mid+1,r);
pos->pushup();
}
return pos;
}
void update(int l,int r,node* now){
if(L>R) return;
if(r<L||R<l)return;
if(L<=l&&r<=R) now->dn(l,r,val);
else{
now->pushdn(l,r);
if(L<=mid) update(l,mid,now->ls);
if(R>mid) update(mid+1,r,now->rs);
now->pushup();
}
}
int query(int l,int r,node* now){
if(R<l||r<L) return 0;
if(L<=l&&r<=R) return now->val;
else{
now->pushdn(l,r);
int ql=query(l,mid,now->ls);
int qr=query(mid+1,r,now->rs);
now->pushup();
return ql+qr;
}
}
signed main(){
n=read(),m=read();
cycle(i,1,n){
cin>>a[i];
diff[i]=a[i]-a[i-1];
}
root=build(1,n);
cycle(i,1,m){
ord=read();
if(ord==1){
x=read(),y=read(),k=read(),d=read();
L=x,R=x,val=k;
update(1,n,root);
L=x+1,R=y,val=d;
update(1,n,root);
L=y+1,R=y+1,val=-k-(y-x)*d;
update(1,n,root);
}else{
p=read();
L=1,R=p;
cout<<query(1,n,root)<<endl;
}
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现