社区讨论

9分求调 差分线段树

P1438无聊的数列参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lz0ym11g
此快照首次捕获于
2024/07/25 15:36
2 年前
此快照最后确认于
2024/07/25 16:22
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define MAXN 100005
#define root 1,1,n
#define lson ls(pos),nl,m
#define rson rs(pos),m+1,nr
int n,m,a[MAXN],op;
struct mtree{
	int l,r;
	long long sum,tag;
	bool istag;
}t[MAXN*4];

int ls(int pos){return pos<<1;}
int rs(int pos){return pos<<1|1;}
int len(int l,int r){return r-l+1;}

inline void pushup(int pos){t[pos].sum=t[ls(pos)].sum+t[rs(pos)].sum;}
inline void pushdown(int pos){
	if (t[pos].istag){
		t[ls(pos)].istag=t[rs(pos)].istag=t[pos].istag;
		t[ls(pos)].tag+=t[pos].tag;
		t[rs(pos)].tag+=t[pos].tag;
		t[ls(pos)].sum+=len(t[ls(pos)].l,t[ls(pos)].r)*t[pos].tag;
		t[rs(pos)].sum+=len(t[rs(pos)].l,t[rs(pos)].r)*t[pos].tag;
		t[pos].tag=0,t[pos].istag=false;
	}
}

void tree_build(int pos,int nl,int nr){
	t[pos].l=nl,t[pos].r=nr,t[pos].istag=false,t[pos].tag=t[pos].sum=0;
	if (nl==nr){
		t[pos].sum=a[nl];
		return;
	}
	int m=(nl+nr)>>1;
	tree_build(lson);
	tree_build(rson);
	pushup(pos);
}

void tree_change(int pos,int nl,int nr,int l,int r,long long k){
	if (l<=nl&&nr<=r){
		t[pos].istag=true,t[pos].tag=k,t[pos].sum+=k*len(nl,nr);
		return;
	}
	int m=(nl+nr)>>1;
	pushdown(pos);
	if (l<=m) tree_change(lson,l,r,k);
	if (m<r) tree_change(rson,l,r,k);
	pushup(pos);
}

long long tree_query(int pos,int nl,int nr,int l,int r){
	if (l<=nl&&nr<=r) return t[pos].sum;
	int m=(nl+nr)>>1;
	pushdown(pos);
	long long res=0;
	if (l<=m) res+=tree_query(lson,l,r);
	if (m<r) res+=tree_query(rson,l,r);
	return res;
}
int main(){
	scanf ("%d%d",&n,&m);
	for (int i = 1;i <= n;i ++) scanf ("%d",&a[i]);
	for(int i = n;i > 0 ; i --) a[i]=a[i]-a[i-1];
	tree_build(root);
	int l,r,k,d,p;
	for (int i = 1;i <= m;i ++){
		scanf ("%d",&op);
		if (op==1){
			scanf ("%d%d%d%d",&l,&r,&k,&d);
			if (l+1<=r) tree_change(root,l+1,r,d);
			tree_change(root,l,l,k);
			if (r+1<=n) tree_change(root,r+1,r+1,-(k+d*(r-l)));  
		}else{
			scanf ("%d",&p);
			printf ("%lld\n",tree_query(root,1,p));
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...