WA了最后三个点 求助
查看原帖
WA了最后三个点 求助
113326
DLSINNOCENCE楼主2020/10/24 20:27

rt,救救孩子吧,调的心态炸了

#include<bits/stdc++.h>
using namespace std;
int n;
struct Tree{
	long long l,r,sum,lazytag;
}tree[200001<<2];
int a[200005<<2];
inline int leftson(int p){return p<<1;}
inline int rightson(int p){return (p<<1)|1;}
void push_down(int i){
	if(tree[i].lazytag!=0){
		tree[leftson(i)].lazytag+=tree[i].lazytag;
		tree[rightson(i)].lazytag+=tree[i].lazytag;
		tree[leftson(i)].sum+=tree[i].lazytag*(tree[leftson(i)].r-tree[leftson(i)].l+1);
		tree[rightson(i)].sum+=tree[i].lazytag*(tree[rightson(i)].r-tree[rightson(i)].l+1);
		tree[i].lazytag=0;
	}
	return;
}
void push_up(int i){
	tree[i].sum=tree[leftson(i)].sum+tree[rightson(i)].sum;
}
inline int search(int i,int l,int r){
	if(tree[i].l>=l&&tree[i].r<=r) return tree[i].sum;
	if(tree[i].r<l||tree[i].l>r) return 0;
	push_down(i);
	int s=0;
	push_up(i);
	s+=search(leftson(i),l,r);
	s+=search(rightson(i),l,r);
	return s;
}
void add(int i,int l,int r,int k){
	if(tree[i].l>r||tree[i].r<l) return;
	if(tree[i].r<=r&&tree[i].l>=l){
		tree[i].sum+=k*(tree[i].r-tree[i].l+1);
		tree[i].lazytag+=k;
		return ; 
	}
	push_down(i);
	add(leftson(i),l,r,k);
	add(rightson(i),l,r,k);
	push_up(i);
	return ;
}
inline void build(int i,int l,int r){
	tree[i].l=l,tree[i].r=r;
	if(l==r){
		tree[i].sum=a[l];
		return ;
	}
	int mid=l+r>>1;
	build(leftson(i),l,mid);
	build(rightson(i),mid+1,r);
	push_up(i);
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int command;
		scanf("%d",&command);
		if(command==1){
			int x,y,k;
			scanf("%d%d%d",&x,&y,&k);
			add(1,x,y,k);
		}
		if(command==2){
			int x,y;
			scanf("%d%d",&x,&y);
			cout<<search(1,x,y)<<endl;
		}
	}
}
2020/10/24 20:27
加载中...