捞,玄关
  • 板块灌水区
  • 楼主Contain_Thunder
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/12 19:27
  • 上次更新2024/8/12 20:36:00
查看原帖
捞,玄关
906916
Contain_Thunder楼主2024/8/12 19:27

P3372 【模板】线段树 1

线段树写挂了不知道哪错,求条

#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;
}
2024/8/12 19:27
加载中...