社区讨论

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 条回复,欢迎继续交流。

正在加载回复...