求助线段树,全wa了,定给您点关注
  • 板块P2357 守墓人
  • 楼主Addrian
  • 当前回复7
  • 已保存回复7
  • 发布时间2022/5/30 19:40
  • 上次更新2023/10/28 00:16:07
查看原帖
求助线段树,全wa了,定给您点关注
421128
Addrian楼主2022/5/30 19:40
#include<iostream>
using namespace std;
const int N=800050;
struct node{
	long long l,r,dat,giao=0;
}t[N];
long long n,f,a[N],pd,tou,wei,bian,zhubian,sum,ab;
void build(long long i,int l,int r){
	t[i].l=l;
	t[i].r=r;
	if(l==r){
		t[i].dat=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(i*2,l,mid);
	build(i*2+1,mid+1,r);
	t[i].dat=t[i*2].dat+t[i*2+1].dat;
}
void jia(long long i){
	if(t[i].r<tou||t[i].l>wei) return ;
	if(t[i].l>=tou&&t[i].r<=wei){
		if(t[i].l==t[i].r){
			t[i].dat+=bian;
		}else{
			t[i].giao+=bian;
		}
		return ;
	}
	if(t[i*2].r>=tou)jia(i*2);
	if(t[i*2+1].l<=wei)jia(i*2+1);//
	t[i].dat=t[i*2].dat+t[i*2+1].dat;
	t[i].dat+=t[i*2].giao*(t[i*2].r-t[i*2].l+1)+t[i*2+1].giao*(t[i*2+1].r-t[i*2+1].l+1);
}
void cha(long long i){
	if(t[i].r<tou||t[i].l>wei) return ;
	if(t[i].l>=tou&&t[i].r<=wei){
		sum+=t[i].dat+t[i].giao*(t[i].r-t[i].l+1);
		return ;
	}
	if(t[i].giao!=0){
		t[i*2].giao+=t[i].giao;
		t[i*2+1].giao+=t[i].giao;
		t[i].dat+=t[i].giao*(t[i].r-t[i].l+1);
		t[i].giao=0;
	}
	if(t[i*2].r>=tou)cha(i*2);
	if(t[i*2+1].l<=wei)cha(i*2+1);
}
int main(){
	cin>>n>>f;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=f;i++){
		cin>>pd;
		if(pd==1){
			cin>>tou>>wei>>bian;
			if(tou==1){
				ab+=bian;
			}
			jia(1);
		}
		if(pd==2){
			cin>>bian;
			zhubian=zhubian+bian;
		}
		if(pd==3){
			cin>>bian;
			zhubian=zhubian-bian;
		}
		if(pd==4){
			cin>>tou>>wei;
			sum=0;
			cha(1);
			if(tou==1){
				sum+=zhubian;
			}
			cout<<sum;
		}
		if(pd==5){
			cout<<a[1]+zhubian+ab;
		}
	}
	return 0;
} 
2022/5/30 19:40
加载中...