社区讨论

捞,玄关

灌水区参与者 3已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@lzqwx88g
此快照首次捕获于
2024/08/12 19:30
2 年前
此快照最后确认于
2024/08/12 20:36
2 年前
查看原帖
P3372 【模板】线段树 1
线段树写挂了不知道哪错,求条
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline void read(int &x){
	x=0;char v=getchar();
	while(v<'0'||v>'9') v=getchar();
	while(v>='0'&&v<='9') x=(x<<1)+(x<<3)+(v&15),v=getchar();
}
int n,m,a[1000010],tree[1000010],laz[1000010];
void build(int l,int r,int p){
	if(l==r){
		tree[p]=a[l];
		return ;
	}
	int m=l+((r-l)>>1);
	build(l,m,p*2);
	build(m+1,r,p*2+1);
	tree[p]=tree[p*2]+tree[p*2+1];
	return ;
}
void update(int l,int r,int c,int s,int t,int p){
	if(l<=s&&r>=t){
		tree[p]+=(t-s+1)*c,laz[p]+=c;
		return ;
	} 
	int m=s+((t-s)>>1);
	if(laz[p]&&l!=r){
		laz[p*2]+=laz[p]*(m-s+1),laz[p*2+1]+=laz[p]*(t-m);
		laz[p*2]+=laz[p],laz[p*2+1]+=laz[p];
		laz[p]=0;
	}
	if(l<=m) update(l,r,c,s,m,p*2);
	if(r>m) update(l,r,c,m+1,t,p*2+1);
	tree[p]=tree[p*2]+tree[p*2+1];
	return;
}
int get(int l,int r,int s,int t,int p){
	if(l<=s&&r>=t){
		return tree[p];
	}
	int m=s+((t-s)>>1);
	if(laz[p]){
		tree[p*2]+=laz[p]*(m-s+1),laz[p*2+1]+=laz[p]*(t-m);
		laz[p*2]+=laz[p],laz[p*2+1]+=laz[p];
		laz[p]=0;
	}
	int sum=0;
	if(l<=m) sum+=get(l,r,s,m,p*2);
	if(r>m) sum+=get(l,r,m+1,t,p*2+1);
	return sum;
}
signed main(){
	read(n),read(m);
	for(int i=1;i<=n;i++) read(a[i]);
	build(1,n,1);
	int x,y,z,w;
	for(int i=1;i<=m;i++){
		read(x),read(y),read(z);
		if(x==2){
			cout<<get(y,z,1,n,1)<<endl;
		}else{
			read(w);
			update(y,z,w,1,n,1); 
		}
	}
	return 0;
}

回复

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

正在加载回复...