社区讨论
9分,求调,玄关(线段树差分)
P1438无聊的数列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mjschyr4
- 此快照首次捕获于
- 2025/12/30 16:48 2 个月前
- 此快照最后确认于
- 2026/01/02 14:05 2 个月前
CPP
#include<bits/stdc++.h>
#define int long long
#define lson l , m , rt << 1
#define rson m+1 , r , rt << 1 | 1
using namespace std;
const int maxn = 111111;
int sum[maxn<<2],lazy[maxn<<2],a[maxn];
int n,q,op,x,y,k,d;
void pushdown(int l,int r,int rt){//下放
if(lazy[rt]==0){
return;
}
int m=(l+r)>>1;
sum[rt<<1]+=(m-l+1)*lazy[rt];
sum[rt<<1|1]+=(r-m)*lazy[rt];
lazy[rt<<1]+=lazy[rt];
lazy[rt<<1|1]+=lazy[rt];
lazy[rt]=0;
}
void pushup(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt){
if(l==r){
sum[rt]=a[l];
return;
}
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
void update(int L,int R,int l,int r,int rt,int add){//qujianjia
if(L<=l&&r<=R){
sum[rt]+=(r-l+1)*add;
lazy[rt]+=add;
return;
}
pushdown(l,r,rt);
int m=(l+r)>>1;
if(L<=m){
update(L,R,lson,add);
}
if(R>m){
update(L,R,rson,add);
}
pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
pushdown(l,r,rt);
int m=(l+r)>>1,ans=0;
if(L<=m){
ans+=query(L,R,lson);
}
if(R>m){
ans+=query(L,R,rson);
}
return ans;
}
signed main(){
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=n-1;i>=0;i--){
a[i+1]=a[i+1]-a[i];
}
build(1,n,1);
for(int i=1;i<=q;i++){
cin>>op;
if(op==1){
cin>>x>>y>>d>>k;
update(x,x,1,n,1,k);
if(x+1<=y) update(x+1,y,1,n,1,d);
if(y<n) update(y+1,y+1,1,n,1,-1*(k+d*(y-x)));
}else{
cin>>x;
cout<<query(1,x,1,n,1)<<endl;
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...