线段树板子70,求调
查看原帖
线段树板子70,求调
374351
olofme1ster楼主2022/8/5 19:49

前七个点AC,后三个点WA掉了:(

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
long long v[N];
int n,cnt=1,m;
struct Node{
	int l,r;
	long long add,val;
}a[N*4];
void build(int k,int l,int r){
	if(l==r){
		a[k].val=v[l];
		return;
	}
	int mid=(l+r)>>1;
	a[k].l=++cnt;
	build(a[k].l,l,mid);
	a[k].r=++cnt;
	build(a[k].r,mid+1,r);
	a[k].val=a[a[k].l].val+a[a[k].r].val;
	return;
}
void addtag(int k,int l,int r,int val){
	a[k].val+=val*(r-l+1);
	a[k].add+=val;
	return;
}
void add(int k,int l,int r,int ql,int qr,int val){
	if(ql==l&&qr==r){
		addtag(k,l,r,val);
		return;
	}
	int mid=(l+r)>>1;
	addtag(a[k].l,l,mid,a[k].add);
	addtag(a[k].r,mid+1,r,a[k].add);
	a[k].add=0;
	if(qr<=mid)
		add(a[k].l,l,mid,ql,qr,val);
	else if(ql>mid)
		add(a[k].r,mid+1,r,ql,qr,val);
	else{
		add(a[k].l,l,mid,ql,mid,val);
		add(a[k].r,mid+1,r,mid+1,qr,val);
	}
	a[k].val=a[a[k].l].val+a[a[k].r].val;
	return;
}
int Query(int k,int l,int r,int ql,int qr){
	if(l==ql&&r==qr)
		return a[k].val;
	int mid=(l+r)>>1;
	addtag(a[k].l,l,mid,a[k].add);
	addtag(a[k].r,mid+1,r,a[k].add);
	a[k].add=0;
	int ret=0;
	if(qr<=mid)
		ret=Query(a[k].l,l,mid,ql,qr);
	else if(ql>mid)
		ret=Query(a[k].r,mid+1,r,ql,qr);
	else	
		ret=Query(a[k].l,l,mid,ql,mid)+Query(a[k].r,mid+1,r,mid+1,qr);
	a[k].val=a[a[k].l].val+a[a[k].r].val;
	return ret;
}
int main(){
	int kind,x,y,k,ans,p;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&v[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		scanf("%d",&kind);
		if(kind==1){
			scanf("%d%d%d",&x,&y,&k);
			add(1,1,n,x,y,k);
		}	
		if(kind==2){
			scanf("%d%d",&x,&y);
			ans=Query(1,1,n,x,y);
			printf("%d\n",ans);
		}
	}
	return 0;
}
2022/8/5 19:49
加载中...