关于线段树
  • 板块学术版
  • 楼主pencil
  • 当前回复7
  • 已保存回复7
  • 发布时间2021/7/19 21:11
  • 上次更新2023/11/4 14:07:43
查看原帖
关于线段树
137723
pencil楼主2021/7/19 21:11
#include<bits/stdc++.h>
using namespace std;
long int in[401000];
struct errer{
	int r,l,lz=-1,sum=0;
}a[400100];
long int read(){
	int zf=1,az=getchar(),zhi=0;
	if(az<='0'||az>='9'){
		if(az=='-')
		zf=-1;
		az=getchar();
	}
	
	while(az>='0'&&az<='9'){
		zhi=zhi*10+az-'0';
		az=getchar();
	}
	return zhi*zf;
}
void jian(int wz,int z,int y){
	if(z==y){
		a[wz].sum=in[z];
		return ; 
	}
	a[wz].l=z;a[wz].r=y;
	int mid=(z+y)/2;
	jian(wz*2,z,mid);
	jian(wz*2+1,mid+1,y);
	a[wz].sum=a[wz*2].sum+a[wz*2+1].sum;
	return;
}
void jia(int wz,int z,int y,int zhi){
	if(a[wz].l<z||a[wz].r>y)
	return;
	if(a[wz].l>=z&&a[wz].r<=y){
		a[wz].lz=zhi;
		return;
	}
	int mid=(z+y)/2;
	if(a[wz].l>z&&a[wz*2].r<y)
	jia(wz*2,z,mid,zhi);
	if(a[wz].l<y&&a[wz*2+1].l>z)
	jia(wz*2+1,mid+1,y,zhi);
}
void tui(int wz){
	if(a[wz*2].lz==-1) a[wz*2].lz=a[wz].lz;
	else a[wz*2].lz+=a[wz].lz;
	if(a[wz*2+1].lz==-1) a[wz*2+1].lz=a[wz].lz;
	else a[wz*2+1].lz+=a[wz].lz;
}
int qiu(int wz,int z,int y){
	if(a[wz].r<z&&a[wz].l>y) return 0;
	if(a[wz].r>=z&&a[wz].l<=y){
		if(a[wz].lz==-1)
		return a[wz].sum;
		else
		return a[wz].lz*(a[wz].l-a[wz].r+1)+a[wz].sum;
	} 
	tui(wz);
	int mid=(z+y)/2;
	return qiu(wz*2,z,mid)+qiu(wz*2+1,mid+1,y);
}

int main() {
	long long int i,n,m,op=0;
	n=read();
	m=read();
	for(i=1;i<=n;i++)
	in[i]=read();
	jian(1,1,n);
	for(i=1;i<=m;i++){
		op=read();
		int x=read(),y=read(),z;
		if(op==1){
		z=read();
			jia(1,x,y,z);
		}
		if(op==2){
			cout<<qiu(1,x,y)<<endl;
		}
	}
	return 0;
}

我是不是打了很多没用的判断

2021/7/19 21:11
加载中...