线段树过了样例但提交只有20分,求调
查看原帖
线段树过了样例但提交只有20分,求调
350909
膜拜陈桉大佬楼主2022/11/21 19:41

谢谢!

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define ll long long 
using namespace std;
ll n,m;
ll a[100020];
struct node{
	ll l,r,lz,mx;
}tree[400020];
void build (int k,int l,int r){
	tree[k].l=l;
	tree[k].r=r;
	tree[k].lz=0;
	tree[k].mx=0;
	if(l==r){
		tree[k].mx=a[l];
		return;
	}
	int mid,lc,rc;
	lc=2*k;
	rc=2*k+1;
	mid=l+(r-l)/2;
	build(lc,l,mid);
	build(rc,mid+1,r);
	tree[k].mx=tree[lc].mx+tree[rc].mx;
}
void lazy(int k,int v){
	tree[k].mx+=v*(tree[k].r-tree[k].l+1);
	tree[k].lz+=v;
}
void pushdown(int k){
	int mid,lc,rc;
	lc=2*k;
	rc=2*k+1;
	mid=(tree[k].l+tree[k].r)/2;
	tree[lc].mx=tree[lc].mx+tree[k].lz*(mid-tree[k].l+1);
	tree[lc].lz=tree[k].lz;
	tree[rc].mx=tree[rc].mx+tree[k].lz*(tree[k].r-mid);
	tree[rc].lz=tree[k].lz;
	tree[k].lz=0;
}
void update(int k,int l,int r,int v){
	if(tree[k].l>=l&&tree[k].r<=r){
		lazy(k,v);return;
	}
	if(tree[k].lz!=0)pushdown(k);
	int mid,lc,rc;
	lc=2*k;
	rc=2*k+1;
	mid=(tree[k].l+tree[k].r)/2;
	if(tree[lc].r>=l)update(lc,l,r,v);
	if(tree[rc].l<=r)update(rc,l,r,v);
	tree[k].mx=tree[lc].mx+tree[rc].mx;
	
}
int query(int k,int l,int r){
	ll sum=0;
	if(tree[k].l>=l&&tree[k].r<=r){
		sum+=tree[k].mx;
		return tree[k].mx;
	}
	if(tree[k].lz!=0)pushdown(k);
	int mid,lc,rc;
	lc=2*k;
	rc=2*k+1;
	mid=(tree[k].l+tree[k].r)/2;
	
	if(tree[lc].r>=l)sum+=query(lc,l,r);
	if(tree[rc].l<=r)sum+=query(rc,l,r);
	return sum;
}
int main(){
	int f,x,y,k;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		
		cin>>f;
		if(f==1){
			cin>>x>>y>>k;
			update(1,x,y,k);
		}
		else if(f==2){
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}
2022/11/21 19:41
加载中...