70分求调
查看原帖
70分求调
758391
ymw123456楼主2024/8/7 13:20

线段树写法,后三个数据WA了测评记录

代码

#include <bits/stdc++.h>
using namespace std;
struct no{
	int l,r,b,h;
}a[500005];
int b[100005];
void build(int z,int l,int r){
	a[z].l=l;
	a[z].r=r;
	if(l==r){
		a[z].h=b[l];
		return ;
	}else{
		long long mid=l+r>>1;
		build(z*2,l,mid);
		build(z*2+1,mid+1,r);
		a[z].h=a[z*2].h+a[z*2+1].h;
		return ;
	}
}
void dow(int z){
	if(a[z].b!=0){
		a[z*2].b+=a[z].b;
		a[z*2+1].b+=a[z].b;
		long long mid=(a[z].l+a[z].r)/2;
		a[z*2].h+=a[z].b*(mid-a[z*2].l+1);
		a[z*2+1].h+=a[z].b*(a[z*2+1].r-mid);
		a[z].b=0;
	}
	return ;
}
int find(int z,int l,int r){
	if(l<=a[z].l&&a[z].r<=r){
		return a[z].h;
	}
	if(a[z].r<l || a[z].l>r){
		return 0;
	}
	dow(z);
	//long long mid=(a[z].l+a[z].r)/2;
	int s=0;
    if(a[z*2].r>=l){
    	s+=find(z*2,l,r);
    }  
    if(a[z*2+1].l<=r){
    	s+=find(z*2+1,l,r);
    }  
    return s;
}
int add(int z,int l,int r,int k){
	if(l<=a[z].l&&a[z].r<=r){
		a[z].b+=k;
		a[z].h+=k*(a[z].r-a[z].l+1);
		return 0;
	}
	dow(z);
	long long mid=(a[z].l+a[z].r)/2;
	if(a[z*2].r>=l){
    	add(z*2,l,r,k);
    }  
    if(a[z*2+1].l<=r){
    	add(z*2+1,l,r,k);
    }
    a[z].h=a[z*2].h+a[z*2+1].h;
    return  0;
}

int  main(){
//	freopen("a.in","r",stdin);
//	freopen("a.out","w",stdout);
	long long n,m;
	scanf("%lld%lld",&n,&m);
	for(long long i=1;i<=n;i++){
		scanf("%lld",&b[i]);
	}
	build(1,1,n);
//	for(int i=0;i<4*n;i++){
//		printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
//	}
	for(long long i=1;i<=m;i++){
		long long ac;
		scanf("%lld",&ac);
		if(ac==1){
			long long x,y,k;
			scanf("%lld%lld%lld",&x,&y,&k);
			add(1,x,y,k);
//				for(int i=0;i<4*n;i++){
//		printf("%d %d %d \n",a[i].l,a[i].r,a[i].h);
//	}
		}else{
			long long x,y;
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",find(1,x,y));
		}
	}
	return 0;
}
2024/8/7 13:20
加载中...